Quellcode durchsuchen

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 vor 10 Jahren
Ursprung
Commit
02fa38b9b4
2 geänderte Dateien mit 56 neuen und 24 gelöschten Zeilen
  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)
 ctkLayoutViewFactoryPrivate::ctkLayoutViewFactoryPrivate(ctkLayoutViewFactory& object)
   : q_ptr(&object)
   : q_ptr(&object)
-  , UseCachedViews(false)
+  , UseCachedViews(true)
   , NumberOfViewsInCurrentLayout( 0 )
   , NumberOfViewsInCurrentLayout( 0 )
 {
 {
 }
 }
@@ -147,20 +147,47 @@ QWidget* ctkLayoutViewFactory::viewFromXML(QDomElement layoutElement)
     QWidget* view = d->Views[d->NumberOfViewsInCurrentLayout].second;
     QWidget* view = d->Views[d->NumberOfViewsInCurrentLayout].second;
     return view;
     return view;
     }
     }
+  return this->createViewFromXML(layoutElement);
+}
+
+//-----------------------------------------------------------------------------
+QWidget* ctkLayoutViewFactory::createViewFromXML(QDomElement layoutElement)
+{
   return 0;
   return 0;
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 QList<QWidget*> ctkLayoutViewFactory::viewsFromXML(QDomElement layoutElement)
 QList<QWidget*> ctkLayoutViewFactory::viewsFromXML(QDomElement layoutElement)
 {
 {
+  Q_D(ctkLayoutViewFactory);
   QWidgetList views = this->registeredViews(layoutElement);
   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;
   return views;
 }
 }
@@ -229,7 +256,7 @@ void ctkLayoutViewFactory::unregisterView(QWidget* view)
 {
 {
   Q_D(ctkLayoutViewFactory);
   Q_D(ctkLayoutViewFactory);
   for (QDomElement viewElement = this->layoutElement(view);
   for (QDomElement viewElement = this->layoutElement(view);
-       viewElement.isNull() ;
+       !viewElement.isNull();
        viewElement = this->layoutElement(view))
        viewElement = this->layoutElement(view))
     {
     {
     this->unregisterView(viewElement, view);
     this->unregisterView(viewElement, view);

+ 23 - 18
Libs/Widgets/ctkLayoutViewFactory.h

@@ -32,18 +32,18 @@ class QWidgetItem;
 class ctkLayoutViewFactoryPrivate;
 class ctkLayoutViewFactoryPrivate;
 
 
 /// \ingroup Widgets
 /// \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.
 /// specific view XML element from ctkLayoutManager.
 /// See ctkTemplateLayoutViewFactory for a factory that can instantiate
 /// See ctkTemplateLayoutViewFactory for a factory that can instantiate
 /// any Qt widget.
 /// 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.
 /// being overwritten.
-/// \sa ctkLayoutManager, ctkTemplateLayoutViewFactory
+/// \sa ctkLayoutManager, ctkTemplateLayoutViewFactory, createViewFromXML()
 class CTK_WIDGETS_EXPORT ctkLayoutViewFactory: public QObject
 class CTK_WIDGETS_EXPORT ctkLayoutViewFactory: public QObject
 {
 {
   Q_OBJECT
   Q_OBJECT
   /// This property controls whether the views are cached and reused
   /// 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()
   /// \sa useCachedViews(), setUseCachedViews()
   Q_PROPERTY(bool useCachedViews READ useCachedViews WRITE setUseCachedViews);
   Q_PROPERTY(bool useCachedViews READ useCachedViews WRITE setUseCachedViews);
 public:
 public:
@@ -87,10 +87,13 @@ public:
   /// \sa viewsFromXML()
   /// \sa viewsFromXML()
   virtual void setupView(QDomElement layoutElement, QWidget* view);
   virtual void setupView(QDomElement layoutElement, QWidget* view);
   /// Virtual method that returns a widget from a "view" layout element.
   /// 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.
   /// 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 QWidget* viewFromXML(QDomElement layoutElement);
   /// Virtual method that returns a list of widgets from a "view" layout
   /// Virtual method that returns a list of widgets from a "view" layout
   /// element.
   /// element.
@@ -99,10 +102,9 @@ public:
   /// widget.
   /// widget.
   /// The returned widgets will automatically be layout into their parent
   /// The returned widgets will automatically be layout into their parent
   /// layout (e.g. boxlayout).
   /// 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);
   virtual QList<QWidget*> viewsFromXML(QDomElement layoutElement);
 
 
   /// Return all the widgets that have been registered.
   /// Return all the widgets that have been registered.
@@ -112,6 +114,14 @@ public:
 protected:
 protected:
   QScopedPointer<ctkLayoutViewFactoryPrivate> d_ptr;
   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
   /// Return the list of widgets that have already been created by
   /// view(s)FromXML().
   /// view(s)FromXML().
   /// \sa registerView(), unregisterView()
   /// \sa registerView(), unregisterView()
@@ -169,13 +179,8 @@ public:
   {
   {
     this->setUseCachedViews(true);
     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;
     }
     }
 };
 };