diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2016-04-11 12:44:00 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2016-07-11 07:50:51 +0000 |
commit | e2c296c46b3f922ed12f83b166b1493dfded480e (patch) | |
tree | 4275a195b7fcd8bb79285b5c1a2f56cf6da9f61b /src/quick/items/qquickitem.cpp | |
parent | 1c5171eb9747107ea10b4cc3b694ae064fda8655 (diff) |
QML: Pass the kind of geometry change around
This prevents re-calculation of what actually changed, and removes the
now unused parameter newGeometry. Other than this change calculation,
the only place where oldGeometry was used is
QQuickListViewPrivate::itemGeometryChanged. To get rid of oldGeometry
too, QQuickListViewPrivate now stores the current (i.e. last known)
geometry, and updates it in itemGeometryChanged.
Change-Id: I8a5286d08a04132c9a4c81de7ce221f5676946e6
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Diffstat (limited to 'src/quick/items/qquickitem.cpp')
-rw-r--r-- | src/quick/items/qquickitem.cpp | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 1978349a36..56426fbe37 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -289,15 +289,15 @@ void QQuickContents::updateRect() QQuickItemPrivate::get(m_item)->emitChildrenRectChanged(rectF()); } -void QQuickContents::itemGeometryChanged(QQuickItem *changed, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickContents::itemGeometryChanged(QQuickItem *changed, QQuickGeometryChange change, const QRectF &) { Q_UNUSED(changed) bool wChanged = false; bool hChanged = false; //### we can only pass changed if the left edge has moved left, or the right edge has moved right - if (newGeometry.width() != oldGeometry.width() || newGeometry.x() != oldGeometry.x()) + if (change.horizontalChange()) wChanged = calcWidth(/*changed*/); - if (newGeometry.height() != oldGeometry.height() || newGeometry.y() != oldGeometry.y()) + if (change.verticalChange()) hChanged = calcHeight(/*changed*/); if (wChanged || hChanged) updateRect(); @@ -3676,32 +3676,30 @@ void QQuickItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeo if (d->_anchors) QQuickAnchorsPrivate::get(d->_anchors)->updateMe(); - bool xChange = (newGeometry.x() != oldGeometry.x()); - bool yChange = (newGeometry.y() != oldGeometry.y()); - bool widthChange = (newGeometry.width() != oldGeometry.width()); - bool heightChange = (newGeometry.height() != oldGeometry.height()); - - const auto listeners = d->changeListeners; - for (const QQuickItemPrivate::ChangeListener &change : listeners) { - if (change.types & QQuickItemPrivate::Geometry) { - if (change.gTypes == QQuickItemPrivate::GeometryChange) { - change.listener->itemGeometryChanged(this, newGeometry, oldGeometry); - } else if ((xChange && (change.gTypes & QQuickItemPrivate::XChange)) || - (yChange && (change.gTypes & QQuickItemPrivate::YChange)) || - (widthChange && (change.gTypes & QQuickItemPrivate::WidthChange)) || - (heightChange && (change.gTypes & QQuickItemPrivate::HeightChange))) { - change.listener->itemGeometryChanged(this, newGeometry, oldGeometry); - } + QQuickGeometryChange change; + QRectF diff(newGeometry.x() - oldGeometry.x(), + newGeometry.y() - oldGeometry.y(), + newGeometry.width() - oldGeometry.width(), + newGeometry.height() - oldGeometry.height()); + change.setXChange(diff.x() != 0); + change.setYChange(diff.y() != 0); + change.setWidthChange(diff.width() != 0); + change.setHeightChange(diff.height() != 0); + + for (const QQuickItemPrivate::ChangeListener &listener : qAsConst(d->changeListeners)) { + if (listener.types & QQuickItemPrivate::Geometry) { + if (change.matches(listener.gTypes)) + listener.listener->itemGeometryChanged(this, change, diff); } } - if (xChange) + if (change.xChange()) emit xChanged(); - if (yChange) + if (change.yChange()) emit yChanged(); - if (widthChange) + if (change.widthChange()) emit widthChanged(); - if (heightChange) + if (change.heightChange()) emit heightChanged(); } @@ -3820,7 +3818,8 @@ void QQuickItemPrivate::removeItemChangeListener(QQuickItemChangeListener *liste changeListeners.removeOne(change); } -void QQuickItemPrivate::updateOrAddGeometryChangeListener(QQuickItemChangeListener *listener, GeometryChangeTypes types) +void QQuickItemPrivate::updateOrAddGeometryChangeListener(QQuickItemChangeListener *listener, + QQuickGeometryChange types) { ChangeListener change(listener, types); int index = changeListeners.indexOf(change); @@ -3831,10 +3830,10 @@ void QQuickItemPrivate::updateOrAddGeometryChangeListener(QQuickItemChangeListen } void QQuickItemPrivate::updateOrRemoveGeometryChangeListener(QQuickItemChangeListener *listener, - GeometryChangeTypes types) + QQuickGeometryChange types) { ChangeListener change(listener, types); - if (types == NoChange) { + if (types.noChange()) { changeListeners.removeOne(change); } else { int index = changeListeners.indexOf(change); @@ -8118,7 +8117,7 @@ void QQuickItemLayer::itemOpacityChanged(QQuickItem *item) updateOpacity(); } -void QQuickItemLayer::itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) +void QQuickItemLayer::itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) { updateGeometry(); } |