diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-05-02 15:16:47 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-05-02 14:43:07 +0000 |
commit | f9779928136a25db8fb84db9450ae6fc4aa5bb14 (patch) | |
tree | ab3edb8923b89d9e79895255728188d92273872a /src/quicktemplates2 | |
parent | 5dc2465dc5d2970ef97f66bd21ccebb8792419f1 (diff) |
QQuickPopup: prepare for overriding the positioner
Create the positioner lazily to make it possible for QQuickPopup
sub-classes to override the positioner, and give the upcoming
QQuickPopupPositioner sub-classes access to the popup instance.
- QQuickDrawer has custom positioning along the window edges
- QQuickMenu has custom positioning for cascading sub-menus
- in the future, native menus, native tooltips, and top-level
popups/dialogs will also need different positioners.
Change-Id: I7c3ac2c38b00ef92410b2cdf4e51fa974efb534f
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 20 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup_p_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopuppositioner.cpp | 5 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopuppositioner_p_p.h | 2 |
4 files changed, 22 insertions, 6 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index 53af9ec0..01a546bb 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -314,7 +314,6 @@ void QQuickPopupPrivate::init() QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged); QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged); QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged); - positioner = new QQuickPopupPositioner(q); } void QQuickPopupPrivate::closeOrReject() @@ -484,7 +483,7 @@ bool QQuickPopupPrivate::prepareEnterTransition() visible = true; transitionState = EnterTransition; popupItem->setVisible(true); - positioner->setParentItem(parentItem); + getPositioner()->setParentItem(parentItem); emit q->visibleChanged(); } return true; @@ -523,7 +522,7 @@ void QQuickPopupPrivate::finalizeEnterTransition() void QQuickPopupPrivate::finalizeExitTransition() { Q_Q(QQuickPopup); - positioner->setParentItem(nullptr); + getPositioner()->setParentItem(nullptr); popupItem->setParentItem(nullptr); popupItem->setVisible(false); destroyOverlay(); @@ -650,6 +649,14 @@ QQuickPopupAnchors *QQuickPopupPrivate::getAnchors() return anchors; } +QQuickPopupPositioner *QQuickPopupPrivate::getPositioner() +{ + Q_Q(QQuickPopup); + if (!positioner) + positioner = new QQuickPopupPositioner(q); + return positioner; +} + void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow) { Q_Q(QQuickPopup); @@ -691,7 +698,7 @@ void QQuickPopupPrivate::itemDestroyed(QQuickItem *item) void QQuickPopupPrivate::reposition() { - positioner->reposition(); + getPositioner()->reposition(); } static QQuickItem *createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent) @@ -1643,8 +1650,9 @@ void QQuickPopup::setParentItem(QQuickItem *parent) QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed); } d->parentItem = parent; - if (d->positioner->parentItem()) - d->positioner->setParentItem(parent); + QQuickPopupPositioner *positioner = d->getPositioner(); + if (positioner->parentItem()) + positioner->setParentItem(parent); if (parent) { QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow); QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed); diff --git a/src/quicktemplates2/qquickpopup_p_p.h b/src/quicktemplates2/qquickpopup_p_p.h index 37c9ffe5..b6e0efca 100644 --- a/src/quicktemplates2/qquickpopup_p_p.h +++ b/src/quicktemplates2/qquickpopup_p_p.h @@ -140,6 +140,7 @@ public: void setBottomMargin(qreal value, bool reset = false); QQuickPopupAnchors *getAnchors(); + virtual QQuickPopupPositioner *getPositioner(); void setWindow(QQuickWindow *window); void itemDestroyed(QQuickItem *item) override; diff --git a/src/quicktemplates2/qquickpopuppositioner.cpp b/src/quicktemplates2/qquickpopuppositioner.cpp index 60a989da..1c2cd1c8 100644 --- a/src/quicktemplates2/qquickpopuppositioner.cpp +++ b/src/quicktemplates2/qquickpopuppositioner.cpp @@ -67,6 +67,11 @@ QQuickPopupPositioner::~QQuickPopupPositioner() } } +QQuickPopup *QQuickPopupPositioner::popup() const +{ + return m_popup; +} + QQuickItem *QQuickPopupPositioner::parentItem() const { return m_parentItem; diff --git a/src/quicktemplates2/qquickpopuppositioner_p_p.h b/src/quicktemplates2/qquickpopuppositioner_p_p.h index 45b33538..f057f57b 100644 --- a/src/quicktemplates2/qquickpopuppositioner_p_p.h +++ b/src/quicktemplates2/qquickpopuppositioner_p_p.h @@ -61,6 +61,8 @@ public: explicit QQuickPopupPositioner(QQuickPopup *popup); ~QQuickPopupPositioner(); + QQuickPopup *popup() const; + QQuickItem *parentItem() const; void setParentItem(QQuickItem *parent); |