Section headers ignore list delegate size changes when "colliding"
[profile/ivi/qtdeclarative.git] / src / quick / items / qquickitemview_p_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtQml module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QQUICKITEMVIEW_P_P_H
43 #define QQUICKITEMVIEW_P_P_H
44
45 #include "qquickitemview_p.h"
46 #include "qquickitemviewtransition_p.h"
47 #include "qquickflickable_p_p.h"
48 #include "qquickvisualdatamodel_p.h"
49 #include "qquickvisualitemmodel_p.h"
50 #include <private/qquickchangeset_p.h>
51
52
53 QT_BEGIN_HEADER
54
55 QT_BEGIN_NAMESPACE
56
57 QT_MODULE(Quick)
58
59
60 class FxViewItem
61 {
62 public:
63     FxViewItem(QQuickItem *, bool own, bool trackGeometry);
64     virtual ~FxViewItem();
65
66     qreal itemX() const;
67     qreal itemY() const;
68
69     void moveTo(const QPointF &pos, bool immediate);
70     void setVisible(bool visible);
71
72     QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const;
73     bool transitionScheduledOrRunning() const;
74     bool transitionRunning() const;
75     bool isPendingRemoval() const;
76
77     void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget);
78     bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds);
79     void startTransition(QQuickItemViewTransitioner *transitioner);
80
81     // these are positions and sizes along the current direction of scrolling/flicking
82     virtual qreal position() const = 0;
83     virtual qreal endPosition() const = 0;
84     virtual qreal size() const = 0;
85     virtual qreal sectionSize() const = 0;
86
87     virtual bool contains(qreal x, qreal y) const = 0;
88
89     QQuickItem *item;
90     QQuickItemViewTransitionableItem *transitionableItem;
91     QQuickItemViewAttached *attached;
92     int index;
93     bool ownItem;
94     bool releaseAfterTransition;
95     bool trackGeom;
96 };
97
98
99 class QQuickItemViewChangeSet
100 {
101 public:
102     QQuickItemViewChangeSet();
103
104     bool hasPendingChanges() const;
105     void prepare(int currentIndex, int count);
106     void reset();
107
108     void applyChanges(const QQuickChangeSet &changeSet);
109
110     void applyBufferedChanges(const QQuickItemViewChangeSet &other);
111
112     int itemCount;
113     int newCurrentIndex;
114     QQuickChangeSet pendingChanges;
115     QHash<QQuickChangeSet::MoveKey, FxViewItem *> removedItems;
116
117     bool active : 1;
118     bool currentChanged : 1;
119     bool currentRemoved : 1;
120 };
121
122
123 class QQuickItemViewPrivate : public QQuickFlickablePrivate, public QQuickItemViewTransitionChangeListener, public QAnimationJobChangeListener
124 {
125     Q_DECLARE_PUBLIC(QQuickItemView)
126 public:
127     QQuickItemViewPrivate();
128     ~QQuickItemViewPrivate();
129
130     static inline QQuickItemViewPrivate *get(QQuickItemView *o) { return o->d_func(); }
131
132     struct ChangeResult {
133         QQmlNullableValue<qreal> visiblePos;
134         bool changedFirstItem;
135         qreal sizeChangesBeforeVisiblePos;
136         qreal sizeChangesAfterVisiblePos;
137         int countChangeBeforeVisible;
138         int countChangeAfterVisibleItems;
139
140         ChangeResult()
141             : visiblePos(0), changedFirstItem(false),
142               sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
143               countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
144
145         ChangeResult(const QQmlNullableValue<qreal> &p)
146             : visiblePos(p), changedFirstItem(false),
147               sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
148               countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
149
150         ChangeResult &operator+=(const ChangeResult &other) {
151             if (&other == this)
152                 return *this;
153             changedFirstItem &= other.changedFirstItem;
154             sizeChangesBeforeVisiblePos += other.sizeChangesBeforeVisiblePos;
155             sizeChangesAfterVisiblePos += other.sizeChangesAfterVisiblePos;
156             countChangeBeforeVisible += other.countChangeBeforeVisible;
157             countChangeAfterVisibleItems += other.countChangeAfterVisibleItems;
158             return *this;
159         }
160
161         void reset() {
162             changedFirstItem = false;
163             sizeChangesBeforeVisiblePos = 0.0;
164             sizeChangesAfterVisiblePos = 0.0;
165             countChangeBeforeVisible = 0;
166             countChangeAfterVisibleItems = 0;
167         }
168     };
169
170     enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
171     enum MovementReason { Other, SetIndex, Mouse };
172
173     bool isValid() const;
174     qreal position() const;
175     qreal size() const;
176     qreal startPosition() const;
177     qreal endPosition() const;
178     qreal contentStartOffset() const;
179     int findLastVisibleIndex(int defaultValue = -1) const;
180     FxViewItem *visibleItem(int modelIndex) const;
181     FxViewItem *firstVisibleItem() const;
182     int findLastIndexInView() const;
183     int mapFromModel(int modelIndex) const;
184
185     virtual void init();
186     virtual void clear();
187     virtual void updateViewport();
188
189     void regenerate();
190     void layout();
191     virtual void animationFinished(QAbstractAnimationJob *);
192     void refill();
193     void refill(qreal from, qreal to);
194     void mirrorChange();
195
196     FxViewItem *createItem(int modelIndex, bool asynchronous = false);
197     virtual bool releaseItem(FxViewItem *item);
198
199     QQuickItem *createHighlightItem();
200     QQuickItem *createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault = false);
201
202     void updateCurrent(int modelIndex);
203     void updateTrackedItem();
204     void updateUnrequestedIndexes();
205     void updateUnrequestedPositions();
206     void updateVisibleIndex();
207     void positionViewAtIndex(int index, int mode);
208
209     qreal minExtentForAxis(const AxisData &axisData, bool forXAxis) const;
210     qreal maxExtentForAxis(const AxisData &axisData, bool forXAxis) const;
211
212     void applyPendingChanges();
213     bool applyModelChanges(ChangeResult *insertionResult, ChangeResult *removalResult);
214     bool applyRemovalChange(const QQuickChangeSet::Remove &removal, ChangeResult *changeResult, int *removedCount);
215     void removeItem(FxViewItem *item, const QQuickChangeSet::Remove &removal, ChangeResult *removeResult);
216     void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos,
217             FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult);
218
219     void createTransitioner();
220     void prepareVisibleItemTransitions();
221     void prepareRemoveTransitions(QHash<QQuickChangeSet::MoveKey, FxViewItem *> *removedItems);
222     bool prepareNonVisibleItemTransition(FxViewItem *item, const QRectF &viewBounds);
223     virtual void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item);
224
225     int findMoveKeyIndex(QQuickChangeSet::MoveKey key, const QVector<QQuickChangeSet::Remove> &changes) const;
226
227     void checkVisible() const;
228     void showVisibleItems() const;
229
230     void markExtentsDirty() {
231         if (layoutOrientation() == Qt::Vertical)
232             vData.markExtentsDirty();
233         else
234             hData.markExtentsDirty();
235     }
236
237     bool hasPendingChanges() const {
238         return currentChanges.hasPendingChanges()
239                 || bufferedChanges.hasPendingChanges()
240                 ||runDelayedRemoveTransition;
241     }
242
243     void refillOrLayout() {
244         if (hasPendingChanges())
245             layout();
246         else
247             refill();
248     }
249
250     void forceLayoutPolish() {
251         Q_Q(QQuickItemView);
252         forceLayout = true;
253         q->polish();
254     }
255
256     QQmlGuard<QQuickVisualModel> model;
257     QVariant modelVariant;
258     int itemCount;
259     int buffer;
260     int bufferMode;
261     Qt::LayoutDirection layoutDirection;
262     QQuickItemView::VerticalLayoutDirection verticalLayoutDirection;
263
264     MovementReason moveReason;
265
266     QList<FxViewItem *> visibleItems;
267     int visibleIndex;
268     int currentIndex;
269     FxViewItem *currentItem;
270     FxViewItem *trackedItem;
271     QHash<QQuickItem*,int> unrequestedItems;
272     int requestedIndex;
273     QQuickItemViewChangeSet currentChanges;
274     QQuickItemViewChangeSet bufferedChanges;
275     QPauseAnimationJob bufferPause;
276
277     QQmlComponent *highlightComponent;
278     FxViewItem *highlight;
279     int highlightRange;     // enum value
280     qreal highlightRangeStart;
281     qreal highlightRangeEnd;
282     int highlightMoveDuration;
283
284     QQmlComponent *headerComponent;
285     FxViewItem *header;
286     QQmlComponent *footerComponent;
287     FxViewItem *footer;
288
289     struct MovedItem {
290         FxViewItem *item;
291         QQuickChangeSet::MoveKey moveKey;
292         MovedItem(FxViewItem *i, QQuickChangeSet::MoveKey k)
293             : item(i), moveKey(k) {}
294     };
295     QQuickItemViewTransitioner *transitioner;
296     QList<FxViewItem *> releasePendingTransition;
297
298     mutable qreal minExtent;
299     mutable qreal maxExtent;
300
301     bool ownModel : 1;
302     bool wrap : 1;
303     bool inLayout : 1;
304     bool inViewportMoved : 1;
305     bool forceLayout : 1;
306     bool currentIndexCleared : 1;
307     bool haveHighlightRange : 1;
308     bool autoHighlight : 1;
309     bool highlightRangeStartValid : 1;
310     bool highlightRangeEndValid : 1;
311     bool fillCacheBuffer : 1;
312     bool inRequest : 1;
313     bool runDelayedRemoveTransition : 1;
314
315 protected:
316     virtual Qt::Orientation layoutOrientation() const = 0;
317     virtual bool isContentFlowReversed() const = 0;
318
319     virtual qreal positionAt(int index) const = 0;
320     virtual qreal endPositionAt(int index) const = 0;
321     virtual qreal originPosition() const = 0;
322     virtual qreal lastPosition() const = 0;
323
324     virtual qreal headerSize() const = 0;
325     virtual qreal footerSize() const = 0;
326     virtual bool showHeaderForIndex(int index) const = 0;
327     virtual bool showFooterForIndex(int index) const = 0;
328     virtual void updateHeader() = 0;
329     virtual void updateFooter() = 0;
330
331     virtual void createHighlight() = 0;
332     virtual void updateHighlight() = 0;
333     virtual void resetHighlightPosition() = 0;
334
335     virtual void setPosition(qreal pos) = 0;
336     virtual void fixupPosition() = 0;
337
338     virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, qreal bufferFrom, qreal bufferTo, bool doBuffer) = 0;
339     virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo) = 0;
340     virtual void visibleItemsChanged() {}
341
342     virtual FxViewItem *newViewItem(int index, QQuickItem *item) = 0;
343     virtual void repositionItemAt(FxViewItem *item, int index, qreal sizeBuffer) = 0;
344     virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0;
345     virtual void resetFirstItemPosition(qreal pos = 0.0) = 0;
346     virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) = 0;
347
348     virtual void layoutVisibleItems(int fromModelIndex = 0) = 0;
349     virtual void changedVisibleIndex(int newIndex) = 0;
350
351     virtual bool applyInsertionChange(const QQuickChangeSet::Insert &insert, ChangeResult *changeResult,
352                 QList<FxViewItem *> *newItems, QList<MovedItem> *movingIntoView) = 0;
353
354     virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; }
355     virtual void translateAndTransitionItemsAfter(int afterIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) = 0;
356
357     virtual void initializeViewItem(FxViewItem *) {}
358     virtual void initializeCurrentItem() {}
359     virtual void updateSectionCriteria() {}
360     virtual void updateSections() {}
361
362     virtual void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
363 };
364
365
366 QT_END_NAMESPACE
367
368 QT_END_HEADER
369
370 #endif // QQUICKITEMVIEW_P_P_H