diff options
author | Bea Lam <bea.lam@nokia.com> | 2012-01-13 14:35:04 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-18 00:16:46 +0100 |
commit | 52c1d7a994216f0b37ac04a2fea4337bc0c7550b (patch) | |
tree | d5301c513511a2595ece9ce533a3eb78d507c2a7 /src/quick/items/qquickitemview_p_p.h | |
parent | 6a5b9cb96434b5e36646fdbe66b23d0c6a1bdcd1 (diff) |
Insertions were calculating wrong insertion pos
After removes, and after each insertion, the view must adjust the
visibleItems.first() position and call layoutVisibleItems() to ensure
that the correct insertion position is calculated for insertions that
follow.
When applyInsertionChange() in GridView and ListView calculates the
position for item insertion, it looks at the current positions of the
items in visibleItems, so these positions must be updated prior to
this calculation. Otherwise, insertions that follow a remove may not
calculate this position correctly and will neglect to add some items,
and multiple insertions may unnecessarily create items at positions that
are not actually visible.
resetFirstItemPosition() is changed to take a set position and it
replaces resetItemPosition() since it can do the same thing.
Task-number: QTBUG-23610 QTBUG-23609
Change-Id: I8839ee7d15853301435e80c0dc563f93fc3605cf
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickitemview_p_p.h')
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index a81aa6f54d..a2dd963dd2 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -103,9 +103,10 @@ public: QDeclarativeNullableValue<qreal> visiblePos; qreal sizeChangesBeforeVisiblePos; qreal sizeChangesAfterVisiblePos; + bool changedFirstItem; ChangeResult(const QDeclarativeNullableValue<qreal> &p) - : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0) {} + : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0), changedFirstItem(false) {} }; enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 }; @@ -147,6 +148,8 @@ public: void applyPendingChanges(); bool applyModelChanges(); bool applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *changeResult, int *removedCount); + void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos, + FxViewItem *prevFirstVisible, const ChangeResult &insertionResult, const ChangeResult &removalResult); void checkVisible() const; @@ -236,13 +239,12 @@ protected: virtual FxViewItem *newViewItem(int index, QQuickItem *item) = 0; virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0; - virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem) = 0; - virtual void resetFirstItemPosition() = 0; + virtual void resetFirstItemPosition(qreal pos = 0.0) = 0; virtual void adjustFirstItem(qreal forwards, qreal backwards) = 0; - virtual void layoutVisibleItems() = 0; + virtual void layoutVisibleItems(int fromModelIndex = 0) = 0; virtual void changedVisibleIndex(int newIndex) = 0; - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *newItems) = 0; + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, QList<FxViewItem *> *newItems) = 0; virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; } |