From 579878e25de2af8cb190b2a4513e636eccb02630 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 17 Oct 2012 17:25:22 +0200 Subject: [PATCH] Add Menu and Action support --- declarativeobjects.cpp | 86 ++++++++++++++++++++++++++++++++++++++++- declarativeobjects_p.h | 53 ++++++++++++++++++++++--- declarativewidgetdocument.cpp | 6 +++ editor.qml | 36 +++++++++++++++++ 4 files changed, 172 insertions(+), 9 deletions(-) diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index 928444a..e9fab85 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -138,6 +138,16 @@ void AbstractDeclarativeObject::data_clear(QDeclarativeListProperty *pr qWarning("cast went wrong in data_clear"); } +//// Objects //// + +// DeclarativeAction +DeclarativeAction::DeclarativeAction(QObject *parent) : DeclarativeObjectProxy(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(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(parent) +{ + connectAllSignals(m_proxiedObject, this); +} + +void DeclarativeMenu::addObject(QObject *object, AbstractDeclarativeObject *declarativeObject) +{ + QAction *action = qobject_cast(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(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(parent) +{ + connectAllSignals(m_proxiedObject, this); +} + +void DeclarativeMenuBar::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) +{ + QMenu *menu = qobject_cast(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(parent) { diff --git a/declarativeobjects_p.h b/declarativeobjects_p.h index a1218be..952e6f8 100644 --- a/declarativeobjects_p.h +++ b/declarativeobjects_p.h @@ -3,11 +3,14 @@ #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -62,7 +65,7 @@ template 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 if (declarativeObject) { QWidget *widget = qobject_cast(declarativeObject->object()); if (widget) { -/* - if (DeclarativeObjectProxy::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 } } + addObject(declarativeObject->object(), declarativeObject); + DeclarativeObjectProxy::dataAppend(object); } @@ -139,6 +138,21 @@ class DeclarativeWidgetProxy : public DeclarativeObjectProxy DeclarativeObjectProxy::m_children.append(declarativeObject); DeclarativeObjectProxy::m_proxiedObject->setLayout(layout); } + + virtual void addObject(QObject *object, AbstractDeclarativeObject *declarativeObject) + { + object->setParent(DeclarativeObjectProxy::m_proxiedObject); + DeclarativeObjectProxy::m_children.append(declarativeObject); + } +}; + +//// Objects /// +class DeclarativeAction : public DeclarativeObjectProxy +{ + DECLARATIVE_OBJECT + + public: + DeclarativeAction(QObject *parent = 0); }; //// Layouts //// @@ -225,6 +239,31 @@ class DeclarativeMainWindow : public DeclarativeWidgetProxy virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject); }; +class DeclarativeMenu : public DeclarativeWidgetProxy +{ + 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 +{ + 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 { DECLARATIVE_OBJECT diff --git a/declarativewidgetdocument.cpp b/declarativewidgetdocument.cpp index 7475fd3..83005bb 100644 --- a/declarativewidgetdocument.cpp +++ b/declarativewidgetdocument.cpp @@ -29,6 +29,10 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p : QObject(parent) , d(new Private(this, url)) { + // objects + qmlRegisterType(); + qmlRegisterType("QtGui", 1, 0, "Action"); + // layouts qmlRegisterType("QtGui", 1, 0, "HBoxLayout"); qmlRegisterType("QtGui", 1, 0, "VBoxLayout"); @@ -38,6 +42,8 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p qmlRegisterType("QtGui", 1, 0, "CheckBox"); qmlRegisterType("QtGui", 1, 0, "Label"); qmlRegisterType("QtGui", 1, 0, "MainWindow"); + qmlRegisterType("QtGui", 1, 0, "Menu"); + qmlRegisterType("QtGui", 1, 0, "MenuBar"); qmlRegisterType("QtGui", 1, 0, "PushButton"); qmlRegisterType("QtGui", 1, 0, "Slider"); qmlRegisterType(); diff --git a/editor.qml b/editor.qml index 49452a0..d051e5e 100644 --- a/editor.qml +++ b/editor.qml @@ -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 } } -- 1.7.2.5