Add support for 'Separator {}' in MenuBar, Menu and ToolBar
authorTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 16:22:24 +0000 (18:22 +0200)
committerTobias Koenig <tobias.koenig@kdab.com>
Wed, 17 Oct 2012 16:36:23 +0000 (18:36 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
declarativewidgetdocument.cpp
editor.qml

index ee66463..c955f70 100644 (file)
@@ -148,6 +148,14 @@ DeclarativeAction::DeclarativeAction(QObject *parent) : DeclarativeObjectProxy<Q
 
 CUSTOM_METAOBJECT(DeclarativeAction, QAction)
 
+// DeclarativeSeparator
+DeclarativeSeparator::DeclarativeSeparator(QObject *parent) : DeclarativeObjectProxy<QAction>(parent)
+{
+  connectAllSignals(m_proxiedObject, this);
+}
+
+CUSTOM_METAOBJECT(DeclarativeSeparator, QAction)
+
 //// Layouts ////
 
 // DeclarativeHBoxLayout
@@ -237,7 +245,7 @@ void DeclarativeMenu::addWidget(QWidget *widget, AbstractDeclarativeObject *decl
 {
   QMenu *menu = qobject_cast<QMenu*>(widget);
   if (!menu) {
-    qmlInfo(declarativeObject) << "The QMenu can only contain QMenu or QAction";
+    qmlInfo(declarativeObject) << "The QMenu can only contain QMenu, QAction or Separator";
     return;
   }
 
@@ -253,6 +261,19 @@ void DeclarativeMenu::setLayout(QLayout *layout, AbstractDeclarativeObject *decl
   qmlInfo(this) << "Can not set a QLayout to a QMenu";
 }
 
+void DeclarativeMenu::addAction(QAction *action, AbstractDeclarativeObject *declarativeObject)
+{
+  DeclarativeSeparator *separator = dynamic_cast<DeclarativeSeparator*>(declarativeObject);
+
+  if (separator) {
+    m_proxiedObject->addSeparator();
+  } else {
+    m_proxiedObject->addAction(action);
+  }
+
+  m_children.append(declarativeObject);
+}
+
 CUSTOM_METAOBJECT(DeclarativeMenu, QMenu)
 
 // DeclarativeMenuBar
@@ -281,6 +302,19 @@ void DeclarativeMenuBar::setLayout(QLayout *layout, AbstractDeclarativeObject *d
   qmlInfo(this) << "Can not set a QLayout to a QMenuBar";
 }
 
+void DeclarativeMenuBar::addAction(QAction *action, AbstractDeclarativeObject *declarativeObject)
+{
+  Q_UNUSED(action)
+
+  DeclarativeSeparator *separator = dynamic_cast<DeclarativeSeparator*>(declarativeObject);
+
+  if (separator) {
+    m_proxiedObject->addSeparator();
+  }
+
+  m_children.append(declarativeObject);
+}
+
 CUSTOM_METAOBJECT(DeclarativeMenuBar, QMenuBar)
 
 // DeclarativePushButton
@@ -408,6 +442,19 @@ void DeclarativeToolBar::setLayout(QLayout *layout, AbstractDeclarativeObject *d
   qmlInfo(this) << "Can not set a QLayout to a QToolBar";
 }
 
+void DeclarativeToolBar::addAction(QAction *action, AbstractDeclarativeObject *declarativeObject)
+{
+  DeclarativeSeparator *separator = dynamic_cast<DeclarativeSeparator*>(declarativeObject);
+
+  if (separator) {
+    m_proxiedObject->addSeparator();
+  } else {
+    m_proxiedObject->addAction(action);
+  }
+
+  m_children.append(declarativeObject);
+}
+
 CUSTOM_METAOBJECT(DeclarativeToolBar, QToolBar)
 
 // DeclarativeWidget
index 94cd85b..1b7fbb5 100644 (file)
@@ -169,6 +169,14 @@ class DeclarativeAction : public DeclarativeObjectProxy<QAction>
     DeclarativeAction(QObject *parent = 0);
 };
 
+class DeclarativeSeparator : public DeclarativeObjectProxy<QAction>
+{
+  DECLARATIVE_OBJECT
+
+  public:
+    DeclarativeSeparator(QObject *parent = 0);
+};
+
 //// Layouts ////
 template <class T>
 class DeclarativeBoxLayout : public DeclarativeObjectProxy<T>
@@ -263,6 +271,7 @@ class DeclarativeMenu : public DeclarativeWidgetProxy<QMenu>
   protected:
     virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
     virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
+    virtual void addAction(QAction *action, AbstractDeclarativeObject *declarativeObject);
 };
 
 class DeclarativeMenuBar : public DeclarativeWidgetProxy<QMenuBar>
@@ -275,6 +284,7 @@ class DeclarativeMenuBar : public DeclarativeWidgetProxy<QMenuBar>
   protected:
     virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
     virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
+    virtual void addAction(QAction *action, AbstractDeclarativeObject *declarativeObject);
 };
 
 class DeclarativePushButton : public DeclarativeWidgetProxy<QPushButton>
@@ -354,6 +364,7 @@ class DeclarativeToolBar : public DeclarativeWidgetProxy<QToolBar>
   protected:
     virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
     virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
+    virtual void addAction(QAction *action, AbstractDeclarativeObject *declarativeObject);
 };
 
 class DeclarativeWidget : public DeclarativeWidgetProxy<QWidget>
index beda986..ede3a61 100644 (file)
@@ -32,6 +32,7 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   // objects
   qmlRegisterType<QAction>();
   qmlRegisterType<DeclarativeAction>("QtGui", 1, 0, "Action");
+  qmlRegisterType<DeclarativeSeparator>("QtGui", 1, 0, "Separator");
 
   // layouts
   qmlRegisterType<DeclarativeHBoxLayout>("QtGui", 1, 0, "HBoxLayout");
index af10746..c4f2620 100644 (file)
@@ -7,6 +7,12 @@ MainWindow {
       title: qsTr("File")
 
       Action {
+        text: "New"
+      }
+
+      Separator {}
+
+      Action {
         text: "Close"
       }
     }
@@ -16,13 +22,19 @@ MainWindow {
 
       Action {
         text: "Copy"
+
+        onTriggered: textEdit.copy()
       }
 
       Action {
         text: "Paste"
+
+        onTriggered: textEdit.paste()
       }
     }
 
+    Separator {}
+
     Menu {
       title: qsTr("Help")
 
@@ -41,6 +53,8 @@ MainWindow {
       text: qsTr("New")
     }
 
+    Separator {}
+
     Label {
       text: "Zoom"
     }