From e2c296c46b3f922ed12f83b166b1493dfded480e Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 11 Apr 2016 12:44:00 +0200 Subject: 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 Reviewed-by: Robin Burchell --- src/quick/items/qquickanchors.cpp | 32 +++++++-------- src/quick/items/qquickanchors_p_p.h | 4 +- src/quick/items/qquickdrag.cpp | 7 ++-- src/quick/items/qquickflickable.cpp | 6 +-- src/quick/items/qquickflickable_p_p.h | 2 +- src/quick/items/qquickitem.cpp | 53 ++++++++++++------------- src/quick/items/qquickitem_p.h | 26 ++++-------- src/quick/items/qquickitemchangelistener_p.h | 59 +++++++++++++++++++++++++++- src/quick/items/qquickitemview.cpp | 5 ++- src/quick/items/qquickitemview_p_p.h | 2 +- src/quick/items/qquicklistview.cpp | 26 ++++++------ src/quick/items/qquickloader.cpp | 5 ++- src/quick/items/qquickloader_p_p.h | 2 +- src/quick/items/qquickpathview_p_p.h | 5 +-- src/quick/items/qquickpositioners_p_p.h | 4 +- src/quick/items/qquickshadereffectsource.cpp | 4 +- src/quick/items/qquickshadereffectsource_p.h | 2 +- src/quick/items/qquickview.cpp | 5 ++- src/quick/items/qquickview_p.h | 2 +- 19 files changed, 150 insertions(+), 101 deletions(-) (limited to 'src/quick') diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp index 4cbd41106e..b6978e534e 100644 --- a/src/quick/items/qquickanchors.cpp +++ b/src/quick/items/qquickanchors.cpp @@ -285,26 +285,26 @@ void QQuickAnchorsPrivate::clearItem(QQuickItem *item) } } -int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem) +QQuickGeometryChange QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem) { - QQuickItemPrivate::GeometryChangeTypes dependency = QQuickItemPrivate::NoChange; + QQuickGeometryChange dependency; if (!controlItem || inDestructor) return dependency; if (fill == controlItem) { if (controlItem == readParentItem(item)) - dependency |= QQuickItemPrivate::SizeChange; + dependency.setSizeChange(true); else //sibling - dependency |= QQuickItemPrivate::GeometryChange; + dependency.setAllChanged(true); return dependency; //exit early } if (centerIn == controlItem) { if (controlItem == readParentItem(item)) - dependency |= QQuickItemPrivate::SizeChange; + dependency.setSizeChange(true); else //sibling - dependency |= QQuickItemPrivate::GeometryChange; + dependency.setAllChanged(true); return dependency; //exit early } @@ -312,9 +312,9 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem) (usedAnchors & QQuickAnchors::RightAnchor && rightAnchorItem == controlItem) || (usedAnchors & QQuickAnchors::HCenterAnchor && hCenterAnchorItem == controlItem)) { if (controlItem == readParentItem(item)) - dependency |= QQuickItemPrivate::WidthChange; + dependency.setWidthChange(true); else //sibling - dependency |= QFlags(QQuickItemPrivate::XChange | QQuickItemPrivate::WidthChange); + dependency.setHorizontalChange(true); } if ((usedAnchors & QQuickAnchors::TopAnchor && topAnchorItem == controlItem) || @@ -322,9 +322,9 @@ int QQuickAnchorsPrivate::calculateDependency(QQuickItem *controlItem) (usedAnchors & QQuickAnchors::VCenterAnchor && vCenterAnchorItem == controlItem) || (usedAnchors & QQuickAnchors::BaselineAnchor && baselineAnchorItem == controlItem)) { if (controlItem == readParentItem(item)) - dependency |= QQuickItemPrivate::HeightChange; + dependency.setHeightChange(true); else //sibling - dependency |= QFlags(QQuickItemPrivate::YChange | QQuickItemPrivate::HeightChange); + dependency.setVerticalChange(true); } return dependency; @@ -336,7 +336,7 @@ void QQuickAnchorsPrivate::addDepend(QQuickItem *item) return; QQuickItemPrivate *p = QQuickItemPrivate::get(item); - p->updateOrAddGeometryChangeListener(this, QFlags(calculateDependency(item))); + p->updateOrAddGeometryChangeListener(this, calculateDependency(item)); } void QQuickAnchorsPrivate::remDepend(QQuickItem *item) @@ -345,7 +345,7 @@ void QQuickAnchorsPrivate::remDepend(QQuickItem *item) return; QQuickItemPrivate *p = QQuickItemPrivate::get(item); - p->updateOrRemoveGeometryChangeListener(this, QFlags(calculateDependency(item))); + p->updateOrRemoveGeometryChangeListener(this, calculateDependency(item)); } bool QQuickAnchors::mirrored() @@ -492,7 +492,7 @@ void QQuickAnchorsPrivate::update() } } -void QQuickAnchorsPrivate::itemGeometryChanged(QQuickItem *, const QRectF &newG, const QRectF &oldG) +void QQuickAnchorsPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange change, const QRectF &) { if (!isItemComplete()) return; @@ -502,11 +502,9 @@ void QQuickAnchorsPrivate::itemGeometryChanged(QQuickItem *, const QRectF &newG, } else if (centerIn) { centerInChanged(); } else { - if ((usedAnchors & QQuickAnchors::Horizontal_Mask) - && (newG.x() != oldG.x() || newG.width() != oldG.width())) + if ((usedAnchors & QQuickAnchors::Horizontal_Mask) && change.horizontalChange()) updateHorizontalAnchors(); - if ((usedAnchors & QQuickAnchors::Vertical_Mask) - && (newG.y() != oldG.y() || newG.height() != oldG.height())) + if ((usedAnchors & QQuickAnchors::Vertical_Mask) && change.verticalChange()) updateVerticalAnchors(); } } diff --git a/src/quick/items/qquickanchors_p_p.h b/src/quick/items/qquickanchors_p_p.h index da659946c0..3357e134bf 100644 --- a/src/quick/items/qquickanchors_p_p.h +++ b/src/quick/items/qquickanchors_p_p.h @@ -124,7 +124,7 @@ public: void clearItem(QQuickItem *); - int calculateDependency(QQuickItem *); + QQuickGeometryChange calculateDependency(QQuickItem *); void addDepend(QQuickItem *); void remDepend(QQuickItem *); bool isItemComplete() const; @@ -141,7 +141,7 @@ public: void updateMe(); // QQuickItemGeometryListener interface - void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) Q_DECL_OVERRIDE; QQuickAnchorsPrivate *anchorPrivate() Q_DECL_OVERRIDE { return this; } bool checkHValid() const; diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index cc30199253..8a0af6c263 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -82,7 +82,7 @@ public: { } - void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) Q_DECL_OVERRIDE; void itemParentChanged(QQuickItem *, QQuickItem *parent) Q_DECL_OVERRIDE; void updatePosition(); void restartDrag(); @@ -148,9 +148,10 @@ public: \sa {Qt Quick Examples - Drag and Drop}, {Qt Quick Examples - externaldraganddrop} */ -void QQuickDragAttachedPrivate::itemGeometryChanged(QQuickItem *, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickDragAttachedPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange change, + const QRectF &) { - if (newGeometry.topLeft() == oldGeometry.topLeft() || !active || itemMoved) + if (!change.positionChange() || !active || itemMoved) return; updatePosition(); } diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 1bcc3cc0f9..a09088dfed 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -292,14 +292,14 @@ void QQuickFlickablePrivate::AxisData::updateVelocity() } } -void QQuickFlickablePrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeom, const QRectF &oldGeom) +void QQuickFlickablePrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) { Q_Q(QQuickFlickable); if (item == contentItem) { Qt::Orientations orient = 0; - if (newGeom.x() != oldGeom.x()) + if (change.xChange()) orient |= Qt::Horizontal; - if (newGeom.y() != oldGeom.y()) + if (change.yChange()) orient |= Qt::Vertical; if (orient) q->viewportMoved(orient); diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index 3d2b32286f..ac1e39d829 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -194,7 +194,7 @@ public: qreal overShootDistance(qreal size); - void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) Q_DECL_OVERRIDE; void draggingStarting(); void draggingEnding(); 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(); } diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index de4dfc9cd7..9ea2712e18 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -98,7 +98,7 @@ public: void complete(); protected: - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE; void itemDestroyed(QQuickItem *item) Q_DECL_OVERRIDE; void itemChildAdded(QQuickItem *, QQuickItem *) Q_DECL_OVERRIDE; void itemChildRemoved(QQuickItem *, QQuickItem *) Q_DECL_OVERRIDE; @@ -188,7 +188,7 @@ public: QQuickShaderEffectSource *effectSource() const { return m_effectSource; } - void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) Q_DECL_OVERRIDE; void itemOpacityChanged(QQuickItem *) Q_DECL_OVERRIDE; void itemParentChanged(QQuickItem *, QQuickItem *) Q_DECL_OVERRIDE; void itemSiblingOrderChanged(QQuickItem *) Q_DECL_OVERRIDE; @@ -318,24 +318,12 @@ public: Q_DECLARE_FLAGS(ChangeTypes, ChangeType) - enum GeometryChangeType { - NoChange = 0, - XChange = 0x01, - YChange = 0x02, - WidthChange = 0x04, - HeightChange = 0x08, - SizeChange = WidthChange | HeightChange, - GeometryChange = XChange | YChange | SizeChange - }; - - Q_DECLARE_FLAGS(GeometryChangeTypes, GeometryChangeType) - struct ChangeListener { - ChangeListener(QQuickItemChangeListener *l = Q_NULLPTR, QQuickItemPrivate::ChangeTypes t = 0) : listener(l), types(t), gTypes(GeometryChange) {} - ChangeListener(QQuickItemChangeListener *l, QQuickItemPrivate::GeometryChangeTypes gt) : listener(l), types(Geometry), gTypes(gt) {} + ChangeListener(QQuickItemChangeListener *l = nullptr, QQuickItemPrivate::ChangeTypes t = 0) : listener(l), types(t), gTypes(QQuickGeometryChange::All) {} + ChangeListener(QQuickItemChangeListener *l, QQuickGeometryChange gt) : listener(l), types(Geometry), gTypes(gt) {} QQuickItemChangeListener *listener; QQuickItemPrivate::ChangeTypes types; - QQuickItemPrivate::GeometryChangeTypes gTypes; //NOTE: not used for == + QQuickGeometryChange gTypes; //NOTE: not used for == bool operator==(const ChangeListener &other) const { return listener == other.listener && types == other.types; } }; @@ -389,8 +377,8 @@ public: void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types); void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types); - void updateOrAddGeometryChangeListener(QQuickItemChangeListener *listener, GeometryChangeTypes types); - void updateOrRemoveGeometryChangeListener(QQuickItemChangeListener *listener, GeometryChangeTypes types); + void updateOrAddGeometryChangeListener(QQuickItemChangeListener *listener, QQuickGeometryChange types); + void updateOrRemoveGeometryChangeListener(QQuickItemChangeListener *listener, QQuickGeometryChange types); QQuickStateGroup *_states(); QQuickStateGroup *_stateGroup; diff --git a/src/quick/items/qquickitemchangelistener_p.h b/src/quick/items/qquickitemchangelistener_p.h index 6e3ef25506..7a4949fc0b 100644 --- a/src/quick/items/qquickitemchangelistener_p.h +++ b/src/quick/items/qquickitemchangelistener_p.h @@ -58,12 +58,69 @@ QT_BEGIN_NAMESPACE class QRectF; class QQuickItem; class QQuickAnchorsPrivate; + +class QQuickGeometryChange +{ +public: + enum Kind: int { + Nothing = 0x00, + X = 0x01, + Y = 0x02, + Width = 0x04, + Height = 0x08, + + Size = Width | Height, + All = X | Y | Size + }; + + QQuickGeometryChange(int change = Nothing) + : kind(change) + {} + + bool noChange() const { return kind == Nothing; } + bool anyChange() const { return !noChange(); } + + bool xChange() const { return kind & X; } + bool yChange() const { return kind & Y; } + bool widthChange() const { return kind & Width; } + bool heightChange() const { return kind & Height; } + + bool positionChange() const { return xChange() || yChange(); } + bool sizeChange() const { return widthChange() || heightChange(); } + + bool horizontalChange() const { return xChange() || widthChange(); } + bool verticalChange() const { return yChange() || heightChange(); } + + void setXChange(bool enabled) { set(X, enabled); } + void setYChange(bool enabled) { set(Y, enabled); } + void setWidthChange(bool enabled) { set(Width, enabled); } + void setHeightChange(bool enabled) { set(Height, enabled); } + void setSizeChange(bool enabled) { set(Size, enabled); } + void setAllChanged(bool enabled) { set(All, enabled); } + void setHorizontalChange(bool enabled) { set(X | Width, enabled); } + void setVerticalChange(bool enabled) { set(Y | Height, enabled); } + + void set(int bits, bool enabled) + { + if (enabled) { + kind |= bits; + } else { + kind &= ~bits; + } + } + + bool matches(QQuickGeometryChange other) const { return kind & other.kind; } + +private: + int kind; +}; + class QQuickItemChangeListener { public: virtual ~QQuickItemChangeListener() {} - virtual void itemGeometryChanged(QQuickItem *, const QRectF & /* new */, const QRectF & /* old */ ) {} + virtual void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) {} virtual void itemSiblingOrderChanged(QQuickItem *) {} virtual void itemVisibilityChanged(QQuickItem *) {} virtual void itemOpacityChanged(QQuickItem *) {} diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index aff03b7539..3c1a5a6ebe 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1205,10 +1205,11 @@ void QQuickItemViewPrivate::showVisibleItems() const } } -void QQuickItemViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickItemViewPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, + const QRectF &diff) { Q_Q(QQuickItemView); - QQuickFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry); + QQuickFlickablePrivate::itemGeometryChanged(item, change, diff); if (!q->isComponentComplete()) return; diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 5e104cf208..0893d6e749 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -378,7 +378,7 @@ protected: virtual void updateSectionCriteria() {} virtual void updateSections() {} - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE; }; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 4b9b7df98a..cdbac55fa6 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -131,7 +131,7 @@ public: void updateAverage(); - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) Q_DECL_OVERRIDE; void fixupPosition() Q_DECL_OVERRIDE; void fixup(AxisData &data, qreal minExtent, qreal maxExtent) Q_DECL_OVERRIDE; bool flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, @@ -1400,10 +1400,12 @@ bool QQuickListViewPrivate::hasStickyFooter() const return footer && footerPositioning != QQuickListView::InlineFooter; } -void QQuickListViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickListViewPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, + const QRectF &diff) { Q_Q(QQuickListView); - QQuickItemViewPrivate::itemGeometryChanged(item, newGeometry, oldGeometry); + + QQuickItemViewPrivate::itemGeometryChanged(item, change, diff); if (!q->isComponentComplete()) return; @@ -1417,29 +1419,31 @@ void QQuickListViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF & } if (item != contentItem && (!highlight || item != highlight->item)) { - if ((orient == QQuickListView::Vertical && newGeometry.height() != oldGeometry.height()) - || (orient == QQuickListView::Horizontal && newGeometry.width() != oldGeometry.width())) { + if ((orient == QQuickListView::Vertical && change.heightChange()) + || (orient == QQuickListView::Horizontal && change.widthChange())) { // if visibleItems.first() has resized, adjust its pos since it is used to // position all subsequent items if (visibleItems.count() && item == visibleItems.first()->item) { FxListItemSG *listItem = static_cast(visibleItems.first()); + const QRectF oldGeometry(x - diff.x(), + y - diff.y(), + width - diff.width(), + height - diff.height()); if (listItem->transitionScheduledOrRunning()) return; if (orient == QQuickListView::Vertical) { const qreal oldItemEndPosition = verticalLayoutDirection == QQuickItemView::BottomToTop ? -oldGeometry.y() : oldGeometry.y() + oldGeometry.height(); - qreal diff = newGeometry.height() - oldGeometry.height(); if (verticalLayoutDirection == QQuickListView::TopToBottom && oldItemEndPosition < q->contentY()) - listItem->setPosition(listItem->position() - diff, true); + listItem->setPosition(listItem->position() - diff.height(), true); else if (verticalLayoutDirection == QQuickListView::BottomToTop && oldItemEndPosition > q->contentY()) - listItem->setPosition(listItem->position() + diff, true); + listItem->setPosition(listItem->position() + diff.height(), true); } else { const qreal oldItemEndPosition = q->effectiveLayoutDirection() == Qt::RightToLeft ? -oldGeometry.x() : oldGeometry.x() + oldGeometry.width(); - qreal diff = newGeometry.width() - oldGeometry.width(); if (q->effectiveLayoutDirection() == Qt::LeftToRight && oldItemEndPosition < q->contentX()) - listItem->setPosition(listItem->position() - diff, true); + listItem->setPosition(listItem->position() - diff.width(), true); else if (q->effectiveLayoutDirection() == Qt::RightToLeft && oldItemEndPosition > q->contentX()) - listItem->setPosition(listItem->position() + diff, true); + listItem->setPosition(listItem->position() + diff.width(), true); } } forceLayoutPolish(); diff --git a/src/quick/items/qquickloader.cpp b/src/quick/items/qquickloader.cpp index 63c9558d7a..9aea9c50df 100644 --- a/src/quick/items/qquickloader.cpp +++ b/src/quick/items/qquickloader.cpp @@ -65,11 +65,12 @@ QQuickLoaderPrivate::~QQuickLoaderPrivate() disposeInitialPropertyValues(); } -void QQuickLoaderPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickLoaderPrivate::itemGeometryChanged(QQuickItem *resizeItem, QQuickGeometryChange change + , const QRectF &diff) { if (resizeItem == item) _q_updateSize(false); - QQuickItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry); + QQuickItemChangeListener::itemGeometryChanged(resizeItem, change, diff); } void QQuickLoaderPrivate::itemImplicitWidthChanged(QQuickItem *) diff --git a/src/quick/items/qquickloader_p_p.h b/src/quick/items/qquickloader_p_p.h index 9ef89a74d6..fcccbfe4f5 100644 --- a/src/quick/items/qquickloader_p_p.h +++ b/src/quick/items/qquickloader_p_p.h @@ -84,7 +84,7 @@ public: QQuickLoaderPrivate(); ~QQuickLoaderPrivate(); - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) Q_DECL_OVERRIDE; void itemImplicitWidthChanged(QQuickItem *) Q_DECL_OVERRIDE; void itemImplicitHeightChanged(QQuickItem *) Q_DECL_OVERRIDE; void clear(); diff --git a/src/quick/items/qquickpathview_p_p.h b/src/quick/items/qquickpathview_p_p.h index 652af3487f..0441603a4b 100644 --- a/src/quick/items/qquickpathview_p_p.h +++ b/src/quick/items/qquickpathview_p_p.h @@ -76,9 +76,8 @@ public: void init(); - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE { - if ((newGeometry.size() != oldGeometry.size()) - && (!highlightItem || item != highlightItem)) { + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE { + if (change.sizeChange() && (!highlightItem || item != highlightItem)) { if (QQuickPathViewAttached *att = attached(item)) att->m_percent = -1; scheduleLayout(); diff --git a/src/quick/items/qquickpositioners_p_p.h b/src/quick/items/qquickpositioners_p_p.h index f0fbac2df7..d18f9b3724 100644 --- a/src/quick/items/qquickpositioners_p_p.h +++ b/src/quick/items/qquickpositioners_p_p.h @@ -137,9 +137,9 @@ public: setPositioningDirty(); } - void itemGeometryChanged(QQuickItem *, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE + void itemGeometryChanged(QQuickItem *, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE { - if (newGeometry.size() != oldGeometry.size()) + if (change.sizeChange()) setPositioningDirty(); } diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index d74dd99fe8..a60a06f59a 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -308,11 +308,11 @@ QQuickItem *QQuickShaderEffectSource::sourceItem() const return m_sourceItem; } -void QQuickShaderEffectSource::itemGeometryChanged(QQuickItem *item, const QRectF &newRect, const QRectF &oldRect) +void QQuickShaderEffectSource::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) { Q_ASSERT(item == m_sourceItem); Q_UNUSED(item); - if (newRect.size() != oldRect.size()) + if (change.sizeChange()) update(); } diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h index de62c21488..ee18bf195a 100644 --- a/src/quick/items/qquickshadereffectsource_p.h +++ b/src/quick/items/qquickshadereffectsource_p.h @@ -168,7 +168,7 @@ protected: void releaseResources() Q_DECL_OVERRIDE; QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) Q_DECL_OVERRIDE; - void itemGeometryChanged(QQuickItem *item, const QRectF &newRect, const QRectF &oldRect) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE; void itemChange(ItemChange change, const ItemChangeData &value) Q_DECL_OVERRIDE; private: diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index 1101b88992..0ed9167fb2 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -131,14 +131,15 @@ void QQuickViewPrivate::execute() } } -void QQuickViewPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRectF &newGeometry, const QRectF &oldGeometry) +void QQuickViewPrivate::itemGeometryChanged(QQuickItem *resizeItem, QQuickGeometryChange change, + const QRectF &diff) { Q_Q(QQuickView); if (resizeItem == root && resizeMode == QQuickView::SizeViewToRootObject) { // wait for both width and height to be changed resizetimer.start(0,q); } - QQuickItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry); + QQuickItemChangeListener::itemGeometryChanged(resizeItem, change, diff); } /*! diff --git a/src/quick/items/qquickview_p.h b/src/quick/items/qquickview_p.h index 1bbff0de0e..c21468ef53 100644 --- a/src/quick/items/qquickview_p.h +++ b/src/quick/items/qquickview_p.h @@ -88,7 +88,7 @@ public: ~QQuickViewPrivate(); void execute(); - void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) Q_DECL_OVERRIDE; void initResize(); void updateSize(); void setRootObject(QObject *); -- cgit v1.2.3