Pārlūkot izejas kodu

Separate viewFromXML to createViewFromXML

viewFromXML was confusing, it was doing "caching of" and "creating" views.
The method is now split in two. Derived classes should simply overwrite
createViewFromXML()
Julien Finet 10 gadi atpakaļ
vecāks
revīzija
02fa38b9b4

+ 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;
     }
 };