From a529db32fd90685b0e9825879cb89fbf62bfe216 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Fri, 30 Dec 2011 16:35:55 +0100 Subject: [PATCH] support submenus by (ab)using visualParent if visualParent is a QAction, this becomes a submenu --- declarativeimports/plasmacomponents/qmenu.cpp | 23 ++++++++++++++++--- declarativeimports/plasmacomponents/qmenu.h | 8 +++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/declarativeimports/plasmacomponents/qmenu.cpp b/declarativeimports/plasmacomponents/qmenu.cpp index 2aacf117c..92b69a4a9 100644 --- a/declarativeimports/plasmacomponents/qmenu.cpp +++ b/declarativeimports/plasmacomponents/qmenu.cpp @@ -60,17 +60,34 @@ DialogStatus::Status QMenuProxy::status() const return m_status; } -QDeclarativeItem *QMenuProxy::visualParent() const +QObject *QMenuProxy::visualParent() const { return m_visualParent.data(); } -void QMenuProxy::setVisualParent(QDeclarativeItem *parent) +void QMenuProxy::setVisualParent(QObject *parent) { if (m_visualParent.data() == parent) { return; } + //if the old parent was a QAction, disconnect the menu from it + QAction *action = qobject_cast(m_visualParent.data()); + if (action) { + action->setMenu(0); + m_menu->clear(); + } + //if parent is a QAction, become a submenu + action = qobject_cast(parent); + if (action) { + action->setMenu(m_menu); + m_menu->clear(); + foreach(QMenuItem* item, m_items) { + m_menu->addAction (item); + } + m_menu->updateGeometry(); + } + m_visualParent = parent; emit visualParentChanged(); } @@ -160,7 +177,7 @@ void QMenuProxy::open() QGraphicsObject *parentItem; if (m_visualParent) { - parentItem = m_visualParent.data(); + parentItem = qobject_cast(m_visualParent.data()); } else { parentItem = qobject_cast(parent()); } diff --git a/declarativeimports/plasmacomponents/qmenu.h b/declarativeimports/plasmacomponents/qmenu.h index cf73b8048..352847174 100644 --- a/declarativeimports/plasmacomponents/qmenu.h +++ b/declarativeimports/plasmacomponents/qmenu.h @@ -34,7 +34,7 @@ class QMenuProxy : public QObject Q_PROPERTY(QDeclarativeListProperty content READ content CONSTANT) Q_CLASSINFO("DefaultProperty", "content") - Q_PROPERTY(QDeclarativeItem *visualParent READ visualParent WRITE setVisualParent NOTIFY visualParentChanged()) + Q_PROPERTY(QObject *visualParent READ visualParent WRITE setVisualParent NOTIFY visualParentChanged()) Q_PROPERTY(DialogStatus::Status status READ status NOTIFY statusChanged) public: @@ -46,8 +46,8 @@ public: QMenuItem *action(int) const; DialogStatus::Status status() const; - QDeclarativeItem *visualParent() const; - void setVisualParent(QDeclarativeItem *parent); + QObject *visualParent() const; + void setVisualParent(QObject *parent); void showMenu(int x, int y); Q_INVOKABLE void open(); @@ -72,7 +72,7 @@ private: QList m_items; QMenu *m_menu; DialogStatus::Status m_status; - QWeakPointer m_visualParent; + QWeakPointer m_visualParent; }; #endif //QMENU_PROXY_H