Add Menu and Action support
authorTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 15:25:22 +0000 (17:25 +0200)
committerTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 15:25:22 +0000 (17:25 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
declarativewidgetdocument.cpp
editor.qml

index 928444a..e9fab85 100644 (file)
@@ -138,6 +138,16 @@ void AbstractDeclarativeObject::data_clear(QDeclarativeListProperty<QObject> *pr
     qWarning("cast went wrong in data_clear");
 }
 
+//// Objects ////
+
+// DeclarativeAction
+DeclarativeAction::DeclarativeAction(QObject *parent) : DeclarativeObjectProxy<QAction>(parent)
+{
+  connectAllSignals(m_proxiedObject, this);
+}
+
+CUSTOM_METAOBJECT(DeclarativeAction, QAction)
+
 //// Layouts ////
 
 // DeclarativeHBoxLayout
@@ -190,9 +200,12 @@ DeclarativeMainWindow::DeclarativeMainWindow(QObject *parent) : DeclarativeWidge
 
 void DeclarativeMainWindow::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
 {
-  if (widget) {
+  QMenuBar *menuBar = qobject_cast<QMenuBar*>(widget);
+  if (menuBar) {
+    m_proxiedObject->setMenuBar(menuBar);
+  } else if (widget) {
     if (m_proxiedObject->centralWidget()) {
-      qmlInfo(this) << "The QMainWindow contains a central widget already";
+      qmlInfo(declarativeObject) << "The QMainWindow contains a central widget already";
       return;
     }
 
@@ -211,6 +224,75 @@ void DeclarativeMainWindow::setLayout(QLayout *layout, AbstractDeclarativeObject
 
 CUSTOM_METAOBJECT(DeclarativeMainWindow, QMainWindow)
 
+// DeclarativeMenu
+DeclarativeMenu::DeclarativeMenu(QObject *parent) : DeclarativeWidgetProxy<QMenu>(parent)
+{
+  connectAllSignals(m_proxiedObject, this);
+}
+
+void DeclarativeMenu::addObject(QObject *object, AbstractDeclarativeObject *declarativeObject)
+{
+  QAction *action = qobject_cast<QAction*>(object);
+  if (!action) {
+    qmlInfo(declarativeObject) << "The QMenu can only contain QMenu or QAction";
+    return;
+  }
+
+  m_proxiedObject->addAction(action);
+
+  m_children.append(declarativeObject);
+}
+
+void DeclarativeMenu::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
+{
+  QMenu *menu = qobject_cast<QMenu*>(widget);
+  if (!menu) {
+    qmlInfo(declarativeObject) << "The QMenu can only contain QMenu or QAction";
+    return;
+  }
+
+  m_proxiedObject->addMenu(menu);
+
+  m_children.append(declarativeObject);
+}
+
+void DeclarativeMenu::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+{
+  Q_UNUSED(layout);
+  Q_UNUSED(declarativeObject);
+  qmlInfo(this) << "Can not set a QLayout to a QMenu";
+}
+
+CUSTOM_METAOBJECT(DeclarativeMenu, QMenu)
+
+// DeclarativeMenuBar
+DeclarativeMenuBar::DeclarativeMenuBar(QObject *parent) : DeclarativeWidgetProxy<QMenuBar>(parent)
+{
+  connectAllSignals(m_proxiedObject, this);
+}
+
+void DeclarativeMenuBar::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
+{
+  QMenu *menu = qobject_cast<QMenu*>(widget);
+  if (!menu) {
+    qmlInfo(declarativeObject) << "The QMenuBar can only contain QMenus";
+    return;
+  }
+
+  m_proxiedObject->addMenu(menu);
+
+  m_children.append(declarativeObject);
+}
+
+void DeclarativeMenuBar::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
+{
+  Q_UNUSED(layout);
+  Q_UNUSED(declarativeObject);
+  qmlInfo(this) << "Can not set a QLayout to a QMenuBar";
+}
+
+CUSTOM_METAOBJECT(DeclarativeMenuBar, QMenuBar)
+
 // DeclarativePushButton
 DeclarativePushButton::DeclarativePushButton(QObject *parent) : DeclarativeWidgetProxy<QPushButton>(parent)
 {
index a1218be..952e6f8 100644 (file)
@@ -3,11 +3,14 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QPointer>
+#include <QtGui/QAction>
 #include <QtGui/QCalendarWidget>
 #include <QtGui/QCheckBox>
 #include <QtGui/QHBoxLayout>
 #include <QtGui/QLabel>
 #include <QtGui/QMainWindow>
+#include <QtGui/QMenu>
+#include <QtGui/QMenuBar>
 #include <QtGui/QPushButton>
 #include <QtGui/QSlider>
 #include <QtGui/QTabWidget>
@@ -62,7 +65,7 @@ template <class T>
 class DeclarativeObjectProxy : public AbstractDeclarativeObject
 {
   public:
-    DeclarativeObjectProxy(QObject *parent = 0) : AbstractDeclarativeObject(parent), m_proxiedObject(new T) {}
+    DeclarativeObjectProxy(QObject *parent = 0) : AbstractDeclarativeObject(parent), m_proxiedObject(new T(0)) {}
 
     ~DeclarativeObjectProxy() { delete m_proxiedObject; }
 
@@ -100,12 +103,6 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy<T>
         if (declarativeObject) {
           QWidget *widget = qobject_cast<QWidget*>(declarativeObject->object());
           if (widget) {
-/*
-            if (DeclarativeObjectProxy<T>::m_proxiedObject->layout()) {
-              qmlInfo(this) << "Can not add Widget since a Layout is set already";
-              return;
-            }
-*/
             addWidget(widget, declarativeObject);
             return;
           }
@@ -124,6 +121,8 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy<T>
           }
         }
 
+        addObject(declarativeObject->object(), declarativeObject);
+
         DeclarativeObjectProxy<T>::dataAppend(object);
     }
 
@@ -139,6 +138,21 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy<T>
       DeclarativeObjectProxy<T>::m_children.append(declarativeObject);
       DeclarativeObjectProxy<T>::m_proxiedObject->setLayout(layout);
     }
+
+    virtual void addObject(QObject *object, AbstractDeclarativeObject *declarativeObject)
+    {
+      object->setParent(DeclarativeObjectProxy<T>::m_proxiedObject);
+      DeclarativeObjectProxy<T>::m_children.append(declarativeObject);
+    }
+};
+
+//// Objects ///
+class DeclarativeAction : public DeclarativeObjectProxy<QAction>
+{
+  DECLARATIVE_OBJECT
+
+  public:
+    DeclarativeAction(QObject *parent = 0);
 };
 
 //// Layouts ////
@@ -225,6 +239,31 @@ class DeclarativeMainWindow : public DeclarativeWidgetProxy<QMainWindow>
     virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
 };
 
+class DeclarativeMenu : public DeclarativeWidgetProxy<QMenu>
+{
+  DECLARATIVE_OBJECT
+
+  public:
+    DeclarativeMenu(QObject *parent = 0);
+
+  protected:
+    virtual void addObject(QObject *object, AbstractDeclarativeObject *declarativeObject);
+    virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
+    virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
+};
+
+class DeclarativeMenuBar : public DeclarativeWidgetProxy<QMenuBar>
+{
+  DECLARATIVE_OBJECT
+
+  public:
+    DeclarativeMenuBar(QObject *parent = 0);
+
+  protected:
+    virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
+    virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
+};
+
 class DeclarativePushButton : public DeclarativeWidgetProxy<QPushButton>
 {
   DECLARATIVE_OBJECT
index 7475fd3..83005bb 100644 (file)
@@ -29,6 +29,10 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   : QObject(parent)
   , d(new Private(this, url))
 {
+  // objects
+  qmlRegisterType<QAction>();
+  qmlRegisterType<DeclarativeAction>("QtGui", 1, 0, "Action");
+
   // layouts
   qmlRegisterType<DeclarativeHBoxLayout>("QtGui", 1, 0, "HBoxLayout");
   qmlRegisterType<DeclarativeVBoxLayout>("QtGui", 1, 0, "VBoxLayout");
@@ -38,6 +42,8 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   qmlRegisterType<DeclarativeCheckBox>("QtGui", 1, 0, "CheckBox");
   qmlRegisterType<DeclarativeLabel>("QtGui", 1, 0, "Label");
   qmlRegisterType<DeclarativeMainWindow>("QtGui", 1, 0, "MainWindow");
+  qmlRegisterType<DeclarativeMenu>("QtGui", 1, 0, "Menu");
+  qmlRegisterType<DeclarativeMenuBar>("QtGui", 1, 0, "MenuBar");
   qmlRegisterType<DeclarativePushButton>("QtGui", 1, 0, "PushButton");
   qmlRegisterType<DeclarativeSlider>("QtGui", 1, 0, "Slider");
   qmlRegisterType<TabWidgetTabHeader>();
index 49452a0..d051e5e 100644 (file)
@@ -1,6 +1,42 @@
 import QtGui 1.0
 
 MainWindow {
+
+  MenuBar {
+    Menu {
+      title: qsTr("File")
+
+      Action {
+        text: "Close"
+      }
+    }
+
+    Menu {
+      title: qsTr("Edit")
+
+      Action {
+        text: "Copy"
+      }
+
+      Action {
+        text: "Paste"
+      }
+    }
+
+    Menu {
+      title: qsTr("Help")
+
+      Action {
+        text: "About"
+      }
+
+      Action {
+        text: "About Qt"
+      }
+    }
+  }
+
   TextEdit {
+    id: textEdit
   }
 }