Create proxy for layouts and rebase existing layouts to it
authorKevin Krammer <kevin.krammer@kdab.com>
Thu, 18 Oct 2012 13:22:20 +0000 (15:22 +0200)
committerKevin Krammer <kevin.krammer@kdab.com>
Thu, 18 Oct 2012 13:22:20 +0000 (15:22 +0200)
declarativeobjects.cpp
declarativeobjects_p.h

index 152b5cb..4fabcf8 100644 (file)
@@ -238,7 +238,7 @@ QString DeclarativeFormLayoutAttached::label() const
   return d->label;
 }
 
-DeclarativeFormLayout::DeclarativeFormLayout(QObject *parent) : DeclarativeObjectProxy<QFormLayout>(parent)
+DeclarativeFormLayout::DeclarativeFormLayout(QObject *parent) : DeclarativeLayoutProxy<QFormLayout>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
 }
@@ -248,49 +248,41 @@ DeclarativeFormLayoutAttached *DeclarativeFormLayout::qmlAttachedProperties(QObj
   return new DeclarativeFormLayoutAttached(parent);
 }
 
-void DeclarativeFormLayout::dataAppend(QObject *object)
+void DeclarativeFormLayout::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
 {
-  AbstractDeclarativeObject *declarativeObject = dynamic_cast<AbstractDeclarativeObject*>(object);
-  if (declarativeObject) {
-    QObject *attachedProperties = qmlAttachedPropertiesObject<DeclarativeFormLayout>(declarativeObject, false);
-    DeclarativeFormLayoutAttached *properties = qobject_cast<DeclarativeFormLayoutAttached*>(attachedProperties);
-
-    QWidget *widget = qobject_cast<QWidget*>(declarativeObject->object());
-    if (widget) {
-      if (properties) {
-        if (!properties->label().isEmpty()) {
-          m_proxiedObject->addRow(properties->label(), widget);
-          m_children.append(declarativeObject);
-          return;
-        }
-      }
-      m_proxiedObject->addRow(widget);
+  QObject *attachedProperties = qmlAttachedPropertiesObject<DeclarativeFormLayout>(declarativeObject, false);
+  DeclarativeFormLayoutAttached *properties = qobject_cast<DeclarativeFormLayoutAttached*>(attachedProperties);
+  if (properties) {
+    if (!properties->label().isEmpty()) {
+      m_proxiedObject->addRow(properties->label(), widget);
       m_children.append(declarativeObject);
       return;
     }
+  }
+
+  m_proxiedObject->addRow(widget);
+  m_children.append(declarativeObject);
+}
 
-    QLayout *layout = qobject_cast<QLayout*>(declarativeObject->object());
-    if (layout) {
-        if (properties) {
-          if (!properties->label().isEmpty()) {
-            m_proxiedObject->addRow(properties->label(), layout);
-            m_children.append(declarativeObject);
-            return;
-          }
-        }
-        m_proxiedObject->addRow(layout);
-        m_children.append(declarativeObject);
-        return;
+void DeclarativeFormLayout::addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+{
+  QObject *attachedProperties = qmlAttachedPropertiesObject<DeclarativeFormLayout>(declarativeObject, false);
+  DeclarativeFormLayoutAttached *properties = qobject_cast<DeclarativeFormLayoutAttached*>(attachedProperties);
+  if (properties) {
+    if (!properties->label().isEmpty()) {
+      m_proxiedObject->addRow(properties->label(), layout);
+      m_children.append(declarativeObject);
+      return;
     }
   }
-
-  DeclarativeObjectProxy<QFormLayout>::dataAppend(object);
+  m_proxiedObject->addRow(layout);
+  m_children.append(declarativeObject);
 }
 
 CUSTOM_METAOBJECT(DeclarativeFormLayout, QFormLayout)
 
 // DeclarativeHBoxLayout
-DeclarativeHBoxLayout::DeclarativeHBoxLayout(QObject *parent) : DeclarativeBoxLayout<QHBoxLayout>(parent)
+DeclarativeHBoxLayout::DeclarativeHBoxLayout(QObject *parent) : DeclarativeLayoutProxy<QHBoxLayout>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
 }
@@ -316,10 +308,23 @@ void DeclarativeHBoxLayout::addWidget(QWidget *widget, AbstractDeclarativeObject
   m_children.append(declarativeObject);
 }
 
+void DeclarativeHBoxLayout::addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+{
+  int stretch = 0;
+
+  QObject *attachedProperties = qmlAttachedPropertiesObject<DeclarativeHBoxLayout>(declarativeObject, false);
+  DeclarativeBoxLayoutAttached *properties = qobject_cast<DeclarativeBoxLayoutAttached*>(attachedProperties);
+  if (properties)
+    stretch = properties->stretch();
+
+  m_proxiedObject->addLayout(layout, stretch);
+  m_children.append(declarativeObject);
+}
+
 CUSTOM_METAOBJECT(DeclarativeHBoxLayout, QHBoxLayout)
 
 // DeclarativeVBoxLayout
-DeclarativeVBoxLayout::DeclarativeVBoxLayout(QObject *parent) : DeclarativeBoxLayout<QVBoxLayout>(parent)
+DeclarativeVBoxLayout::DeclarativeVBoxLayout(QObject *parent) : DeclarativeLayoutProxy<QVBoxLayout>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
 }
@@ -345,6 +350,19 @@ void DeclarativeVBoxLayout::addWidget(QWidget *widget, AbstractDeclarativeObject
   m_children.append(declarativeObject);
 }
 
+void DeclarativeVBoxLayout::addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+{
+  int stretch = 0;
+
+  QObject *attachedProperties = qmlAttachedPropertiesObject<DeclarativeVBoxLayout>(declarativeObject, false);
+  DeclarativeBoxLayoutAttached *properties = qobject_cast<DeclarativeBoxLayoutAttached*>(attachedProperties);
+  if (properties)
+    stretch = properties->stretch();
+
+  m_proxiedObject->addLayout(layout, stretch);
+  m_children.append(declarativeObject);
+}
+
 CUSTOM_METAOBJECT(DeclarativeVBoxLayout, QVBoxLayout)
 
 //// Widgets ////
index 1d62a72..74de13d 100644 (file)
@@ -162,6 +162,46 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy<T>
     }
 };
 
+template <class T>
+class DeclarativeLayoutProxy : public DeclarativeObjectProxy<T>
+{
+  public:
+    DeclarativeLayoutProxy(QObject *parent = 0) : DeclarativeObjectProxy<T>(parent) {}
+
+  protected:
+    virtual void dataAppend(QObject *object)
+    {
+      AbstractDeclarativeObject *declarativeObject = dynamic_cast<AbstractDeclarativeObject*>(object);
+      if (declarativeObject) {
+        QWidget *widget = qobject_cast<QWidget*>(declarativeObject->object());
+        if (widget) {
+          addWidget(widget, declarativeObject);
+          return;
+        }
+
+        QLayout *layout = qobject_cast<QLayout*>(declarativeObject->object());
+        if (layout) {
+          addLayout(layout, declarativeObject);
+          return;
+        }
+      }
+
+      DeclarativeObjectProxy<T>::dataAppend(object);
+    }
+
+    virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
+    {
+      DeclarativeObjectProxy<T>::m_children.append(declarativeObject);
+      DeclarativeObjectProxy<T>::m_proxiedObject->addWidget(widget);
+    }
+
+    virtual void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+    {
+      DeclarativeObjectProxy<T>::m_children.append(declarativeObject);
+      DeclarativeObjectProxy<T>::m_proxiedObject->addItem(layout);
+    }
+};
+
 //// Objects ///
 class DeclarativeAction : public DeclarativeObjectProxy<QAction>
 {
@@ -206,37 +246,6 @@ class DeclarativeBoxLayoutAttached : public QObject
     Private *const d;
 };
 
-template <class T>
-class DeclarativeBoxLayout : public DeclarativeObjectProxy<T>
-{
-  public:
-    DeclarativeBoxLayout(QObject *parent = 0) : DeclarativeObjectProxy<T>(parent) {}
-
-  protected:
-    virtual void dataAppend(QObject *object)
-    {
-      AbstractDeclarativeObject *declarativeObject = dynamic_cast<AbstractDeclarativeObject*>(object);
-      if (declarativeObject) {
-        QWidget *widget = qobject_cast<QWidget*>(declarativeObject->object());
-        if (widget) {
-          addWidget(widget, declarativeObject);
-          return;
-        }
-
-        QLayout *layout = qobject_cast<QLayout*>(declarativeObject->object());
-        if (layout) {
-          DeclarativeObjectProxy<T>::m_children.append(object);
-          DeclarativeObjectProxy<T>::m_proxiedObject->addLayout(layout);
-          return;
-        }
-      }
-
-      DeclarativeObjectProxy<T>::dataAppend(object);
-    }
-
-    virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) = 0;
-};
-
 class DeclarativeFormLayoutAttached : public QObject
 {
   Q_OBJECT
@@ -258,7 +267,7 @@ class DeclarativeFormLayoutAttached : public QObject
     Private *const d;
 };
 
-class DeclarativeFormLayout : public DeclarativeObjectProxy<QFormLayout>
+class DeclarativeFormLayout : public DeclarativeLayoutProxy<QFormLayout>
 {
   DECLARATIVE_OBJECT
 
@@ -268,12 +277,13 @@ class DeclarativeFormLayout : public DeclarativeObjectProxy<QFormLayout>
     static DeclarativeFormLayoutAttached *qmlAttachedProperties(QObject *parent);
 
   protected:
-    void dataAppend(QObject *object);
+    void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
+    void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
 };
 
 QML_DECLARE_TYPEINFO(DeclarativeFormLayout, QML_HAS_ATTACHED_PROPERTIES)
 
-class DeclarativeHBoxLayout : public DeclarativeBoxLayout<QHBoxLayout>
+class DeclarativeHBoxLayout : public DeclarativeLayoutProxy<QHBoxLayout>
 {
   DECLARATIVE_OBJECT
 
@@ -284,12 +294,13 @@ class DeclarativeHBoxLayout : public DeclarativeBoxLayout<QHBoxLayout>
 
   protected:
     void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
+    void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
 };
 
 
 QML_DECLARE_TYPEINFO(DeclarativeHBoxLayout, QML_HAS_ATTACHED_PROPERTIES)
 
-class DeclarativeVBoxLayout : public DeclarativeBoxLayout<QVBoxLayout>
+class DeclarativeVBoxLayout : public DeclarativeLayoutProxy<QVBoxLayout>
 {
   DECLARATIVE_OBJECT
 
@@ -300,6 +311,7 @@ class DeclarativeVBoxLayout : public DeclarativeBoxLayout<QVBoxLayout>
 
   protected:
     void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
+    void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
 };
 
 QML_DECLARE_TYPEINFO(DeclarativeVBoxLayout, QML_HAS_ATTACHED_PROPERTIES)