From 5232a0c4005e743942c8f371aeb1ba024d4d4d03 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 12 Jul 2017 14:15:32 +0200 Subject: Add QQuickMenuPrivate::setParentMenu() To help propagating the cascade-property automatically, instead of doing it manually in openSubMenu() that we're trying to get rid of. Change-Id: I3a3d59cafccc85d6affc325eb60e717e22b8f812 Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickmenu.cpp | 31 +++++++++++++++++++++++++++---- src/quicktemplates2/qquickmenu_p.h | 5 +++-- src/quicktemplates2/qquickmenu_p_p.h | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index ce10b612..bc19a707 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -215,7 +215,7 @@ void QQuickMenuPrivate::insertItem(int index, QQuickItem *item) Q_Q(QQuickMenu); QQuickMenuItemPrivate::get(menuItem)->setMenu(q); if (QQuickMenu *subMenu = menuItem->subMenu()) - QQuickMenuPrivate::get(subMenu)->parentMenu = q; + QQuickMenuPrivate::get(subMenu)->setParentMenu(q); QObjectPrivate::connect(menuItem, &QQuickMenuItem::triggered, this, &QQuickMenuPrivate::onItemTriggered); QObjectPrivate::connect(menuItem, &QQuickItem::activeFocusChanged, this, &QQuickMenuPrivate::onItemActiveFocusChanged); QObjectPrivate::connect(menuItem, &QQuickControl::hoveredChanged, this, &QQuickMenuPrivate::onItemHovered); @@ -239,7 +239,7 @@ void QQuickMenuPrivate::removeItem(int index, QQuickItem *item) if (menuItem) { QQuickMenuItemPrivate::get(menuItem)->setMenu(nullptr); if (QQuickMenu *subMenu = menuItem->subMenu()) - QQuickMenuPrivate::get(subMenu)->parentMenu = nullptr; + QQuickMenuPrivate::get(subMenu)->setParentMenu(nullptr); QObjectPrivate::disconnect(menuItem, &QQuickMenuItem::triggered, this, &QQuickMenuPrivate::onItemTriggered); QObjectPrivate::disconnect(menuItem, &QQuickItem::activeFocusChanged, this, &QQuickMenuPrivate::onItemActiveFocusChanged); QObjectPrivate::disconnect(menuItem, &QQuickControl::hoveredChanged, this, &QQuickMenuPrivate::onItemHovered); @@ -472,10 +472,24 @@ void QQuickMenuPrivate::openSubMenu(QQuickMenuItem *item, bool activate) p->allowHorizontalFlip = cascade; if (activate) p->setCurrentIndex(0, Qt::PopupFocusReason); - subMenu->setCascade(cascade); subMenu->open(); } +void QQuickMenuPrivate::setParentMenu(QQuickMenu *parent) +{ + Q_Q(QQuickMenu); + if (parentMenu == parent) + return; + + if (parentMenu) + QObject::disconnect(parentMenu.data(), &QQuickMenu::cascadeChanged, q, &QQuickMenu::setCascade); + if (parent) + QObject::connect(parent, &QQuickMenu::cascadeChanged, q, &QQuickMenu::setCascade); + + parentMenu = parent; + q->resetCascade(); +} + void QQuickMenuPrivate::startHoverTimer() { Q_Q(QQuickMenu); @@ -1005,7 +1019,16 @@ void QQuickMenu::setCascade(bool cascade) if (d->cascade == cascade) return; d->cascade = cascade; - emit cascadeChanged(); + emit cascadeChanged(cascade); +} + +void QQuickMenu::resetCascade() +{ + Q_D(QQuickMenu); + if (d->parentMenu) + setCascade(d->parentMenu->cascade()); + else + setCascade(shouldCascade()); } /*! diff --git a/src/quicktemplates2/qquickmenu_p.h b/src/quicktemplates2/qquickmenu_p.h index 1211172b..9eeeadd6 100644 --- a/src/quicktemplates2/qquickmenu_p.h +++ b/src/quicktemplates2/qquickmenu_p.h @@ -66,7 +66,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickMenu : public QQuickPopup Q_PROPERTY(QVariant contentModel READ contentModel CONSTANT FINAL) Q_PROPERTY(QQmlListProperty contentData READ contentData FINAL) Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL) - Q_PROPERTY(bool cascade READ cascade WRITE setCascade NOTIFY cascadeChanged FINAL REVISION 3) + Q_PROPERTY(bool cascade READ cascade WRITE setCascade RESET resetCascade NOTIFY cascadeChanged FINAL REVISION 3) Q_PROPERTY(qreal overlap READ overlap WRITE setOverlap NOTIFY overlapChanged FINAL REVISION 3) Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged FINAL REVISION 3) Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL REVISION 3) @@ -103,6 +103,7 @@ public: bool cascade() const; void setCascade(bool cascade); + void resetCascade(); qreal overlap() const; void setOverlap(qreal overlap); @@ -124,7 +125,7 @@ protected: Q_SIGNALS: void titleChanged(const QString &title); - Q_REVISION(3) void cascadeChanged(); + Q_REVISION(3) void cascadeChanged(bool cascade); Q_REVISION(3) void overlapChanged(); Q_REVISION(3) void delegateChanged(); Q_REVISION(3) void currentIndexChanged(); diff --git a/src/quicktemplates2/qquickmenu_p_p.h b/src/quicktemplates2/qquickmenu_p_p.h index 283c3708..b52f0f3f 100644 --- a/src/quicktemplates2/qquickmenu_p_p.h +++ b/src/quicktemplates2/qquickmenu_p_p.h @@ -102,6 +102,7 @@ public: void onItemActiveFocusChanged(); void openSubMenu(QQuickMenuItem *item, bool activate); + void setParentMenu(QQuickMenu *parent); void startHoverTimer(); void stopHoverTimer(); -- cgit v1.2.3