From 1265a3986daccd069c5ca8577cf237cb628dd4d3 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 2 May 2018 15:38:09 +0200 Subject: Replace QQuickMenuPrivate::reposition() with QQuickMenuPositioner Change-Id: Iea8c1b8609778604af06cc70eaefad21f00186bd Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickmenu.cpp | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'src/quicktemplates2/qquickmenu.cpp') diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 4e334bba..4cf18db2 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -40,6 +40,7 @@ #include "qquickmenubaritem_p.h" #include "qquickmenubar_p.h" #include "qquickpopupitem_p_p.h" +#include "qquickpopuppositioner_p_p.h" #include "qquickaction_p.h" #include @@ -183,6 +184,14 @@ static bool shouldCascade() #endif } +class QQuickMenuPositioner : public QQuickPopupPositioner +{ +public: + QQuickMenuPositioner(QQuickMenu *menu) : QQuickPopupPositioner(menu) { } + + void reposition() override; +}; + QQuickMenuPrivate::QQuickMenuPrivate() : cascade(shouldCascade()), hoverTimer(0), @@ -361,21 +370,30 @@ void QQuickMenuPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange, resizeItems(); } -void QQuickMenuPrivate::reposition() +QQuickPopupPositioner *QQuickMenuPrivate::getPositioner() { Q_Q(QQuickMenu); - if (parentMenu) { - if (cascade) { - if (popupItem->isMirrored()) - q->setPosition(QPointF(-q->width() - parentMenu->leftPadding() + q->overlap(), -q->topPadding())); - else if (parentItem) - q->setPosition(QPointF(parentItem->width() + parentMenu->rightPadding() - q->overlap(), -q->topPadding())); + if (!positioner) + positioner = new QQuickMenuPositioner(q); + return positioner; +} + +void QQuickMenuPositioner::reposition() +{ + QQuickMenu *menu = static_cast(popup()); + QQuickMenuPrivate *p = QQuickMenuPrivate::get(menu); + if (p->parentMenu) { + if (p->cascade) { + if (p->popupItem->isMirrored()) + menu->setPosition(QPointF(-menu->width() - p->parentMenu->leftPadding() + menu->overlap(), -menu->topPadding())); + else if (p->parentItem) + menu->setPosition(QPointF(p->parentItem->width() + p->parentMenu->rightPadding() - menu->overlap(), -menu->topPadding())); } else { - q->setPosition(QPointF(parentMenu->x() + (parentMenu->width() - q->width()) / 2, - parentMenu->y() + (parentMenu->height() - q->height()) / 2)); + menu->setPosition(QPointF(p->parentMenu->x() + (p->parentMenu->width() - menu->width()) / 2, + p->parentMenu->y() + (p->parentMenu->height() - menu->height()) / 2)); } } - QQuickPopupPrivate::reposition(); + QQuickPopupPositioner::reposition(); } bool QQuickMenuPrivate::prepareEnterTransition() -- cgit v1.2.3