aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickpopup.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-05-11 12:33:43 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-05-11 11:24:48 +0000
commit55aef74a8ebd65d2178bd3a2536ca44dcaecd46e (patch)
tree5213c22897bbe6e7bfa2b95fe2e6247236601f20 /src/quicktemplates2/qquickpopup.cpp
parent8b2e819ab2246d01eb564a52aa08bdf1d55c02c2 (diff)
QQuickPopup: emit xChanged() and yChanged() when _local_ coords change
Emitting xChanged() and yChanged() when the (scene) geometry of the internal popup item changes is not sufficient, because QQuickPopup operates in the parent item's coordinate space. When a popup is pushed inside the window margins, the local coordinates change, but the global coordinates don't. Change-Id: I296f1ecd1d1e882c2ff730a2bf68641bd57cbb4f Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickpopup.cpp')
-rw-r--r--src/quicktemplates2/qquickpopup.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp
index 94cf5d76..0f2e8378 100644
--- a/src/quicktemplates2/qquickpopup.cpp
+++ b/src/quicktemplates2/qquickpopup.cpp
@@ -133,6 +133,8 @@ QQuickPopupPrivate::QQuickPopupPrivate()
, allowHorizontalFlip(false)
, x(0)
, y(0)
+ , effectiveX(0)
+ , effectiveY(0)
, margins(-1)
, topMargin(0)
, leftMargin(0)
@@ -625,6 +627,17 @@ void QQuickPopupPrivate::reposition()
}
popupItem->setPosition(rect.topLeft());
+
+ const QPointF effectivePos = parentItem ? parentItem->mapFromScene(rect.topLeft()) : rect.topLeft();
+ if (!qFuzzyCompare(effectiveX, effectivePos.x())) {
+ effectiveX = effectivePos.x();
+ emit q->xChanged();
+ }
+ if (!qFuzzyCompare(effectiveY, effectivePos.y())) {
+ effectiveY = effectivePos.y();
+ emit q->yChanged();
+ }
+
if (widthAdjusted && rect.width() > 0)
popupItem->setWidth(rect.width());
if (heightAdjusted && rect.height() > 0)
@@ -766,7 +779,8 @@ void QQuickPopup::close()
*/
qreal QQuickPopup::x() const
{
- return position().x();
+ Q_D(const QQuickPopup);
+ return d->effectiveX;
}
void QQuickPopup::setX(qreal x)
@@ -782,7 +796,8 @@ void QQuickPopup::setX(qreal x)
*/
qreal QQuickPopup::y() const
{
- return position().y();
+ Q_D(const QQuickPopup);
+ return d->effectiveY;
}
void QQuickPopup::setY(qreal y)
@@ -794,10 +809,7 @@ void QQuickPopup::setY(qreal y)
QPointF QQuickPopup::position() const
{
Q_D(const QQuickPopup);
- QPointF pos = d->popupItem->position();
- if (d->parentItem)
- pos = d->parentItem->mapFromScene(pos);
- return pos;
+ return QPointF(d->effectiveX, d->effectiveY);
}
void QQuickPopup::setPosition(const QPointF &pos)
@@ -1889,10 +1901,6 @@ void QQuickPopup::geometryChanged(const QRectF &newGeometry, const QRectF &oldGe
{
Q_D(QQuickPopup);
d->reposition();
- if (!qFuzzyCompare(newGeometry.x(), oldGeometry.x()))
- emit xChanged();
- if (!qFuzzyCompare(newGeometry.y(), oldGeometry.y()))
- emit yChanged();
if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
emit widthChanged();
emit availableWidthChanged();