6#include <QtQuick/private/qquicktransition_p.h>
7#include <QtQml/QQmlInfo>
8#include "qplatformdefs.h"
15#ifndef QML_VIEW_DEFAULTCACHEBUFFER
16#define QML_VIEW_DEFAULTCACHEBUFFER 320
75 }
else if (moveId ==
i.moveId) {
84 if (!
other.hasPendingChanges())
138 return d->currentItem ?
d->currentItem->item :
nullptr;
144 return d->modelVariant;
154 if (
d->modelVariant ==
model)
172 d->setPosition(
d->contentStartOffset());
177 if (
object && (vim = qobject_cast<QQmlInstanceModel *>(
object))) {
193 dataModel->setModel(
model);
206 d->updateSectionCriteria();
210 d->currentIndex = -2;
214#if QT_CONFIG(quick_viewtransitions)
215 if (
d->transitioner &&
d->transitioner->populateTransition) {
216 d->transitioner->setPopulateTransitionEnabled(
true);
217 d->forceLayoutPolish();
237 return dataModel->delegate();
255 int oldCount = dataModel->
count();
257 if (oldCount != dataModel->count())
261 d->delegateValidated =
false;
270 return d->model->count();
276 return d->currentIndex;
284 d->currentIndexCleared = (
index == -1);
286 d->applyPendingChanges();
287 if (
index ==
d->currentIndex)
292 }
else if (
d->currentIndex !=
index) {
317 return d->explicitKeyNavigationEnabled ?
d->keyNavigationEnabled :
d->interactive;
324 const bool wasImplicit = !
d->explicitKeyNavigationEnabled;
328 d->explicitKeyNavigationEnabled =
true;
333 emit keyNavigationEnabledChanged();
347 qmlWarning(
this) <<
"Cannot set a negative cache buffer";
351 if (
d->buffer !=
b) {
364 return d->displayMarginBeginning;
370 if (
d->displayMarginBeginning != margin) {
371 d->displayMarginBeginning = margin;
373 d->forceLayoutPolish();
382 return d->displayMarginEnd;
388 if (
d->displayMarginEnd != margin) {
389 d->displayMarginEnd = margin;
391 d->forceLayoutPolish();
400 return d->layoutDirection;
417 if (
d->effectiveLayoutMirror)
420 return d->layoutDirection;
426 return d->verticalLayoutDirection;
442 return d->headerComponent;
448 return d->header ?
d->header->item :
nullptr;
454 if (
d->headerComponent != headerComponent) {
455 d->applyPendingChanges();
458 d->headerComponent = headerComponent;
460 d->markExtentsDirty();
477 return d->footerComponent;
483 return d->footer ?
d->footer->item :
nullptr;
489 if (
d->footerComponent != footerComponent) {
490 d->applyPendingChanges();
493 d->footerComponent = footerComponent;
509 return d->highlightComponent;
515 if (highlightComponent !=
d->highlightComponent) {
516 d->applyPendingChanges();
517 d->highlightComponent = highlightComponent;
518 d->createHighlight();
520 d->updateHighlight();
528 return d->highlight ?
d->highlight->item :
nullptr;
534 return d->autoHighlight;
540 if (
d->autoHighlight != autoHighlight) {
541 d->autoHighlight = autoHighlight;
543 d->updateHighlight();
557 if (
d->highlightRange ==
mode)
559 d->highlightRange =
mode;
560 d->haveHighlightRange =
d->highlightRange !=
NoHighlightRange &&
d->highlightRangeStart <=
d->highlightRangeEnd;
573 return d->highlightRangeStart;
579 d->highlightRangeStartValid =
true;
580 if (
d->highlightRangeStart ==
start)
582 d->highlightRangeStart =
start;
583 d->haveHighlightRange =
d->highlightRange !=
NoHighlightRange &&
d->highlightRangeStart <=
d->highlightRangeEnd;
597 d->highlightRangeStartValid =
false;
598 if (
d->highlightRangeStart == 0)
600 d->highlightRangeStart = 0;
614 return d->highlightRangeEnd;
620 d->highlightRangeEndValid =
true;
621 if (
d->highlightRangeEnd ==
end)
623 d->highlightRangeEnd =
end;
624 d->haveHighlightRange =
d->highlightRange !=
NoHighlightRange &&
d->highlightRangeStart <=
d->highlightRangeEnd;
638 d->highlightRangeEndValid =
false;
639 if (
d->highlightRangeEnd == 0)
641 d->highlightRangeEnd = 0;
655 return d->highlightMoveDuration;
661 if (
d->highlightMoveDuration != duration) {
662 d->highlightMoveDuration = duration;
680 if (!reuse &&
d->model) {
683 d->model->drainReusableItemsPool(0);
686 emit reuseItemsChanged();
689#if QT_CONFIG(quick_viewtransitions)
693 return d->transitioner ?
d->transitioner->populateTransition :
nullptr;
699 d->createTransitioner();
700 if (
d->transitioner->populateTransition != transition) {
701 d->transitioner->populateTransition = transition;
702 emit populateTransitionChanged();
709 return d->transitioner ?
d->transitioner->addTransition :
nullptr;
715 d->createTransitioner();
716 if (
d->transitioner->addTransition != transition) {
717 d->transitioner->addTransition = transition;
718 emit addTransitionChanged();
725 return d->transitioner ?
d->transitioner->addDisplacedTransition :
nullptr;
731 d->createTransitioner();
732 if (
d->transitioner->addDisplacedTransition != transition) {
733 d->transitioner->addDisplacedTransition = transition;
734 emit addDisplacedTransitionChanged();
741 return d->transitioner ?
d->transitioner->moveTransition :
nullptr;
747 d->createTransitioner();
748 if (
d->transitioner->moveTransition != transition) {
749 d->transitioner->moveTransition = transition;
750 emit moveTransitionChanged();
757 return d->transitioner ?
d->transitioner->moveDisplacedTransition :
nullptr;
760void QQuickItemView::setMoveDisplacedTransition(
QQuickTransition *transition)
763 d->createTransitioner();
764 if (
d->transitioner->moveDisplacedTransition != transition) {
765 d->transitioner->moveDisplacedTransition = transition;
766 emit moveDisplacedTransitionChanged();
773 return d->transitioner ?
d->transitioner->removeTransition :
nullptr;
779 d->createTransitioner();
780 if (
d->transitioner->removeTransition != transition) {
781 d->transitioner->removeTransition = transition;
782 emit removeTransitionChanged();
789 return d->transitioner ?
d->transitioner->removeDisplacedTransition :
nullptr;
792void QQuickItemView::setRemoveDisplacedTransition(
QQuickTransition *transition)
795 d->createTransitioner();
796 if (
d->transitioner->removeDisplacedTransition != transition) {
797 d->transitioner->removeDisplacedTransition = transition;
798 emit removeDisplacedTransitionChanged();
805 return d->transitioner ?
d->transitioner->displacedTransition :
nullptr;
811 d->createTransitioner();
812 if (
d->transitioner->displacedTransition != transition) {
813 d->transitioner->displacedTransition = transition;
814 emit displacedTransitionChanged();
832 const auto viewSize =
size();
862 pos = itemPos - (viewSize -
item->size())/2;
865 pos = itemPos - viewSize +
item->size();
866 if (
footer && (
index >= modelCount || stickyFooter))
870 if (itemPos >
pos + viewSize - stickyFooterSize)
871 pos =
item->endPosition() - viewSize + stickyFooterSize;
872 else if (
item->endPosition() <=
pos - stickyHeaderSize)
873 pos = itemPos - stickyHeaderSize;
876 if (
item->endPosition() >=
pos + viewSize + stickyFooterSize)
877 pos = itemPos - viewSize +
item->size() + stickyFooterSize;
878 if (itemPos - stickyHeaderSize <
pos)
879 pos = itemPos - stickyHeaderSize;
903 if (!
d->isValid() || index < 0 || index >=
d->model->count())
922 d->positionViewAtIndex(
d->model->count(),
End);
955void QQuickItemView::forceLayout()
971 for (
int i=0;
i<changes.size();
i++) {
972 for (
int j=changes[
i].
index;
j<changes[
i].index + changes[
i].count;
j++) {
973 if (changes[
i].moveKey(
j) ==
key)
984 qreal highlightStart;
986 qreal endPositionFirstItem = 0;
996 qreal maxExtentAlongAxis = forXAxis ?
q->maxXExtent() :
q->maxYExtent();
997 if (extent < maxExtentAlongAxis)
998 extent = maxExtentAlongAxis;
1006 extent += highlightStart;
1011 ?
qMin(extent, endPositionFirstItem + highlightEnd)
1012 :
qMax(extent, -(endPositionFirstItem - highlightEnd));
1021 qreal highlightStart;
1023 qreal lastItemPosition = 0;
1038 extent += forXAxis ?
q->width() :
q->height();
1040 extent = -(lastItemPosition - highlightStart);
1041 if (highlightEnd != highlightStart) {
1047 extent = -(
endPosition() - (forXAxis ?
q->width() :
q->height()));
1055 qreal minExtentAlongAxis = forXAxis ?
q->minXExtent() :
q->minYExtent();
1056 if (extent > minExtentAlongAxis)
1057 extent = minExtentAlongAxis;
1110 if (
item->index == -1) {
1121 qDebug() <<
"Visible items:";
1124 <<
item->item->objectName()
1125 <<
item->position();
1130 const QRectF &oldGeometry)
1134 if (!
q->isComponentComplete())
1141 if (!
q->isMoving() && !
q->isFlicking())
1147 if (!
q->isMoving() && !
q->isFlicking())
1155#if QT_CONFIG(quick_viewtransitions)
1158 if (actualItem && actualItem->transitionRunning())
1167 q->trackedPositionChanged();
1174#if QT_CONFIG(quick_viewtransitions)
1175 bool hasRemoveTransition =
false;
1176 bool hasRemoveTransitionAsTarget =
false;
1177 if (
d->transitioner) {
1184 it !=
d->visibleItems.end();) {
1186 if (
item->index == -1 && (!
item->attached ||
item->attached->delayRemove() ==
false)) {
1187#if QT_CONFIG(quick_viewtransitions)
1188 if (hasRemoveTransitionAsTarget) {
1190 d->runDelayedRemoveTransition =
true;
1194 if (hasRemoveTransition)
1195 d->runDelayedRemoveTransition =
true;
1197 d->releaseItem(
item,
d->reusableFlag);
1198 it =
d->visibleItems.erase(
it);
1199#if QT_CONFIG(quick_viewtransitions)
1208 d->forceLayoutPolish();
1216#if QT_CONFIG(quick_viewtransitions)
1217 if (
d->transitioner)
1218 d->transitioner->setPopulateTransitionEnabled(
true);
1222 if (
d->highlight &&
d->currentItem) {
1223 if (
d->autoHighlight)
1224 d->resetHighlightPosition();
1225 d->updateTrackedItem();
1229#if QT_CONFIG(quick_viewtransitions)
1230 if (
d->transitioner &&
d->transitioner->populateTransition)
1231 d->forceLayoutPolish();
1235 d->bufferedChanges.prepare(
d->currentIndex,
d->itemCount);
1236 d->bufferedChanges.applyChanges(changeSet);
1238 if (
d->bufferedChanges.hasPendingChanges()) {
1239 d->currentChanges.applyBufferedChanges(
d->bufferedChanges);
1240 d->bufferedChanges.reset();
1242 d->currentChanges.prepare(
d->currentIndex,
d->itemCount);
1243 d->currentChanges.applyChanges(changeSet);
1253 d->refillOrLayout();
1255 d->updateHighlight();
1262 if (!
d->trackedItem || !
d->currentItem)
1270 const bool needMoveToTrackHighlight =
d->autoHighlight ||
d->highlightRange !=
NoHighlightRange;
1273 qreal trackedPos =
d->trackedItem->position();
1274 qreal trackedSize =
d->trackedItem->size();
1275 qreal viewPos =
d->isContentFlowReversed() ? -
d->position()-
d->size() :
d->position();
1277 if (
d->haveHighlightRange) {
1278 if (trackedPos >
pos +
d->highlightRangeEnd - trackedSize)
1279 pos = trackedPos -
d->highlightRangeEnd + trackedSize;
1280 if (trackedPos < pos + d->highlightRangeStart)
1281 pos = trackedPos -
d->highlightRangeStart;
1283 qreal maxExtent =
d->calculatedMaxExtent();
1284 if (
pos > maxExtent)
1286 qreal minExtent =
d->calculatedMinExtent();
1287 if (
pos < minExtent)
1291 if (
d->trackedItem !=
d->currentItem) {
1293 trackedPos -=
d->currentItem->sectionSize();
1294 trackedSize +=
d->currentItem->sectionSize();
1296 qreal trackedEndPos =
d->trackedItem->endPosition();
1297 qreal toItemPos =
d->currentItem->position();
1298 qreal toItemEndPos =
d->currentItem->endPosition();
1299 if (
d->showHeaderForIndex(
d->currentIndex)) {
1300 qreal startOffset = -
d->contentStartOffset();
1301 trackedPos -= startOffset;
1302 trackedEndPos -= startOffset;
1303 toItemPos -= startOffset;
1304 toItemEndPos -= startOffset;
1305 }
else if (
d->showFooterForIndex(
d->currentIndex)) {
1306 qreal endOffset =
d->footerSize();
1308 if (
d->isContentFlowReversed())
1309 endOffset +=
d->vData.startMargin;
1311 endOffset +=
d->vData.endMargin;
1313 if (
d->isContentFlowReversed())
1314 endOffset +=
d->hData.startMargin;
1316 endOffset +=
d->hData.endMargin;
1318 trackedPos += endOffset;
1319 trackedEndPos += endOffset;
1320 toItemPos += endOffset;
1321 toItemEndPos += endOffset;
1324 if (trackedEndPos >= viewPos +
d->size()
1325 && toItemEndPos >= viewPos +
d->size()) {
1326 if (trackedEndPos <= toItemEndPos) {
1327 pos = trackedEndPos -
d->size();
1328 if (trackedSize >
d->size())
1331 pos = toItemEndPos -
d->size();
1332 if (
d->currentItem->size() >
d->size())
1333 pos =
d->currentItem->position();
1336 if (trackedPos <
pos && toItemPos <
pos)
1337 pos =
qMax(trackedPos, toItemPos);
1339 if (viewPos !=
pos) {
1340 d->calcVelocity =
true;
1341 d->setPosition(
pos);
1342 d->calcVelocity =
false;
1350 d->markExtentsDirty();
1352 d->forceLayoutPolish();
1362 if (
d->vData.minExtentDirty) {
1363 d->minExtent =
d->minExtentForAxis(
d->vData,
false);
1364 d->vData.minExtentDirty =
false;
1367 return d->minExtent;
1376 if (
d->vData.maxExtentDirty) {
1377 d->maxExtent =
d->maxExtentForAxis(
d->vData,
false);
1378 d->vData.maxExtentDirty =
false;
1381 return d->maxExtent;
1390 if (
d->hData.minExtentDirty) {
1391 d->minExtent =
d->minExtentForAxis(
d->hData,
true);
1392 d->hData.minExtentDirty =
false;
1395 return d->minExtent;
1404 if (
d->hData.maxExtentDirty) {
1405 d->maxExtent =
d->maxExtentForAxis(
d->hData,
true);
1406 d->hData.maxExtentDirty =
false;
1409 return d->maxExtent;
1434 return -
d->lastPosition() -
d->footerSize();
1445 return -
d->lastPosition() -
d->footerSize();
1460 if (
d->model &&
d->ownModel)
1465 d->updateSectionCriteria();
1468 d->updateViewport();
1469 d->setPosition(
d->contentStartOffset());
1470#if QT_CONFIG(quick_viewtransitions)
1471 if (
d->transitioner)
1472 d->transitioner->setPopulateTransitionEnabled(
true);
1478 if (
d->currentIndex < 0 && !
d->currentIndexCleared)
1479 d->updateCurrent(0);
1481 d->updateCurrent(
d->currentIndex);
1482 if (
d->highlight &&
d->currentItem) {
1483 if (
d->autoHighlight)
1484 d->resetHighlightPosition();
1485 d->updateTrackedItem();
1490 if (
d->model &&
d->model->count())
1499 , displayMarginBeginning(0), displayMarginEnd(0)
1500 , layoutDirection(
Qt::LeftToRight), verticalLayoutDirection(
QQuickItemView::TopToBottom)
1502 , currentIndex(-1), currentItem(
nullptr)
1503 , trackedItem(
nullptr), requestedIndex(-1)
1506 , highlightRangeStart(0), highlightRangeEnd(0)
1507 , highlightMoveDuration(150)
1512 , minExtent(0), maxExtent(0)
1514 , keyNavigationEnabled(true)
1515 , explicitKeyNavigationEnabled(
false)
1517 , haveHighlightRange(
false), autoHighlight(true), highlightRangeStartValid(
false), highlightRangeEndValid(
false)
1520 , runDelayedRemoveTransition(
false)
1522 , delegateValidated(
false), isClearing(
false)
1531#if QT_CONFIG(quick_viewtransitions)
1533 transitioner->setChangeListener(
nullptr);
1534 delete transitioner;
1586 if (
item->index != -1)
1589 return defaultValue;
1596 if (
item->index == modelIndex)
1606 if (
item->index != -1 &&
item->endPosition() >
pos)
1617 if (
item->index != -1 &&
item->position() <= viewEndPos)
1632 if (
item->index == modelIndex)
1634 if (
item->index > modelIndex)
1653 if (!
q->isComponentComplete() || !
isValid() || modelIndex < 0 || modelIndex >=
model->
count()) {
1660 emit q->currentIndexChanged();
1661 emit q->currentItemChanged();
1665 emit q->currentIndexChanged();
1680 oldCurrentItem->attached->setIsCurrentItem(
false);
1690 emit q->currentIndexChanged();
1693 emit q->currentItemChanged();
1711#if QT_CONFIG(quick_viewtransitions)
1712 for (
FxViewItem *
item : std::as_const(releasePendingTransition)) {
1713 item->releaseAfterTransition =
false;
1716 releasePendingTransition.clear();
1723 emit q->currentItemChanged();
1742 emit q->effectiveLayoutDirectionChanged();
1788 qreal fillFrom = from;
1791 bool added =
addVisibleItems(fillFrom, fillTo, bufferFrom, bufferTo,
false);
1802 fillFrom = bufferFrom;
1803 added |=
addVisibleItems(fillFrom, fillTo, bufferFrom, bufferTo,
true);
1809 if (added || removed) {
1819 emit q->countChanged();
1827 if (
q->isComponentComplete()) {
1828 if (orientationChanged) {
1850 q->setContentHeight(contentSize +
extra);
1852 q->setContentWidth(contentSize +
extra);
1864 QRectF viewBounds(
q->contentX(),
q->contentY(),
q->width(),
q->height());
1870#if QT_CONFIG(quick_viewtransitions)
1872 transitioner->setPopulateTransitionEnabled(
false);
1878#if QT_CONFIG(quick_viewtransitions)
1879 if (runDelayedRemoveTransition && transitioner
1900#if QT_CONFIG(quick_viewtransitions)
1906 if (!
item->transitionScheduledOrRunning())
1916#if QT_CONFIG(quick_viewtransitions)
1933#if QT_CONFIG(quick_viewtransitions)
1937 if (lastIndexInView != -1 &&
1940 translateAndTransitionItemsAfter(lastIndexInView, insertionPosChanges, removalPosChanges);
1943 prepareVisibleItemTransitions();
1946 for (
int i = 0,
count = releasePendingTransition.size();
i <
count;) {
1947 auto success = prepareNonVisibleItemTransition(releasePendingTransition[
i], viewBounds);
1952 const int old_count =
count;
1953 count = releasePendingTransition.size();
1954 if (old_count >
count)
1959 releasePendingTransition.remove(
i);
1968 for (
int i=0;
i<releasePendingTransition.size();
i++)
1969 releasePendingTransition[
i]->startTransition(transitioner);
1971 transitioner->setPopulateTransitionEnabled(
false);
1972 transitioner->resetTargetLists();
1979#if QT_CONFIG(quick_viewtransitions)
1980 runDelayedRemoveTransition =
false;
2001 bool visibleAffected =
false;
2006 QQmlNullableValue<qreal> prevFirstItemInViewPos;
2007 int prevFirstItemInViewIndex = -1;
2008 if (prevFirstItemInView) {
2009 prevFirstItemInViewPos = prevFirstItemInView->position();
2010 prevFirstItemInViewIndex = prevFirstItemInView->index;
2014 totalInsertionResult->visiblePos = prevFirstItemInViewPos;
2015 totalRemovalResult->visiblePos = prevFirstItemInViewPos;
2022 int removedCount = 0;
2026 visibleAffected =
true;
2028 visibleAffected =
true;
2029 const int correctedFirstVisibleIndex = prevFirstItemInViewIndex - removalResult.countChangeBeforeVisible;
2030 if (correctedFirstVisibleIndex >= 0 &&
r.index < correctedFirstVisibleIndex) {
2031 if (
r.index +
r.count < correctedFirstVisibleIndex)
2032 removalResult.countChangeBeforeVisible +=
r.count;
2034 removalResult.countChangeBeforeVisible += (correctedFirstVisibleIndex -
r.index);
2037#if QT_CONFIG(quick_viewtransitions)
2038 if (runDelayedRemoveTransition) {
2042 if (
item->index == -1 && (!
item->attached || !
item->attached->delayRemove())) {
2052 *totalRemovalResult += removalResult;
2053 if (!removals.isEmpty()) {
2057 if (!insertions.isEmpty()) {
2058 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2064 QList<FxViewItem *> newItems;
2065 QList<MovedItem> movingIntoView;
2067 for (
int i=0;
i<insertions.size();
i++) {
2070 visibleAffected =
true;
2072 visibleAffected =
true;
2075 *totalInsertionResult += insertionResult;
2078 if (
i < insertions.size() - 1) {
2079 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2087 item->attached->emitAdd();
2090#if QT_CONFIG(quick_viewtransitions)
2095 for (
const MovedItem &
m : std::as_const(movingIntoView)) {
2097 if (fromIndex >= 0) {
2098 if (prevFirstItemInViewIndex >= 0 && fromIndex < prevFirstItemInViewIndex)
2099 repositionItemAt(
m.item, fromIndex, -totalInsertionResult->sizeChangesAfterVisiblePos);
2101 repositionItemAt(
m.item, fromIndex, totalInsertionResult->sizeChangesAfterVisiblePos);
2109 if (removedCount != prevVisibleItemsCount)
2110 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2113#if QT_CONFIG(quick_viewtransitions)
2130 emit q->currentItemChanged();
2136 if (!visibleAffected)
2142 emit q->countChanged();
2143 if (!visibleAffected && viewportChanged)
2146 return visibleAffected;
2152 bool visibleAffected =
false;
2156 removeResult->countChangeAfterVisibleItems += removal.
count;
2166 if (!visibleAffected &&
item->index < removal.
index)
2167 visibleAffected =
true;
2172#if QT_CONFIG(quick_viewtransitions)
2181 visibleAffected =
true;
2183 item->attached->emitRemove();
2185 if (
item->item &&
item->attached &&
item->attached->delayRemove() && !removal.
isMove()) {
2198 return visibleAffected;
2203 if (removeResult->visiblePos.isValid()) {
2204 if (
item->position() < removeResult->visiblePos)
2207 removeResult->sizeChangesAfterVisiblePos +=
item->size();
2211#if QT_CONFIG(quick_viewtransitions)
2219 removeResult->changedFirstItem =
true;
2224 removeResult->sizeChangesBeforeVisiblePos +=
item->size();
2228 qreal prevVisibleItemsFirstPos,
2233 const QQmlNullableValue<qreal> prevViewPos = insertionResult->visiblePos;
2237 if (prevVisibleItemsFirst && insertionResult->changedFirstItem)
2240 if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible
2244 if (!insertionResult->changedFirstItem)
2247 }
else if (prevViewPos.isValid()) {
2248 qreal moveForwardsBy = 0;
2249 qreal moveBackwardsBy = 0;
2253 if (
pos > prevViewPos) {
2254 moveForwardsBy = insertionResult->sizeChangesAfterVisiblePos;
2255 moveBackwardsBy = removalResult->sizeChangesAfterVisiblePos;
2256 }
else if (
pos < prevViewPos) {
2257 moveForwardsBy = removalResult->sizeChangesBeforeVisiblePos;
2258 moveBackwardsBy = insertionResult->sizeChangesBeforeVisiblePos;
2260 adjustFirstItem(moveForwardsBy, moveBackwardsBy, insertionResult->countChangeBeforeVisible - removalResult->countChangeBeforeVisible);
2262 insertionResult->reset();
2263 removalResult->reset();
2267#if QT_CONFIG(quick_viewtransitions)
2268void QQuickItemViewPrivate::createTransitioner()
2270 if (!transitioner) {
2276void QQuickItemViewPrivate::prepareVisibleItemTransitions()
2283 QRectF viewBounds(
q->contentX(),
q->contentY(),
q->width(),
q->height());
2288void QQuickItemViewPrivate::prepareRemoveTransitions(QMultiHash<QQmlChangeSet::MoveKey, FxViewItem *> *removedItems)
2295 for (
auto it = removedItems->begin();
it != removedItems->end(); ) {
2296 bool isRemove =
it.key().moveId < 0;
2299 item->trackGeometry(
false);
2300 item->releaseAfterTransition =
true;
2301 releasePendingTransition.append(
item);
2303 it = removedItems->erase(
it);
2311bool QQuickItemViewPrivate::prepareNonVisibleItemTransition(
FxViewItem *
item,
const QRectF &viewBounds)
2324 bool success =
false;
2328 item->releaseAfterTransition =
true;
2336 for (
int i=0;
i<releasePendingTransition.size();
i++) {
2337 if (releasePendingTransition.at(
i)->transitionableItem ==
item) {
2357#if QT_CONFIG(quick_viewtransitions)
2358 for (
int i=0;
i<releasePendingTransition.size();
i++) {
2359 if (releasePendingTransition.at(
i)->index == modelIndex
2360 && !releasePendingTransition.at(
i)->isPendingRemoval()) {
2361 releasePendingTransition[
i]->releaseAfterTransition =
false;
2362 return releasePendingTransition.takeAt(
i);
2387 qmlWarning(delegate ? delegate :
q) << QQuickItemView::tr(
"Delegate must be of Item type");
2398 viewItem->index = modelIndex;
2414 if (!
d->inRequest) {
2416 d->requestedIndex = -1;
2417 if (
d->hasPendingChanges())
2421 if (
d->unrequestedItems.contains(
item))
2423 else if (
index ==
d->currentIndex)
2445 d->unrequestedItems.remove(
item);
2449void QQuickItemView::onItemPooled(
int modelIndex,
QObject *
object)
2453 if (
auto *attached = d_func()->getAttachedObject(
object))
2454 emit attached->pooled();
2457void QQuickItemView::onItemReused(
int modelIndex,
QObject *
object)
2461 if (
auto *attached = d_func()->getAttachedObject(
object))
2462 emit attached->reused();
2472 item->trackGeometry(
false);
2474 QQmlInstanceModel::ReleaseFlags
flags = {};
2516 }
else if (createDefault) {
2556 q->trackedPositionChanged();
2569 if (
it.value() >= 0)
2580 if ((*it)->index != -1) {
2589#include "moc_qquickitemview_p.cpp"
FxViewItem(QQuickItem *, QQuickItemView *, bool own, QQuickItemViewAttached *attached)
QQuickItemViewAttached * attached
void addAnimationChangeListener(QAnimationJobChangeListener *listener, QAbstractAnimationJob::ChangeTypes)
void setLoopCount(int loopCount)
virtual bool contains(const QPointF &point) const
Returns true if this item contains point, which is in local coordinates; otherwise,...
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
QGraphicsItem * parentItem() const
Returns a pointer to this item's parent item.
void setVisible(bool visible)
If visible is true, the item is made visible.
bool remove(const Key &key)
Removes the item that has the key from the hash.
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in the hash.
const_iterator cbegin() const noexcept
iterator end() noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
const_iterator cend() const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
The QJSValue class acts as a container for Qt/JavaScript data types.
qsizetype size() const noexcept
bool isEmpty() const noexcept
const T & constLast() const noexcept
iterator erase(const_iterator begin, const_iterator end)
const_reference at(qsizetype i) const noexcept
const_iterator constBegin() const noexcept
const T & constFirst() const noexcept
reverse_iterator rbegin()
const_iterator constEnd() const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in the hash.
iterator replace(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
void clear() noexcept(std::is_nothrow_destructible< Node >::value)
iterator end() noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
void setDuration(int msecs)
The QQmlChangeSet class stores an ordered list of notifications about changes to a linear data set.
const QVector< Change > & removes() const
const QVector< Change > & changes() const
void apply(const QQmlChangeSet &changeSet)
Applies the changes in a changeSet to another.
const QVector< Change > & inserts() const
The QQmlComponent class encapsulates a QML component definition.
The QQmlContext class defines a context within a QML engine.
int count() const override
\qmlproperty int QtQml.Models::DelegateModel::count
IncubationMode
Specifies the mode the incubator operates in.
virtual QQmlIncubator::Status incubationStatus(int index)=0
virtual int indexOf(QObject *object, QObject *objectContext) const =0
virtual bool isValid() const =0
virtual ReleaseFlags release(QObject *object, ReusableFlag reusableFlag=NotReusable)=0
MovementReason moveReason
void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) override
void updateBeginningEnd()
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
virtual qreal minYExtent() const
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
virtual void setContentX(qreal pos)
void interactiveChanged()
Q_INVOKABLE void cancelFlick()
\qmlmethod QtQuick::Flickable::cancelFlick()
bool isMoving() const
\qmlproperty bool QtQuick::Flickable::moving \qmlproperty bool QtQuick::Flickable::movingHorizontally...
virtual void setContentY(qreal pos)
virtual qreal maxXExtent() const
virtual qreal maxYExtent() const
virtual qreal minXExtent() const
QLazilyAllocated< ExtraData, ExtraDataTags > extra
static QQuickItemPrivate * get(QQuickItem *item)
void setIsCurrentItem(bool c)
bool hasPendingChanges() const
void prepare(int currentIndex, int count)
QQmlChangeSet pendingChanges
QQuickItemViewChangeSet()
void applyChanges(const QQmlChangeSet &changeSet)
QMultiHash< QQmlChangeSet::MoveKey, FxViewItem * > removedItems
void applyBufferedChanges(const QQuickItemViewChangeSet &other)
QPointer< QQuickItem > item
virtual qreal position() const =0
virtual qreal sectionSize() const =0
virtual qreal originPosition() const =0
int findLastIndexInView() const
int findLastVisibleIndex(int defaultValue=-1) const
virtual void initializeCurrentItem()
virtual void initializeComponentItem(QQuickItem *) const
void updateUnrequestedIndexes()
virtual bool hasStickyFooter() const
virtual void fixupPosition()=0
qreal highlightRangeStart
bool applyRemovalChange(const QQmlChangeSet::Change &removal, ChangeResult *changeResult, int *removedCount)
virtual void updateViewport()
virtual void createHighlight(bool onDestruction=false)=0
virtual void repositionItemAt(FxViewItem *item, int index, qreal sizeBuffer)=0
void mirrorChange() override
FxViewItem * visibleItem(int modelIndex) const
virtual void clear(bool onDestruction=false)
void updateCurrent(int modelIndex)
QQuickItem * createHighlightItem() const
void showVisibleItems() const
virtual void updateHeader()=0
virtual void resetHighlightPosition()=0
QPointer< QQmlInstanceModel > model
QList< FxViewItem * > visibleItems
virtual bool isContentFlowReversed() const =0
int displayMarginBeginning
virtual void initializeViewItem(FxViewItem *)
void storeFirstVisibleItemPosition()
virtual void updateSizeChangesBeforeVisiblePos(FxViewItem *item, ChangeResult *removeResult)
virtual void updateFooter()=0
virtual void layoutVisibleItems(int fromModelIndex=0)=0
void applyDelegateChange()
virtual void visibleItemsChanged()
bool hasPendingChanges() const
virtual void updateHighlight()=0
QHash< QQuickItem *, int > unrequestedItems
virtual void updateSections()
virtual bool hasStickyHeader() const
virtual Qt::Orientation layoutOrientation() const =0
qreal endPosition() const
void positionViewAtIndex(int index, int mode)
qreal firstVisibleItemPosition
QQuickItemViewChangeSet currentChanges
virtual void repositionPackageItemAt(QQuickItem *item, int index)=0
void updateUnrequestedPositions()
void applyPendingChanges()
virtual qreal endPositionAt(int index) const =0
void removeItem(FxViewItem *item, const QQmlChangeSet::Change &removal, ChangeResult *removeResult)
virtual void resetFirstItemPosition(qreal pos=0.0)=0
qreal contentStartOffset() const
virtual void updateSectionCriteria()
virtual qreal positionAt(int index) const =0
virtual void changedVisibleIndex(int newIndex)=0
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) override
virtual bool needsRefillForAddedOrRemovedIndex(int) const
FxViewItem * firstItemInView() const
int mapFromModel(int modelIndex) const
qreal maxExtentForAxis(const AxisData &axisData, bool forXAxis) const
void updateVisibleIndex()
qreal calculatedMinExtent() const
void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos, FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult)
QQuickItem * createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault=false) const
void regenerate(bool orientationChanged=false)
virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)=0
qreal minExtentForAxis(const AxisData &axisData, bool forXAxis) const
virtual bool movingFromHighlight()
qreal calculatedMaxExtent() const
bool highlightRangeEndValid
void animationFinished(QAbstractAnimationJob *) override
void releaseVisibleItems(QQmlInstanceModel::ReusableFlag reusableFlag)
bool highlightRangeStartValid
int findMoveKeyIndex(QQmlChangeSet::MoveKey key, const QVector< QQmlChangeSet::Change > &changes) const
virtual qreal lastPosition() const =0
virtual qreal headerSize() const =0
virtual qreal footerSize() const =0
void checkVisible() const
QQuickItemViewChangeSet bufferedChanges
FxViewItem * createItem(int modelIndex, QQmlIncubator::IncubationMode incubationMode=QQmlIncubator::AsynchronousIfNested)
bool applyModelChanges(ChangeResult *insertionResult, ChangeResult *removalResult)
qreal startPosition() const
virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, qreal bufferFrom, qreal bufferTo, bool doBuffer)=0
QPauseAnimationJob bufferPause
virtual bool releaseItem(FxViewItem *item, QQmlInstanceModel::ReusableFlag reusableFlag)
virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible)=0
QQmlInstanceModel::ReusableFlag reusableFlag
virtual FxViewItem * newViewItem(int index, QQuickItem *item)=0
virtual bool applyInsertionChange(const QQmlChangeSet::Change &insert, ChangeResult *changeResult, QList< FxViewItem * > *newItems, QList< MovedItem > *movingIntoView)=0
QQmlComponent * highlightComponent
std::unique_ptr< FxViewItem > highlight
void setChangeListener(QQuickItemViewTransitionChangeListener *obj)
virtual void setHighlightFollowsCurrentItem(bool)
qreal originY() const override
\qmlproperty real QtQuick::Flickable::originX \qmlproperty real QtQuick::Flickable::originY
qreal maxYExtent() const override
Q_INVOKABLE void positionViewAtBeginning()
bool isWrapEnabled() const
qreal maxXExtent() const override
qreal preferredHighlightBegin
void setPreferredHighlightEnd(qreal)
bool isKeyNavigationEnabled() const
void cacheBufferChanged()
qreal minYExtent() const override
void destroyingItem(QObject *item)
void setDisplayMarginBeginning(int)
void displayMarginBeginningChanged()
void setFooter(QQmlComponent *)
void modelUpdated(const QQmlChangeSet &changeSet, bool reset)
void setContentX(qreal pos) override
Q_INVOKABLE void positionViewAtIndex(int index, int mode)
void createdItem(int index, QObject *item)
Qt::LayoutDirection layoutDirection
bool keyNavigationEnabled
void currentIndexChanged()
void setLayoutDirection(Qt::LayoutDirection)
void setModel(const QVariant &)
void layoutDirectionChanged()
void effectiveLayoutDirectionChanged()
Qt::LayoutDirection effectiveLayoutDirection
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void setDelegate(QQmlComponent *)
Q_INVOKABLE QQuickItem * itemAt(qreal x, qreal y) const
void trackedPositionChanged()
void keyNavigationWrapsChanged()
void setVerticalLayoutDirection(VerticalLayoutDirection layoutDirection)
bool highlightFollowsCurrentItem
void verticalLayoutDirectionChanged()
void setWrapEnabled(bool)
void setContentY(qreal pos) override
QQmlComponent * highlight
QQuickItem * highlightItem
void setReuseItems(bool reuse)
qreal originX() const override
void highlightMoveDurationChanged()
void setHighlight(QQmlComponent *)
void setPreferredHighlightBegin(qreal)
void preferredHighlightBeginChanged()
qreal preferredHighlightEnd
virtual void initItem(int index, QObject *item)
void setDisplayMarginEnd(int)
void setKeyNavigationEnabled(bool)
void displayMarginEndChanged()
void setHighlightRangeMode(HighlightRangeMode mode)
virtual void setHighlightMoveDuration(int)
void updatePolish() override
This function should perform any layout as required for this item.
void setCurrentIndex(int idx)
void resetPreferredHighlightBegin()
VerticalLayoutDirection verticalLayoutDirection
Q_INVOKABLE int indexAt(qreal x, qreal y) const
void resetPreferredHighlightEnd()
HighlightRangeMode highlightRangeMode
void highlightFollowsCurrentItemChanged()
qreal minXExtent() const override
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
Q_INVOKABLE void positionViewAtEnd()
void setHeader(QQmlComponent *)
void preferredHighlightEndChanged()
QQuickItemView(QQuickFlickablePrivate &dd, QQuickItem *parent=nullptr)
void highlightRangeModeChanged()
int displayMarginBeginning
int highlightMoveDuration
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
qreal width
This property holds the width of this item.
bool isComponentComplete() const
Returns true if construction of the QML component is complete; otherwise returns false.
qreal height
This property holds the height of this item.
virtual void updatePolish()
This function should perform any layout as required for this item.
void polish()
Schedules a polish event for this item.
void clear()
Resets the timeline.
\inmodule QtCore\reentrant
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define ACTION_IF_DELETED(p, func, action)
static QDBusError::ErrorType get(const char *name)
static QString header(const QString &name)
bool qFuzzyIsNull(qfloat16 f) noexcept
#define Q_LOGGING_CATEGORY(name,...)
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
n void setPosition(void) \n\
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint x
[0]
GLenum GLenum GLsizei count
GLsizei const GLchar *const GLenum bufferMode
GLdouble GLdouble GLdouble GLdouble q
static qreal component(const QPointF &point, unsigned int i)
QQmlContext * qmlContext(const QObject *obj)
void QQml_setParent_noEvent(QObject *object, QObject *parent)
Makes the object a child of parent.
QQuickItem * qmlobject_cast< QQuickItem * >(QObject *object)
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
static QList< QQuickStateAction > prepareTransition(QQuickDrawer *drawer, QQuickTransition *transition, qreal to)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
static FxViewItem * fxViewItemAtPosition(const QList< FxViewItem * > &items, qreal x, qreal y)
#define QML_VIEW_DEFAULTCACHEBUFFER
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
static QT_BEGIN_NAMESPACE QAsn1Element wrap(quint8 type, const QAsn1Element &child)
#define QT_CONFIG(feature)
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, JSToQVariantConversionBehavior conversionBehavior, V4ObjectSet *visitedObjects)
if(qFloatDistance(a, b)<(1<< 7))
[0]
myObject disconnect()
[26]
MoveKey moveKey(int index) const