diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-01-12 13:21:56 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-01-15 10:31:22 +0000 |
commit | fa99c0caa212e02472c2facb1a104358f077aa08 (patch) | |
tree | e1f40101ee663965e5a196f7afd8cc14337d1b16 /src/quicktemplates2/qquickmenuitem.cpp | |
parent | 589d52b3b64a4b5221738a28df08be2eae4d12b2 (diff) |
MenuItem: use deferred execution for the arrow
Task-number: QTBUG-50992
Change-Id: Ifb41a8caf6b406249d6da4783c546816d9b51581
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickmenuitem.cpp')
-rw-r--r-- | src/quicktemplates2/qquickmenuitem.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/quicktemplates2/qquickmenuitem.cpp b/src/quicktemplates2/qquickmenuitem.cpp index f71b9c35..6693d4f8 100644 --- a/src/quicktemplates2/qquickmenuitem.cpp +++ b/src/quicktemplates2/qquickmenuitem.cpp @@ -37,6 +37,7 @@ #include "qquickmenuitem_p.h" #include "qquickmenuitem_p_p.h" #include "qquickmenu_p.h" +#include "qquickdeferredexecute_p_p.h" #include <QtGui/qpa/qplatformtheme.h> #include <QtQuick/private/qquickevents_p_p.h> @@ -134,6 +135,26 @@ void QQuickMenuItemPrivate::updateEnabled() q->setEnabled(subMenu && subMenu->isEnabled()); } +static inline QString arrowName() { return QStringLiteral("arrow"); } + +void QQuickMenuItemPrivate::cancelArrow() +{ + Q_Q(QQuickAbstractButton); + quickCancelDeferred(q, arrowName()); +} + +void QQuickMenuItemPrivate::executeArrow(bool complete) +{ + Q_Q(QQuickMenuItem); + if (arrow.wasExecuted()) + return; + + if (!arrow || complete) + quickBeginDeferred(q, arrowName(), arrow); + if (complete) + quickCompleteDeferred(q, arrowName(), arrow); +} + /*! \qmlsignal void QtQuick.Controls::MenuItem::triggered() @@ -183,7 +204,9 @@ void QQuickMenuItem::setHighlighted(bool highlighted) */ QQuickItem *QQuickMenuItem::arrow() const { - Q_D(const QQuickMenuItem); + QQuickMenuItemPrivate *d = const_cast<QQuickMenuItemPrivate *>(d_func()); + if (!d->arrow) + d->executeArrow(); return d->arrow; } @@ -193,11 +216,15 @@ void QQuickMenuItem::setArrow(QQuickItem *arrow) if (d->arrow == arrow) return; - QQuickControlPrivate::destroyDelegate(d->arrow, this); + if (!d->arrow.isExecuting()) + d->cancelArrow(); + + delete d->arrow; d->arrow = arrow; if (arrow && !arrow->parentItem()) arrow->setParentItem(this); - emit arrowChanged(); + if (!d->arrow.isExecuting()) + emit arrowChanged(); } /*! @@ -228,6 +255,13 @@ QQuickMenu *QQuickMenuItem::subMenu() const return d->subMenu; } +void QQuickMenuItem::componentComplete() +{ + Q_D(QQuickMenuItem); + d->executeArrow(true); + QQuickAbstractButton::componentComplete(); +} + QFont QQuickMenuItem::defaultFont() const { return QQuickControlPrivate::themeFont(QPlatformTheme::MenuItemFont); |