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++) {
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)
1271 qreal trackedPos =
d->trackedItem->position();
1272 qreal trackedSize =
d->trackedItem->size();
1273 qreal viewPos =
d->isContentFlowReversed() ? -
d->position()-
d->size() :
d->position();
1275 if (
d->haveHighlightRange) {
1276 if (trackedPos >
pos +
d->highlightRangeEnd - trackedSize)
1277 pos = trackedPos -
d->highlightRangeEnd + trackedSize;
1278 if (trackedPos < pos + d->highlightRangeStart)
1279 pos = trackedPos -
d->highlightRangeStart;
1281 qreal maxExtent =
d->calculatedMaxExtent();
1282 if (
pos > maxExtent)
1284 qreal minExtent =
d->calculatedMinExtent();
1285 if (
pos < minExtent)
1289 if (
d->trackedItem !=
d->currentItem) {
1291 trackedPos -=
d->currentItem->sectionSize();
1292 trackedSize +=
d->currentItem->sectionSize();
1294 qreal trackedEndPos =
d->trackedItem->endPosition();
1295 qreal toItemPos =
d->currentItem->position();
1296 qreal toItemEndPos =
d->currentItem->endPosition();
1297 if (
d->showHeaderForIndex(
d->currentIndex)) {
1298 qreal startOffset = -
d->contentStartOffset();
1299 trackedPos -= startOffset;
1300 trackedEndPos -= startOffset;
1301 toItemPos -= startOffset;
1302 toItemEndPos -= startOffset;
1303 }
else if (
d->showFooterForIndex(
d->currentIndex)) {
1304 qreal endOffset =
d->footerSize();
1306 if (
d->isContentFlowReversed())
1307 endOffset +=
d->vData.startMargin;
1309 endOffset +=
d->vData.endMargin;
1311 if (
d->isContentFlowReversed())
1312 endOffset +=
d->hData.startMargin;
1314 endOffset +=
d->hData.endMargin;
1316 trackedPos += endOffset;
1317 trackedEndPos += endOffset;
1318 toItemPos += endOffset;
1319 toItemEndPos += endOffset;
1322 if (trackedEndPos >= viewPos +
d->size()
1323 && toItemEndPos >= viewPos +
d->size()) {
1324 if (trackedEndPos <= toItemEndPos) {
1325 pos = trackedEndPos -
d->size();
1326 if (trackedSize >
d->size())
1329 pos = toItemEndPos -
d->size();
1330 if (
d->currentItem->size() >
d->size())
1331 pos =
d->currentItem->position();
1334 if (trackedPos <
pos && toItemPos <
pos)
1335 pos =
qMax(trackedPos, toItemPos);
1337 if (viewPos !=
pos) {
1338 d->calcVelocity =
true;
1339 d->setPosition(
pos);
1340 d->calcVelocity =
false;
1348 d->markExtentsDirty();
1350 d->forceLayoutPolish();
1360 if (
d->vData.minExtentDirty) {
1361 d->minExtent =
d->minExtentForAxis(
d->vData,
false);
1362 d->vData.minExtentDirty =
false;
1365 return d->minExtent;
1374 if (
d->vData.maxExtentDirty) {
1375 d->maxExtent =
d->maxExtentForAxis(
d->vData,
false);
1376 d->vData.maxExtentDirty =
false;
1379 return d->maxExtent;
1388 if (
d->hData.minExtentDirty) {
1389 d->minExtent =
d->minExtentForAxis(
d->hData,
true);
1390 d->hData.minExtentDirty =
false;
1393 return d->minExtent;
1402 if (
d->hData.maxExtentDirty) {
1403 d->maxExtent =
d->maxExtentForAxis(
d->hData,
true);
1404 d->hData.maxExtentDirty =
false;
1407 return d->maxExtent;
1432 return -
d->lastPosition() -
d->footerSize();
1443 return -
d->lastPosition() -
d->footerSize();
1458 if (
d->model &&
d->ownModel)
1463 d->updateSectionCriteria();
1466 d->updateViewport();
1467 d->setPosition(
d->contentStartOffset());
1468#if QT_CONFIG(quick_viewtransitions)
1469 if (
d->transitioner)
1470 d->transitioner->setPopulateTransitionEnabled(
true);
1476 if (
d->currentIndex < 0 && !
d->currentIndexCleared)
1477 d->updateCurrent(0);
1479 d->updateCurrent(
d->currentIndex);
1480 if (
d->highlight &&
d->currentItem) {
1481 if (
d->autoHighlight)
1482 d->resetHighlightPosition();
1483 d->updateTrackedItem();
1488 if (
d->model &&
d->model->count())
1497 , displayMarginBeginning(0), displayMarginEnd(0)
1498 , layoutDirection(
Qt::LeftToRight), verticalLayoutDirection(
QQuickItemView::TopToBottom)
1500 , currentIndex(-1), currentItem(
nullptr)
1501 , trackedItem(
nullptr), requestedIndex(-1)
1504 , highlightRangeStart(0), highlightRangeEnd(0)
1505 , highlightMoveDuration(150)
1510 , minExtent(0), maxExtent(0)
1512 , keyNavigationEnabled(true)
1513 , explicitKeyNavigationEnabled(
false)
1515 , haveHighlightRange(
false), autoHighlight(true), highlightRangeStartValid(
false), highlightRangeEndValid(
false)
1518 , runDelayedRemoveTransition(
false)
1520 , delegateValidated(
false), isClearing(
false)
1529#if QT_CONFIG(quick_viewtransitions)
1531 transitioner->setChangeListener(
nullptr);
1532 delete transitioner;
1584 if (
item->index != -1)
1587 return defaultValue;
1594 if (
item->index == modelIndex)
1604 if (
item->index != -1 &&
item->endPosition() >
pos)
1615 if (
item->index != -1 &&
item->position() <= viewEndPos)
1630 if (
item->index == modelIndex)
1632 if (
item->index > modelIndex)
1651 if (!
q->isComponentComplete() || !
isValid() || modelIndex < 0 || modelIndex >=
model->
count()) {
1658 emit q->currentIndexChanged();
1659 emit q->currentItemChanged();
1663 emit q->currentIndexChanged();
1688 emit q->currentIndexChanged();
1691 emit q->currentItemChanged();
1709#if QT_CONFIG(quick_viewtransitions)
1710 for (
FxViewItem *
item : std::as_const(releasePendingTransition)) {
1711 item->releaseAfterTransition =
false;
1714 releasePendingTransition.clear();
1721 emit q->currentItemChanged();
1740 emit q->effectiveLayoutDirectionChanged();
1786 qreal fillFrom = from;
1789 bool added =
addVisibleItems(fillFrom, fillTo, bufferFrom, bufferTo,
false);
1801 fillFrom = bufferFrom;
1802 added |=
addVisibleItems(fillFrom, fillTo, bufferFrom, bufferTo,
true);
1806 if (added || removed) {
1816 emit q->countChanged();
1824 if (
q->isComponentComplete()) {
1825 if (orientationChanged) {
1847 q->setContentHeight(contentSize +
extra);
1849 q->setContentWidth(contentSize +
extra);
1861 QRectF viewBounds(
q->contentX(),
q->contentY(),
q->width(),
q->height());
1867#if QT_CONFIG(quick_viewtransitions)
1869 transitioner->setPopulateTransitionEnabled(
false);
1875#if QT_CONFIG(quick_viewtransitions)
1876 if (runDelayedRemoveTransition && transitioner
1897#if QT_CONFIG(quick_viewtransitions)
1903 if (!
item->transitionScheduledOrRunning())
1913#if QT_CONFIG(quick_viewtransitions)
1930#if QT_CONFIG(quick_viewtransitions)
1934 if (lastIndexInView != -1 &&
1937 translateAndTransitionItemsAfter(lastIndexInView, insertionPosChanges, removalPosChanges);
1940 prepareVisibleItemTransitions();
1943 for (
int i = 0,
count = releasePendingTransition.size();
i <
count;) {
1944 auto success = prepareNonVisibleItemTransition(releasePendingTransition[
i], viewBounds);
1949 const int old_count =
count;
1950 count = releasePendingTransition.size();
1951 if (old_count >
count)
1956 releasePendingTransition.remove(
i);
1965 for (
int i=0;
i<releasePendingTransition.size();
i++)
1966 releasePendingTransition[
i]->startTransition(transitioner);
1968 transitioner->setPopulateTransitionEnabled(
false);
1969 transitioner->resetTargetLists();
1976#if QT_CONFIG(quick_viewtransitions)
1977 runDelayedRemoveTransition =
false;
1998 bool visibleAffected =
false;
2004 int prevFirstItemInViewIndex = -1;
2005 if (prevFirstItemInView) {
2006 prevFirstItemInViewPos = prevFirstItemInView->
position();
2007 prevFirstItemInViewIndex = prevFirstItemInView->
index;
2011 totalInsertionResult->
visiblePos = prevFirstItemInViewPos;
2012 totalRemovalResult->
visiblePos = prevFirstItemInViewPos;
2019 int removedCount = 0;
2023 visibleAffected =
true;
2025 visibleAffected =
true;
2027 if (correctedFirstVisibleIndex >= 0 &&
r.index < correctedFirstVisibleIndex) {
2028 if (
r.index +
r.count < correctedFirstVisibleIndex)
2034#if QT_CONFIG(quick_viewtransitions)
2035 if (runDelayedRemoveTransition) {
2039 if (
item->index == -1 && (!
item->attached || !
item->attached->delayRemove())) {
2049 *totalRemovalResult += removalResult;
2055 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2064 for (
int i=0;
i<insertions.
size();
i++) {
2067 visibleAffected =
true;
2069 visibleAffected =
true;
2072 *totalInsertionResult += insertionResult;
2075 if (
i < insertions.
size() - 1) {
2076 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2084 item->attached->emitAdd();
2087#if QT_CONFIG(quick_viewtransitions)
2092 for (
const MovedItem &
m : std::as_const(movingIntoView)) {
2094 if (fromIndex >= 0) {
2095 if (prevFirstItemInViewIndex >= 0 && fromIndex < prevFirstItemInViewIndex)
2106 if (removedCount != prevVisibleItemsCount)
2107 repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult);
2110#if QT_CONFIG(quick_viewtransitions)
2127 emit q->currentItemChanged();
2133 if (!visibleAffected)
2139 emit q->countChanged();
2140 if (!visibleAffected && viewportChanged)
2143 return visibleAffected;
2149 bool visibleAffected =
false;
2163 if (!visibleAffected &&
item->index < removal.
index)
2164 visibleAffected =
true;
2169#if QT_CONFIG(quick_viewtransitions)
2178 visibleAffected =
true;
2180 item->attached->emitRemove();
2182 if (
item->item &&
item->attached &&
item->attached->delayRemove() && !removal.
isMove()) {
2195 return visibleAffected;
2208#if QT_CONFIG(quick_viewtransitions)
2225 qreal prevVisibleItemsFirstPos,
2237 if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible
2244 }
else if (prevViewPos.
isValid()) {
2245 qreal moveForwardsBy = 0;
2246 qreal moveBackwardsBy = 0;
2250 if (
pos > prevViewPos) {
2253 }
else if (
pos < prevViewPos) {
2259 insertionResult->
reset();
2260 removalResult->
reset();
2264#if QT_CONFIG(quick_viewtransitions)
2265void QQuickItemViewPrivate::createTransitioner()
2267 if (!transitioner) {
2273void QQuickItemViewPrivate::prepareVisibleItemTransitions()
2280 QRectF viewBounds(
q->contentX(),
q->contentY(),
q->width(),
q->height());
2292 for (
auto it = removedItems->
begin();
it != removedItems->
end(); ) {
2293 bool isRemove =
it.key().moveId < 0;
2296 item->trackGeometry(
false);
2297 item->releaseAfterTransition =
true;
2298 releasePendingTransition.append(
item);
2308bool QQuickItemViewPrivate::prepareNonVisibleItemTransition(
FxViewItem *
item,
const QRectF &viewBounds)
2321 bool success =
false;
2325 item->releaseAfterTransition =
true;
2333 for (
int i=0;
i<releasePendingTransition.size();
i++) {
2334 if (releasePendingTransition.at(
i)->transitionableItem ==
item) {
2354#if QT_CONFIG(quick_viewtransitions)
2355 for (
int i=0;
i<releasePendingTransition.size();
i++) {
2356 if (releasePendingTransition.at(
i)->index == modelIndex
2357 && !releasePendingTransition.at(
i)->isPendingRemoval()) {
2358 releasePendingTransition[
i]->releaseAfterTransition =
false;
2359 return releasePendingTransition.takeAt(
i);
2384 qmlWarning(delegate ? delegate :
q) << QQuickItemView::tr(
"Delegate must be of Item type");
2395 viewItem->
index = modelIndex;
2411 if (!
d->inRequest) {
2413 d->requestedIndex = -1;
2414 if (
d->hasPendingChanges())
2418 if (
d->unrequestedItems.contains(
item))
2420 else if (
index ==
d->currentIndex)
2442 d->unrequestedItems.remove(
item);
2446void QQuickItemView::onItemPooled(
int modelIndex,
QObject *
object)
2450 if (
auto *attached = d_func()->getAttachedObject(
object))
2451 emit attached->pooled();
2454void QQuickItemView::onItemReused(
int modelIndex,
QObject *
object)
2458 if (
auto *attached = d_func()->getAttachedObject(
object))
2459 emit attached->reused();
2469 item->trackGeometry(
false);
2471 QQmlInstanceModel::ReleaseFlags
flags = {};
2513 }
else if (createDefault) {
2553 q->trackedPositionChanged();
2566 if (
it.value() >= 0)
2577 if ((*it)->index != -1) {
2586#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
qsizetype count() 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 erase(const_iterator it)
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.
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)
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 *)
FINALint displayMarginEnd
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
FINALQt::LayoutDirection layoutDirection
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, bool createJSValueForObjectsAndSymbols, V4ObjectSet *visitedObjects)
if(qFloatDistance(a, b)<(1<< 7))
[0]
myObject disconnect()
[26]
MoveKey moveKey(int index) const
QQmlNullableValue< qreal > visiblePos
qreal sizeChangesAfterVisiblePos
qreal sizeChangesBeforeVisiblePos
int countChangeAfterVisibleItems
int countChangeBeforeVisible
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent