aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2018-05-02 15:16:47 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2018-05-02 14:43:07 +0000
commitf9779928136a25db8fb84db9450ae6fc4aa5bb14 (patch)
treeab3edb8923b89d9e79895255728188d92273872a /src/quicktemplates2
parent5dc2465dc5d2970ef97f66bd21ccebb8792419f1 (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.cpp20
-rw-r--r--src/quicktemplates2/qquickpopup_p_p.h1
-rw-r--r--src/quicktemplates2/qquickpopuppositioner.cpp5
-rw-r--r--src/quicktemplates2/qquickpopuppositioner_p_p.h2
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);