From 42040ad4f44906a95ca576a7f141b4b7be72158b Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Thu, 18 Oct 2012 15:22:20 +0200 Subject: [PATCH] Create proxy for layouts and rebase existing layouts to it --- declarativeobjects.cpp | 84 +++++++++++++++++++++++++++++------------------- declarativeobjects_p.h | 82 +++++++++++++++++++++++++++-------------------- 2 files changed, 98 insertions(+), 68 deletions(-) diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index 152b5cb..4fabcf8 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -238,7 +238,7 @@ QString DeclarativeFormLayoutAttached::label() const return d->label; } -DeclarativeFormLayout::DeclarativeFormLayout(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeFormLayout::DeclarativeFormLayout(QObject *parent) : DeclarativeLayoutProxy(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(object); - if (declarativeObject) { - QObject *attachedProperties = qmlAttachedPropertiesObject(declarativeObject, false); - DeclarativeFormLayoutAttached *properties = qobject_cast(attachedProperties); - - QWidget *widget = qobject_cast(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(declarativeObject, false); + DeclarativeFormLayoutAttached *properties = qobject_cast(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(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(declarativeObject, false); + DeclarativeFormLayoutAttached *properties = qobject_cast(attachedProperties); + if (properties) { + if (!properties->label().isEmpty()) { + m_proxiedObject->addRow(properties->label(), layout); + m_children.append(declarativeObject); + return; } } - - DeclarativeObjectProxy::dataAppend(object); + m_proxiedObject->addRow(layout); + m_children.append(declarativeObject); } CUSTOM_METAOBJECT(DeclarativeFormLayout, QFormLayout) // DeclarativeHBoxLayout -DeclarativeHBoxLayout::DeclarativeHBoxLayout(QObject *parent) : DeclarativeBoxLayout(parent) +DeclarativeHBoxLayout::DeclarativeHBoxLayout(QObject *parent) : DeclarativeLayoutProxy(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(declarativeObject, false); + DeclarativeBoxLayoutAttached *properties = qobject_cast(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(parent) +DeclarativeVBoxLayout::DeclarativeVBoxLayout(QObject *parent) : DeclarativeLayoutProxy(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(declarativeObject, false); + DeclarativeBoxLayoutAttached *properties = qobject_cast(attachedProperties); + if (properties) + stretch = properties->stretch(); + + m_proxiedObject->addLayout(layout, stretch); + m_children.append(declarativeObject); +} + CUSTOM_METAOBJECT(DeclarativeVBoxLayout, QVBoxLayout) //// Widgets //// diff --git a/declarativeobjects_p.h b/declarativeobjects_p.h index 1d62a72..74de13d 100644 --- a/declarativeobjects_p.h +++ b/declarativeobjects_p.h @@ -162,6 +162,46 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy } }; +template +class DeclarativeLayoutProxy : public DeclarativeObjectProxy +{ + public: + DeclarativeLayoutProxy(QObject *parent = 0) : DeclarativeObjectProxy(parent) {} + + protected: + virtual void dataAppend(QObject *object) + { + AbstractDeclarativeObject *declarativeObject = dynamic_cast(object); + if (declarativeObject) { + QWidget *widget = qobject_cast(declarativeObject->object()); + if (widget) { + addWidget(widget, declarativeObject); + return; + } + + QLayout *layout = qobject_cast(declarativeObject->object()); + if (layout) { + addLayout(layout, declarativeObject); + return; + } + } + + DeclarativeObjectProxy::dataAppend(object); + } + + virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) + { + DeclarativeObjectProxy::m_children.append(declarativeObject); + DeclarativeObjectProxy::m_proxiedObject->addWidget(widget); + } + + virtual void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject) + { + DeclarativeObjectProxy::m_children.append(declarativeObject); + DeclarativeObjectProxy::m_proxiedObject->addItem(layout); + } +}; + //// Objects /// class DeclarativeAction : public DeclarativeObjectProxy { @@ -206,37 +246,6 @@ class DeclarativeBoxLayoutAttached : public QObject Private *const d; }; -template -class DeclarativeBoxLayout : public DeclarativeObjectProxy -{ - public: - DeclarativeBoxLayout(QObject *parent = 0) : DeclarativeObjectProxy(parent) {} - - protected: - virtual void dataAppend(QObject *object) - { - AbstractDeclarativeObject *declarativeObject = dynamic_cast(object); - if (declarativeObject) { - QWidget *widget = qobject_cast(declarativeObject->object()); - if (widget) { - addWidget(widget, declarativeObject); - return; - } - - QLayout *layout = qobject_cast(declarativeObject->object()); - if (layout) { - DeclarativeObjectProxy::m_children.append(object); - DeclarativeObjectProxy::m_proxiedObject->addLayout(layout); - return; - } - } - - DeclarativeObjectProxy::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 +class DeclarativeFormLayout : public DeclarativeLayoutProxy { DECLARATIVE_OBJECT @@ -268,12 +277,13 @@ class DeclarativeFormLayout : public DeclarativeObjectProxy 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 +class DeclarativeHBoxLayout : public DeclarativeLayoutProxy { DECLARATIVE_OBJECT @@ -284,12 +294,13 @@ class DeclarativeHBoxLayout : public DeclarativeBoxLayout 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 +class DeclarativeVBoxLayout : public DeclarativeLayoutProxy { DECLARATIVE_OBJECT @@ -300,6 +311,7 @@ class DeclarativeVBoxLayout : public DeclarativeBoxLayout protected: void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject); + void addLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject); }; QML_DECLARE_TYPEINFO(DeclarativeVBoxLayout, QML_HAS_ATTACHED_PROPERTIES) -- 1.7.2.5