Add support for StatusBar with permanent widgets inside
authorTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 16:55:44 +0000 (18:55 +0200)
committerTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 16:55:44 +0000 (18:55 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
declarativewidgetdocument.cpp
editor.qml

index c955f70..d2654f9 100644 (file)
@@ -210,10 +210,14 @@ void DeclarativeMainWindow::addWidget(QWidget *widget, AbstractDeclarativeObject
 {
   QMenuBar *menuBar = qobject_cast<QMenuBar*>(widget);
   QToolBar *toolBar = qobject_cast<QToolBar*>(widget);
+  QStatusBar *statusBar = qobject_cast<QStatusBar*>(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) : DeclarativeWidgetProxy<Q
 
 CUSTOM_METAOBJECT(DeclarativeSlider, QSlider)
 
+// DeclarativeStatusBar
+class DeclarativeStatusBarAttached::Private
+{
+  public:
+    int stretch;
+};
+
+DeclarativeStatusBarAttached::DeclarativeStatusBarAttached(QObject *parent)
+  : QObject(parent), d(new DeclarativeStatusBarAttached::Private)
+{
+  d->stretch = 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<QStatusBar>(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<DeclarativeStatusBar>(declarativeObject, false);
+  DeclarativeStatusBarAttached *attached = qobject_cast<DeclarativeStatusBarAttached*>(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
 {
index 1b7fbb5..35d126a 100644 (file)
@@ -13,6 +13,7 @@
 #include <QtGui/QMenuBar>
 #include <QtGui/QPushButton>
 #include <QtGui/QSlider>
+#include <QtGui/QStatusBar>
 #include <QtGui/QTabWidget>
 #include <QtGui/QTextEdit>
 #include <QtGui/QToolBar>
@@ -303,6 +304,44 @@ class DeclarativeSlider : public DeclarativeWidgetProxy<QSlider>
     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<QStatusBar>
+{
+  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
 {
index ede3a61..eca058d 100644 (file)
@@ -47,6 +47,8 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   qmlRegisterType<DeclarativeMenuBar>("QtGui", 1, 0, "MenuBar");
   qmlRegisterType<DeclarativePushButton>("QtGui", 1, 0, "PushButton");
   qmlRegisterType<DeclarativeSlider>("QtGui", 1, 0, "Slider");
+  qmlRegisterType<DeclarativeStatusBarAttached>();
+  qmlRegisterType<DeclarativeStatusBar>("QtGui", 1, 0, "StatusBar");
   qmlRegisterType<TabWidgetTabHeader>();
   qmlRegisterType<DeclarativeTabWidget>("QtGui", 1, 0, "TabWidget");
   qmlRegisterType<DeclarativeTextEdit>("QtGui", 1, 0, "TextEdit");
index c4f2620..b7396c2 100644 (file)
@@ -72,4 +72,11 @@ MainWindow {
       text: "Paste"
     }
   }
+
+  StatusBar {
+    Label {
+      StatusBar.stretch: 2
+      text: "Pos:"
+    }
+  }
 }