From 6d57c4b14b5077926e2a73b5df7bed8fe4f2d499 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 17 Oct 2012 18:55:44 +0200 Subject: [PATCH] Add support for StatusBar with permanent widgets inside --- declarativeobjects.cpp | 72 +++++++++++++++++++++++++++++++++++++++++ declarativeobjects_p.h | 39 ++++++++++++++++++++++ declarativewidgetdocument.cpp | 2 + editor.qml | 7 ++++ 4 files changed, 120 insertions(+), 0 deletions(-) diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index c955f70..d2654f9 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -210,10 +210,14 @@ void DeclarativeMainWindow::addWidget(QWidget *widget, AbstractDeclarativeObject { QMenuBar *menuBar = qobject_cast(widget); QToolBar *toolBar = qobject_cast(widget); + QStatusBar *statusBar = qobject_cast(widget); + if (menuBar) { m_proxiedObject->setMenuBar(menuBar); } else if (toolBar) { m_proxiedObject->addToolBar(toolBar); + } else if (statusBar) { + m_proxiedObject->setStatusBar(statusBar); } else if (widget) { if (m_proxiedObject->centralWidget()) { qmlInfo(declarativeObject) << "The QMainWindow contains a central widget already"; @@ -333,6 +337,74 @@ DeclarativeSlider::DeclarativeSlider(QObject *parent) : DeclarativeWidgetProxystretch = 0; +} + +DeclarativeStatusBarAttached::~DeclarativeStatusBarAttached() +{ + delete d; +} + +void DeclarativeStatusBarAttached::setStretch(int stretch) +{ + if (d->stretch == stretch) + return; + + d->stretch = stretch; + emit stretchChanged(); +} + +int DeclarativeStatusBarAttached::stretch() const +{ + return d->stretch; +} + +DeclarativeStatusBar::DeclarativeStatusBar(QObject *parent) : DeclarativeWidgetProxy(parent) +{ + connectAllSignals(m_proxiedObject, this); +} + +void DeclarativeStatusBar::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) +{ + // TODO: error when layout is set + + m_children.append(declarativeObject); + + QObject *attachedProperties = qmlAttachedPropertiesObject(declarativeObject, false); + DeclarativeStatusBarAttached *attached = qobject_cast(attachedProperties); + + int stretch = 0; + if (attached) { + stretch = attached->stretch(); + } + + m_proxiedObject->addPermanentWidget(widget, stretch); +} + +void DeclarativeStatusBar::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject) +{ + Q_UNUSED(layout); + Q_UNUSED(declarativeObject); + qmlInfo(this) << "Can not add QLayout to QStatusBar"; +} + +DeclarativeStatusBarAttached *DeclarativeStatusBar::qmlAttachedProperties(QObject *object) +{ + return new DeclarativeStatusBarAttached(object); +} + +CUSTOM_METAOBJECT(DeclarativeStatusBar, QStatusBar) + // DeclarativeTabWidget class TabWidgetTabHeader::Private { diff --git a/declarativeobjects_p.h b/declarativeobjects_p.h index 1b7fbb5..35d126a 100644 --- a/declarativeobjects_p.h +++ b/declarativeobjects_p.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -303,6 +304,44 @@ class DeclarativeSlider : public DeclarativeWidgetProxy DeclarativeSlider(QObject *parent = 0); }; +// attached property for DeclarativeStatusBar +class DeclarativeStatusBarAttached : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int stretch READ stretch WRITE setStretch NOTIFY stretchChanged) + + public: + DeclarativeStatusBarAttached(QObject *parent = 0); + ~DeclarativeStatusBarAttached(); + + void setStretch(int stretch); + int stretch() const; + + Q_SIGNALS: + void stretchChanged(); + + private: + class Private; + Private *const d; +}; + +class DeclarativeStatusBar : public DeclarativeWidgetProxy +{ + DECLARATIVE_OBJECT + + public: + DeclarativeStatusBar(QObject *parent = 0); + + static DeclarativeStatusBarAttached *qmlAttachedProperties(QObject *object); + + protected: + virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject); + virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject); +}; + +QML_DECLARE_TYPEINFO(DeclarativeStatusBar, QML_HAS_ATTACHED_PROPERTIES) + // attached property for DeclarativeTabWidget class TabWidgetTabHeader : public QObject { diff --git a/declarativewidgetdocument.cpp b/declarativewidgetdocument.cpp index ede3a61..eca058d 100644 --- a/declarativewidgetdocument.cpp +++ b/declarativewidgetdocument.cpp @@ -47,6 +47,8 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p qmlRegisterType("QtGui", 1, 0, "MenuBar"); qmlRegisterType("QtGui", 1, 0, "PushButton"); qmlRegisterType("QtGui", 1, 0, "Slider"); + qmlRegisterType(); + qmlRegisterType("QtGui", 1, 0, "StatusBar"); qmlRegisterType(); qmlRegisterType("QtGui", 1, 0, "TabWidget"); qmlRegisterType("QtGui", 1, 0, "TextEdit"); diff --git a/editor.qml b/editor.qml index c4f2620..b7396c2 100644 --- a/editor.qml +++ b/editor.qml @@ -72,4 +72,11 @@ MainWindow { text: "Paste" } } + + StatusBar { + Label { + StatusBar.stretch: 2 + text: "Pos:" + } + } } -- 1.7.2.5