Browse Source

Merge branch 'add-ctklayoutviewfactory'

* add-ctklayoutviewfactory:
  Separate viewFromXML to createViewFromXML
Julien Finet 10 years ago
parent
commit
95039e80c4
2 changed files with 56 additions and 24 deletions
  1. 33 6
      Libs/Widgets/ctkLayoutViewFactory.cpp
  2. 23 18
      Libs/Widgets/ctkLayoutViewFactory.h

+ 33 - 6
Libs/Widgets/ctkLayoutViewFactory.cpp

@@ -48,7 +48,7 @@ protected:
 //-----------------------------------------------------------------------------
 ctkLayoutViewFactoryPrivate::ctkLayoutViewFactoryPrivate(ctkLayoutViewFactory& object)
   : q_ptr(&object)
-  , UseCachedViews(false)
+  , UseCachedViews(true)
   , NumberOfViewsInCurrentLayout( 0 )
 {
 }
@@ -147,20 +147,47 @@ QWidget* ctkLayoutViewFactory::viewFromXML(QDomElement layoutElement)
     QWidget* view = d->Views[d->NumberOfViewsInCurrentLayout].second;
     return view;
     }
+  return this->createViewFromXML(layoutElement);
+}
+
+//-----------------------------------------------------------------------------
+QWidget* ctkLayoutViewFactory::createViewFromXML(QDomElement layoutElement)
+{
   return 0;
 }
 
 //-----------------------------------------------------------------------------
 QList<QWidget*> ctkLayoutViewFactory::viewsFromXML(QDomElement layoutElement)
 {
+  Q_D(ctkLayoutViewFactory);
   QWidgetList views = this->registeredViews(layoutElement);
-  if (views.isEmpty())
+  if (views.count())
     {
-    QWidget* view = this->viewFromXML(layoutElement);
-    if (view)
+    return views;
+    }
+  // The layout element does not match any existing one, however we can just reuse
+  // one that was registered for a different layout element.
+  if (this->useCachedViews() &&
+      d->NumberOfViewsInCurrentLayout >= 0 && 
+      d->NumberOfViewsInCurrentLayout < d->Views.count())
+    {
+    for (int i = d->NumberOfViewsInCurrentLayout; i < d->Views.count(); ++i)
       {
-      views << view;
+      views << d->Views[i].second;
       }
+    return views;
+    }
+  return this->createViewsFromXML(layoutElement);
+}
+
+//-----------------------------------------------------------------------------
+QList<QWidget*> ctkLayoutViewFactory::createViewsFromXML(QDomElement layoutElement)
+{
+  QWidgetList views;
+  QWidget* view = this->createViewFromXML(layoutElement);
+  if (view)
+    {
+    views << view;
     }
   return views;
 }
@@ -229,7 +256,7 @@ void ctkLayoutViewFactory::unregisterView(QWidget* view)
 {
   Q_D(ctkLayoutViewFactory);
   for (QDomElement viewElement = this->layoutElement(view);
-       viewElement.isNull() ;
+       !viewElement.isNull();
        viewElement = this->layoutElement(view))
     {
     this->unregisterView(viewElement, view);

+ 23 - 18
Libs/Widgets/ctkLayoutViewFactory.h

@@ -32,18 +32,18 @@ class QWidgetItem;
 class ctkLayoutViewFactoryPrivate;
 
 /// \ingroup Widgets
-/// ctkLayoutViewFactory is a factory that creates and setups widgets for a
+/// ctkLayoutViewFactory is an abstract class that creates and setups widgets for a
 /// specific view XML element from ctkLayoutManager.
 /// See ctkTemplateLayoutViewFactory for a factory that can instantiate
 /// any Qt widget.
-/// This class is meant to be derived with at least the method viewFromXML()
+/// This class is meant to be derived with at least the method createViewFromXML()
 /// being overwritten.
-/// \sa ctkLayoutManager, ctkTemplateLayoutViewFactory
+/// \sa ctkLayoutManager, ctkTemplateLayoutViewFactory, createViewFromXML()
 class CTK_WIDGETS_EXPORT ctkLayoutViewFactory: public QObject
 {
   Q_OBJECT
   /// This property controls whether the views are cached and reused
-  /// for a different layout. False by default.
+  /// from a previous layout. True by default.
   /// \sa useCachedViews(), setUseCachedViews()
   Q_PROPERTY(bool useCachedViews READ useCachedViews WRITE setUseCachedViews);
 public:
@@ -87,10 +87,13 @@ public:
   /// \sa viewsFromXML()
   virtual void setupView(QDomElement layoutElement, QWidget* view);
   /// Virtual method that returns a widget from a "view" layout element.
-  /// You are ensured that the tagName of the element is "view".
+  /// You are ensured that the tagName of the element is one of the element
+  /// from the supportedElementNames() list.
   /// The XML element can contain an arbitrary number of XML attributes.
-  /// Create the widget if needed or reuse a compatible registered view.
-  /// \sa viewsFromXML(), setupView()
+  /// Returns previously registered or cached view if any, otherwise create
+  /// a new view using createViewFromXML(). Must be reimplemented.
+  /// \sa viewsFromXML(), setupView(), registeredViews(), useCachedView,
+  /// createViewFromXML()
   virtual QWidget* viewFromXML(QDomElement layoutElement);
   /// Virtual method that returns a list of widgets from a "view" layout
   /// element.
@@ -99,10 +102,9 @@ public:
   /// widget.
   /// The returned widgets will automatically be layout into their parent
   /// layout (e.g. boxlayout).
-  /// 
-  /// This method can be reimplemented. By default, returns the associated
-  /// registered views or viewFromXML() if no view was registered.
-  /// \sa viewFromXML()
+  /// Returns previously registered or cached views if any, otherwise create
+  /// new views using createViewsFromXML().
+  /// \sa viewFromXML(), registeredViews(), 
   virtual QList<QWidget*> viewsFromXML(QDomElement layoutElement);
 
   /// Return all the widgets that have been registered.
@@ -112,6 +114,14 @@ public:
 protected:
   QScopedPointer<ctkLayoutViewFactoryPrivate> d_ptr;
 
+  /// Create a new view from a layoutElement. Returns 0 by default
+  /// \sa viewFromXML
+  virtual QWidget* createViewFromXML(QDomElement layoutElement);
+  /// Create new views from a layoutElement. Returns createViewFromXML()
+  /// by default.
+  /// \sa viewsFromXML(), createViewFromXML()
+  virtual QList<QWidget*> createViewsFromXML(QDomElement layoutElement);
+
   /// Return the list of widgets that have already been created by
   /// view(s)FromXML().
   /// \sa registerView(), unregisterView()
@@ -169,13 +179,8 @@ public:
   {
     this->setUseCachedViews(true);
   }
-  virtual QWidget* viewFromXML(QDomElement layoutElement){
-    QWidget* res = this->ctkLayoutViewFactory::viewFromXML(layoutElement);
-    if (!res)
-      {
-      res = new T;
-      }
-    return res;
+  virtual QWidget* createViewFromXML(QDomElement layoutElement){
+    return new T;
     }
 };