6#include <QtQml/qqmlinfo.h>
8#include <private/qqmlabstractdelegatecomponent_p.h>
9#include <private/qquickpackage_p.h>
10#include <private/qmetaobjectbuilder_p.h>
11#include <private/qqmladaptormodel_p.h>
12#include <private/qqmlanybinding_p.h>
13#include <private/qqmlchangeset_p.h>
14#include <private/qqmlengine_p.h>
15#include <private/qqmlcomponent_p.h>
16#include <private/qqmlpropertytopropertybinding_p.h>
17#include <private/qjsvalue_p.h>
19#include <private/qv4value_p.h>
20#include <private/qv4functionobject_p.h>
21#include <private/qv4objectiterator_p.h>
41 void init() { Object::init(); }
77 return f->d()->code(
o->d()->item,
f->d()->flag,
v);
83 QV4::Heap::FunctionObject::init(scope,
QStringLiteral(
"DelegateModelGroupFunction"));
111 prop.setWritable(
false);
165 , m_delegateValidated(
false)
167 , m_transaction(
false)
168 , m_incubatorCleanupScheduled(
false)
169 , m_waitingToFetchMore(
false)
230 d->disconnectFromAbstractItemModel();
231 d->m_adaptorModel.setObject(
nullptr);
234 if (cacheItem->object) {
235 delete cacheItem->object;
237 cacheItem->object =
nullptr;
238 cacheItem->contextData.reset();
239 cacheItem->scriptRef -= 1;
240 }
else if (cacheItem->incubationTask) {
243 cacheItem->scriptRef -= 1;
246 cacheItem->groups &= ~Compositor::UnresolvedFlag;
247 cacheItem->objectRef = 0;
249 if (cacheItem->incubationTask) {
250 d->releaseIncubator(cacheItem->incubationTask);
251 cacheItem->incubationTask->vdm =
nullptr;
252 cacheItem->incubationTask =
nullptr;
255 if (!cacheItem->isReferenced())
271 d->m_complete =
true;
273 int defaultGroups = 0;
278 defaultGroups |= Compositor::DefaultFlag;
280 defaultGroups |= Compositor::PersistedFlag;
281 for (
int i = Compositor::MinimumGroupCount;
i <
d->m_groupCount; ++
i) {
283 if (
name.isEmpty()) {
284 d->m_groups[
i] =
d->m_groups[
d->m_groupCount - 1];
287 }
else if (
name.at(0).isUpper()) {
288 qmlWarning(
d->m_groups[
i]) << QQmlDelegateModelGroup::tr(
"Group names must start with a lower case letter");
289 d->m_groups[
i] =
d->m_groups[
d->m_groupCount - 1];
293 groupNames.append(
name);
296 group->setModel(
this, Compositor::Group(
i));
297 if (
group->defaultInclude)
298 defaultGroups |= (1 <<
i);
303 d->m_context->engine()->handle(),
this, groupNames);
305 d->m_compositor.setGroupCount(
d->m_groupCount);
306 d->m_compositor.setDefaultGroups(defaultGroups);
307 d->updateFilterGroup();
309 while (!
d->m_pendingParts.isEmpty())
310 static_cast<QQmlPartsModel *
>(
d->m_pendingParts.first())->updateFilterGroup();
313 d->m_count =
d->adaptorModelCount();
314 d->m_compositor.append(
318 defaultGroups | Compositor::AppendFlag | Compositor::PrependFlag,
320 d->itemsInserted(inserts);
322 d->requestMoreIfNecessary();
343 return d->m_adaptorModel.model();
410 _q_itemsRemoved(0,
d->m_count);
412 d->disconnectFromAbstractItemModel();
413 d->m_adaptorModel.setModel(
model);
414 d->connectToAbstractItemModel();
417 for (
int i = 0;
d->m_parts &&
i <
d->m_parts->models.size(); ++
i) {
418 d->m_adaptorModel.replaceWatchedRoles(
423 _q_itemsInserted(0,
d->adaptorModelCount());
424 d->requestMoreIfNecessary();
438 return d->m_delegate;
444 if (
d->m_transaction) {
445 qmlWarning(
this) <<
tr(
"The delegate of a DelegateModel cannot be changed within onUpdated.");
451 _q_itemsRemoved(0,
d->m_count);
453 d->m_delegateValidated =
false;
454 if (
d->m_delegateChooser)
457 d->m_delegateChooser =
nullptr;
460 qobject_cast<QQmlAbstractDelegateComponent *>(
delegate);
462 d->m_delegateChooser = adc;
464 [
d](){
d->delegateChanged(); });
468 _q_itemsInserted(0,
d->adaptorModelCount());
469 d->requestMoreIfNecessary();
513 const bool changed =
d->m_adaptorModel.rootIndex !=
modelIndex;
514 if (changed || !
d->m_adaptorModel.isValid()) {
515 const int oldCount =
d->m_count;
517 if (!
d->m_adaptorModel.isValid() &&
d->m_adaptorModel.aim()) {
519 d->disconnectFromAbstractItemModel();
520 d->m_adaptorModel.setModel(
d->m_adaptorModel.list.list());
521 d->connectToAbstractItemModel();
523 if (
d->m_adaptorModel.canFetchMore())
524 d->m_adaptorModel.fetchMore();
526 const int newCount =
d->adaptorModelCount();
528 _q_itemsRemoved(0, oldCount);
530 _q_itemsInserted(0, newCount);
552 return d->m_adaptorModel.modelIndex(idx);
570 return d->m_adaptorModel.parentModelIndex();
582 return d->m_compositor.count(
d->m_compositorGroup);
588 return QQmlDelegateModel::ReleaseFlags{};
592 return QQmlDelegateModel::ReleaseFlags{};
625 QQmlInstanceModel::ReleaseFlags stat =
d->release(
item, reusableFlag);
633 if (index < 0 || index >=
d->m_compositor.count(
d->m_compositorGroup)) {
634 qWarning() <<
"DelegateModel::cancel: index out range" <<
index <<
d->m_compositor.count(
d->m_compositorGroup);
638 Compositor::iterator
it =
d->m_compositor.find(
d->m_compositorGroup,
index);
648 if (
QQuickPackage *package = qmlobject_cast<QQuickPackage *>(
object))
649 d->emitDestroyingPackage(package);
651 d->emitDestroyingItem(
object);
657 d->m_compositor.clearFlags(
658 Compositor::Cache,
it.cacheIndex(), 1, Compositor::CacheFlag);
659 d->m_cache.removeAt(
it.cacheIndex());
661 Q_ASSERT(
d->m_cache.size() ==
d->m_compositor.count(Compositor::Cache));
672 if (
d->m_groupCount == Compositor::MaximumGroupCount) {
673 qmlWarning(
d->q_func()) << QQmlDelegateModel::tr(
"The maximum number of supported DelegateModelGroups is 8");
676 d->m_groups[
d->m_groupCount] =
group;
677 d->m_groupCount += 1;
684 return d->m_groupCount - 1;
733 nullptr,
nullptr,
nullptr);
768 return d->m_persistedItems;
784 return d->m_filterGroup;
791 if (
d->m_transaction) {
792 qmlWarning(
this) <<
tr(
"The group of a DelegateModel cannot be changed within onChanged");
796 if (
d->m_filterGroup !=
group) {
798 d->updateFilterGroup();
830 changeSet.
move(removes, inserts);
831 emit q->modelUpdated(changeSet,
false);
834 emit q->countChanged();
883 return d->m_adaptorModel.adaptsAim() ?
d->m_adaptorModel.aim() :
nullptr;
914 if (
auto contextData =
d ?
d->context :
nullptr)
915 contextData->setExtraObject(modelItemToIncubate);
921 if (incubatorPriv->hadTopLevelRequiredProperties()) {
936 const QMetaObject *qmlMetaObject = modelItemToIncubate->metaObject();
938 if (incubatorPriv->requiredProperties()->empty())
951 auto delegateModelItemSubclassMO = qmlMetaObject->
superClass();
954 while (strcmp(delegateModelItemSubclassMO->className(),
955 modelItemToIncubate->staticMetaObject.className())) {
956 delegateModelItemSubclassMO = delegateModelItemSubclassMO->superClass();
966 for (
const auto &metaObjectAndObject : mos) {
968 QObject *itemOrProxy = metaObjectAndObject.second;
971 for (
int i =
mo->propertyOffset();
i <
mo->propertyCount() +
mo->propertyOffset(); ++
i) {
972 auto prop =
mo->property(
i);
976 bool wasInRequired =
false;
978 object, propName, requiredProperties,
999 modelItemToIncubate->metaObject();
1021 if (!incubationTask->
isError())
1022 incubationTask->
clear();
1035 item->groups = newGroups;
1041 const bool alwaysEmit =
true;
1042 item->setModelIndex(newModelIndex, newModelIndex, 0, alwaysEmit);
1051 qmlAttachedPropertiesObject<QQmlDelegateModel>(
item->object,
false))) {
1054 att->resetCurrentIndex();
1061 emit q_func()->itemReused(newModelIndex,
item->object);
1071 d_func()->drainReusableItemsPool(maxPoolTime);
1076 return d_func()->m_reusableItemsPool.size();
1089 chooser = qobject_cast<QQmlAbstractDelegateComponent *>(delegate);
1140 delete cacheItem->
object;
1141 cacheItem->
object =
nullptr;
1172 = qobject_cast<QQmlAdaptorModelProxyInterface *>(cacheItem);
1180 ctxt->setContextObject(cacheItem);
1198 const auto modelIndex =
it.modelIndex();
1202 if (!cacheItem || !cacheItem->
delegate) {
1216 return cacheItem->
object;
1242 }
else if (!cacheItem->
object) {
1258 if (cp->isBound()) {
1275 ctxt->setContextObject(cacheItem);
1296 return cacheItem->
object;
1320 if (!
d->m_delegate || index < 0 || index >=
d->m_compositor.count(
d->m_compositorGroup)) {
1321 qWarning() <<
"DelegateModel::item: index out range" <<
index <<
d->m_compositor.count(
d->m_compositorGroup);
1325 return d->object(
d->m_compositorGroup,
index, incubationMode);
1331 if (
d->m_compositor.count(
d->m_compositorGroup) <=
index)
1333 Compositor::iterator
it =
d->m_compositor.find(
d->m_compositorGroup,
index);
1337 if (
auto incubationTask =
d->m_cache.at(
it.cacheIndex())->incubationTask)
1338 return incubationTask->status();
1356 const int from =
dot + 1;
1368 return d->variantValue(
d->m_compositorGroup,
index, role);
1375 return cacheItem->groupIndex(
d->m_compositorGroup);
1382 d->m_adaptorModel.replaceWatchedRoles(
d->m_watchedRoles, roles);
1383 d->m_watchedRoles = roles;
1387 Compositor::iterator from,
int count, Compositor::Group
group,
int groupFlags)
1396 Compositor::iterator from,
int count, Compositor::Group
group,
int groupFlags)
1405 Compositor::iterator from,
int count, Compositor::Group
group,
int groupFlags)
1412 const int removeFlags = ~groupFlags & Compositor::GroupMask;
1424 d->m_waitingToFetchMore =
false;
1425 d->m_adaptorModel.fetchMore();
1427 d->m_incubatorCleanupScheduled =
false;
1429 d->m_finishedIncubating.clear();
1441 for (
const Compositor::Change &change : changes) {
1443 if (change.inGroup(
i)) {
1456 if (count <= 0 || !d->m_complete)
1459 if (
d->m_adaptorModel.notify(
d->m_cache,
index,
count, roles)) {
1461 d->m_compositor.listItemsChanged(&
d->m_adaptorModel,
index,
count, &changes);
1462 d->itemsChanged(changes);
1471 incubationTask->index[
i] += deltas[
i];
1474 for (
int i = 1; i < qMin<int>(
count, Compositor::MaximumGroupCount); ++
i)
1475 attached->m_currentIndex[
i] += deltas[
i];
1486 int inserted[Compositor::MaximumGroupCount];
1490 for (
const Compositor::Insert &
insert : inserts) {
1491 for (; cacheIndex <
insert.cacheIndex(); ++cacheIndex)
1496 (*translatedInserts)[
i].append(
1505 if (movedItems &&
insert.isMove()) {
1513 ++cacheIndex, ++
offset) {
1515 cacheItem->
groups |=
insert.flags & Compositor::GroupMask;
1519 incubationTask->index[
i] = cacheItem->
groups & (1 <<
i)
1525 attached->m_currentIndex[
i] = cacheItem->
groups & (1 <<
i)
1550void QQmlDelegateModel::_q_itemsInserted(
int index,
int count)
1554 if (count <= 0 || !d->m_complete)
1560 for (
int i = 0,
c =
cache.size();
i <
c; ++
i) {
1564 if (!
d->m_cache.isSharedWith(
cache) && !
d->m_cache.contains(
item))
1568 const int newIndex =
item->modelIndex() +
count;
1569 const int row = newIndex;
1576 d->m_compositor.listItemsInserted(&
d->m_adaptorModel,
index,
count, &inserts);
1577 d->itemsInserted(inserts);
1594 int removedCache = 0;
1596 int removed[Compositor::MaximumGroupCount];
1600 for (
const Compositor::Remove &
remove : removes) {
1601 for (; cacheIndex <
remove.cacheIndex() && cacheIndex <
m_cache.
size(); ++cacheIndex)
1606 (*translatedRemoves)[
i].append(
1615 if (movedItems &&
remove.isMove()) {
1621 for (; cacheIndex <
remove.cacheIndex() +
remove.count - removedCache; ++cacheIndex) {
1626 if (
QQuickPackage *package = qmlobject_cast<QQuickPackage *>(
object))
1643 incubationTask->index[
i] = -1;
1647 attached->m_currentIndex[
i] = -1;
1657 if (
QQuickPackage *package = qmlobject_cast<QQuickPackage *>(
object))
1666 incubationTask->index[
i] =
remove.index[
i];
1673 attached->m_currentIndex[
i] =
remove.index[
i];
1676 cacheItem->
groups &= ~remove.flags;
1698void QQmlDelegateModel::_q_itemsRemoved(
int index,
int count)
1701 if (count <= 0|| !d->m_complete)
1709 item->referenceObject();
1711 for (
int i = 0,
c =
cache.size();
i <
c; ++
i) {
1715 if (!
d->m_cache.isSharedWith(
cache) && !
d->m_cache.contains(
item))
1719 const int newIndex =
item->modelIndex() -
count;
1720 const int row = newIndex;
1723 }
else if (
item->modelIndex() >=
index) {
1724 item->setModelIndex(-1, -1, -1);
1729 item->releaseObject();
1732 d->m_compositor.listItemsRemoved(&
d->m_adaptorModel,
index,
count, &removes);
1733 d->itemsRemoved(removes);
1744 itemsRemoved(removes, &translatedRemoves, &movedItems);
1755 translatedRemoves.
at(
i),
1756 translatedInserts.
at(
i));
1760void QQmlDelegateModel::_q_itemsMoved(
int from,
int to,
int count)
1763 if (count <= 0 || !d->m_complete)
1766 const int minimum =
qMin(from, to);
1767 const int maximum =
qMax(from, to) +
count;
1768 const int difference = from > to ?
count : -
count;
1771 for (
int i = 0,
c =
cache.size();
i <
c; ++
i) {
1775 if (!
d->m_cache.isSharedWith(
cache) && !
d->m_cache.contains(
item))
1778 if (
item->modelIndex() >= from &&
item->modelIndex() < from +
count) {
1779 const int newIndex =
item->modelIndex() - from + to;
1780 const int row = newIndex;
1784 const int newIndex =
item->modelIndex() + difference;
1785 const int row = newIndex;
1793 d->m_compositor.listItemsMoved(&
d->m_adaptorModel, from, to,
count, &removes, &inserts);
1794 d->itemsMoved(removes, inserts);
1803 emit q->countChanged();
1813 qmlWarning(
q) << QQmlDelegateModel::tr(
"The delegates of a DelegateModel cannot be changed within onUpdated.");
1852 attachedObjects.
append(cacheItem->attached);
1855 if (attached && attached->m_cacheItem)
1856 attached->emitChanges();
1860void QQmlDelegateModel::_q_modelAboutToBeReset()
1868 if (oldRoleNames == aim->roleNames()) {
1882void QQmlDelegateModel::handleModelReset()
1888 int oldCount =
d->m_count;
1891 if (
d->m_complete) {
1892 d->m_count =
d->adaptorModelCount();
1896 item->referenceObject();
1898 for (
int i = 0,
c =
cache.size();
i <
c; ++
i) {
1902 if (!
d->m_cache.isSharedWith(
cache) && !
d->m_cache.contains(
item))
1905 if (
item->modelIndex() != -1)
1906 item->setModelIndex(-1, -1, -1);
1910 item->releaseObject();
1914 d->m_compositor.listItemsRemoved(&
d->m_adaptorModel, 0, oldCount, &removes);
1916 d->m_compositor.listItemsInserted(&
d->m_adaptorModel, 0,
d->m_count, &inserts);
1917 d->itemsMoved(removes, inserts);
1920 if (
d->m_adaptorModel.canFetchMore())
1921 d->m_adaptorModel.fetchMore();
1931 if (
parent ==
d->m_adaptorModel.rootIndex)
1938 if (!
d->m_adaptorModel.rootIndex.isValid())
1942 const int oldCount =
d->m_count;
1944 d->disconnectFromAbstractItemModel();
1945 d->m_adaptorModel.invalidateModel();
1947 if (
d->m_complete && oldCount > 0) {
1949 d->m_compositor.listItemsRemoved(&
d->m_adaptorModel, 0, oldCount, &removes);
1950 d->itemsRemoved(removes);
1959 if (
parent ==
d->m_adaptorModel.rootIndex)
1963void QQmlDelegateModel::_q_rowsMoved(
1964 const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
1965 const QModelIndex &destinationParent,
int destinationRow)
1968 const int count = sourceEnd - sourceStart + 1;
1969 if (destinationParent ==
d->m_adaptorModel.rootIndex && sourceParent ==
d->m_adaptorModel.rootIndex) {
1970 _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow -
count,
count);
1971 }
else if (sourceParent ==
d->m_adaptorModel.rootIndex) {
1972 _q_itemsRemoved(sourceStart,
count);
1973 }
else if (destinationParent ==
d->m_adaptorModel.rootIndex) {
1974 _q_itemsInserted(destinationRow,
count);
1982 if (
parent ==
d->m_adaptorModel.rootIndex &&
begin == 0) {
1992 if (
parent ==
d->m_adaptorModel.rootIndex &&
begin == 0) {
2003 if ((
parent ==
d->m_adaptorModel.rootIndex &&
start == 0)
2013 if (
begin.parent() ==
d->m_adaptorModel.rootIndex)
2014 _q_itemsChanged(
begin.row(),
end.row() -
begin.row() + 1, roles);
2019 for (
int i = 0,
c = parents.
size();
i <
c; ++
i) {
2036 if (!parents.
isEmpty() &&
d->m_adaptorModel.rootIndex.isValid() && !isDescendantOf(
d->m_adaptorModel.rootIndex, parents)) {
2055 return cacheItem->attached;
2068 if (!
object.isObject())
2081 propertyName =
it.nextPropertyNameAsString(
v);
2082 if (propertyName->
isNull())
2089 cacheItem->
groups =
groups | Compositor::UnresolvedFlag | Compositor::CacheFlag;
2105 , groupCount(groupNames.
size() + 1)
2108 , groupNames(groupNames)
2123 builder.
setSuperClass(&QQmlDelegateModelAttached::staticMetaObject);
2131 propertyName.
toUtf8(),
"bool", notifierId);
2138 propertyName.
toUtf8(),
"int", notifierId);
2159 p->setSetter(
nullptr);
2178 p->setSetter(
nullptr);
2193 p->setSetter(
nullptr);
2205 groupFlags |= 2 <<
index;
2217 const QString groupName =
s->toQString();
2220 groupFlags |= 2 <<
index;
2230 const QString groupName =
v->toQString();
2233 groupFlags |= 2 <<
index;
2244 return b->engine()->throwTypeError(
QStringLiteral(
"Not a valid DelegateModel object"));
2245 if (!
o->d()->item->metaType->model)
2248 return o->d()->item->get();
2259 for (
int i = 1;
i <
o->d()->
item->metaType->groupCount; ++
i) {
2260 if (
o->d()->item->groups & (1 <<
i))
2261 groups.append(
o->d()->item->metaType->groupNames.at(
i - 1));
2277 if (!
o->d()->item->metaType->model)
2281 const int groupFlags =
model->m_cacheMetaType->parseGroups(argv[0]);
2282 const int cacheIndex =
model->m_cache.indexOf(
o->d()->item);
2283 Compositor::iterator
it =
model->m_compositor.find(Compositor::Cache, cacheIndex);
2284 model->setGroups(
it, 1, Compositor::Cache, groupFlags);
2300 bool member =
arg.toBoolean();
2301 uint groupFlag = (1 << flag);
2302 if (member == ((cacheItem->
groups & groupFlag) != 0))
2305 const int cacheIndex =
model->m_cache.indexOf(cacheItem);
2306 Compositor::iterator
it =
model->m_compositor.find(Compositor::Cache, cacheIndex);
2308 model->addGroups(
it, 1, Compositor::Cache, groupFlag);
2310 model->removeGroups(
it, 1, Compositor::Cache, groupFlag);
2325 ctxt = ctxt->nextChild()) {
2326 if (ctxt->contextObject() == childContextObject)
2327 ctxt->setContextObject(
nullptr);
2348 , metaType(metaType)
2396 model->removeCacheItem(
this);
2403 const int prevIndex =
index;
2404 const int prevRow =
row;
2405 const int prevColumn =
column;
2411 if (idx != prevIndex || alwaysEmit)
2413 if (
row != prevRow || alwaysEmit)
2415 if (
column != prevColumn || alwaysEmit)
2416 emit columnChanged();
2426 if (
data->ownContext) {
2427 data->ownContext->clearContext();
2428 if (
data->ownContext->contextObject() ==
object)
2429 data->ownContext->setContextObject(
nullptr);
2430 data->ownContext =
nullptr;
2431 data->context =
nullptr;
2440 if (
object->parent() ==
nullptr)
2442 object->deleteLater();
2464 return qobject_cast<QQmlDelegateModelItem *>(extraObject);
2468 return qobject_cast<QQmlDelegateModelItem *>(extraObject);
2491 : metaType(metaType)
2516 if (_id >= indexPropertyOffset) {
2517 Compositor::Group
group = Compositor::Group(_id - indexPropertyOffset + 1);
2520 }
else if (_id >= memberPropertyOffset) {
2521 Compositor::Group
group = Compositor::Group(_id - memberPropertyOffset + 1);
2526 if (_id >= memberPropertyOffset) {
2527 if (!metaType->
model)
2530 Compositor::Group
group = Compositor::Group(_id - memberPropertyOffset + 1);
2531 const int groupFlag = 1 <<
group;
2533 if (member && !*
static_cast<bool *
>(
arguments[0])) {
2534 Compositor::iterator
it =
model->m_compositor.find(
2537 }
else if (!member && *
static_cast<bool *
>(
arguments[0])) {
2540 Compositor::iterator
it =
model->m_compositor.find(
2542 model->addGroups(
it, 1, Compositor::Group(
i), groupFlag);
2550 return attached->qt_metacall(call, _id,
arguments);
2555 , m_previousGroups(0)
2562 : m_cacheItem(cacheItem)
2563 , m_previousGroups(cacheItem->
groups)
2584 Compositor::iterator
it =
model->m_compositor.find(
2621 Compositor::iterator
it =
model->m_compositor.find(Compositor::Cache, cacheIndex);
2623 model->addGroups(
it, 1, Compositor::Cache, groupFlag);
2625 model->removeGroups(
it, 1, Compositor::Cache, groupFlag);
2690 const int groupFlags =
model->m_cacheMetaType->parseGroups(
groups);
2692 Compositor::iterator
it =
model->m_compositor.find(Compositor::Cache, cacheIndex);
2693 model->setGroups(
it, 1, Compositor::Cache, groupFlags);
2761 int indexChanges = 0;
2763 for (
int i = 1;
i < groupCount; ++
i) {
2766 indexChanges |= (1 <<
i);
2775 for (
int i = 1;
i < groupCount; ++
i, ++notifierId) {
2776 if (groupChanges & (1 <<
i))
2779 for (
int i = 1;
i < groupCount; ++
i, ++notifierId) {
2780 if (indexChanges & (1 <<
i))
2813 emit q->countChanged();
2828 it->createdPackage(
index, package);
2834 it->initPackage(
index, package);
2840 it->destroyingPackage(package);
2916 if (
d->name !=
name) {
2945 return d->defaultInclude;
2951 if (
d->defaultInclude != include) {
2952 d->defaultInclude = include;
2995 if (!
model->m_context || !
model->m_context->isValid()) {
2997 }
else if (index < 0 || index >=
model->m_compositor.
count(
d->group)) {
3002 Compositor::iterator
it =
model->m_compositor.find(
d->group,
index);
3004 ?
model->m_cache.at(
it.cacheIndex())
3008 cacheItem =
model->m_adaptorModel.createItem(
3009 model->m_cacheMetaType,
it.modelIndex());
3014 model->m_cache.insert(
it.cacheIndex(), cacheItem);
3015 model->m_compositor.setFlags(
it, 1, Compositor::CacheFlag);
3018 if (
model->m_cacheMetaType->modelItemProto.isUndefined())
3019 model->m_cacheMetaType->initializePrototype();
3025 o->setPrototypeOf(
p);
3032 if (
value.isNumber()) {
3037 if (!
value.isObject())
3050 *
group = Compositor::Cache;
3080 Compositor::Group
group =
d->group;
3100 :
model->m_compositor.end();
3103 if (++i < args->
length()) {
3112 model->emitChanges();
3145 Compositor::Group
group =
d->group;
3153 if (i < args->
length() &&
index >= 0 && index <= model->m_compositor.count(
group)) {
3157 if (++i < args->
length()) {
3164 :
model->m_compositor.end();
3183 model->m_compositor.setFlags(
it, 1,
d->group, Compositor::PersistedFlag, &inserts);
3184 model->itemsInserted(inserts);
3185 model->m_cache.at(
it.cacheIndex())->releaseObject();
3189 model->emitChanges();
3221 Compositor::Group fromGroup =
d->group;
3222 Compositor::Group toGroup =
d->group;
3226 if (
d->parseIndex(
v, &from, &fromGroup)) {
3227 if (from < 0 || from >=
model->m_compositor.
count(fromGroup)) {
3228 qmlWarning(
this) <<
tr(
"resolve: from index out of range");
3237 if (
d->parseIndex(
v, &to, &toGroup)) {
3238 if (to < 0 || to >=
model->m_compositor.
count(toGroup)) {
3239 qmlWarning(
this) <<
tr(
"resolve: to index out of range");
3247 Compositor::iterator fromIt =
model->m_compositor.find(fromGroup, from);
3248 Compositor::iterator toIt =
model->m_compositor.find(toGroup, to);
3250 if (!fromIt->isUnresolved()) {
3251 qmlWarning(
this) <<
tr(
"resolve: from is not an unresolved item");
3255 qmlWarning(
this) <<
tr(
"resolve: to is not a model item");
3259 const int unresolvedFlags = fromIt->flags;
3260 const int resolvedFlags = toIt->flags;
3261 const int resolvedIndex = toIt.modelIndex();
3262 void *
const resolvedList = toIt->list;
3265 cacheItem->
groups &= ~Compositor::UnresolvedFlag;
3267 if (toIt.cacheIndex() > fromIt.cacheIndex())
3268 toIt.decrementIndexes(1, unresolvedFlags);
3269 if (!toIt->inGroup(fromGroup) || toIt.index[fromGroup] > from)
3275 model->itemsInserted(
3277 toIt.incrementIndexes(1, resolvedFlags | unresolvedFlags);
3280 model->m_compositor.setFlags(toGroup, to, 1, unresolvedFlags & ~Compositor::UnresolvedFlag);
3281 model->m_compositor.clearFlags(fromGroup, from, 1, unresolvedFlags);
3283 if (resolvedFlags & Compositor::CacheFlag)
3284 model->m_compositor.insert(
3285 Compositor::Cache, toIt.cacheIndex(), resolvedList,
3286 resolvedIndex, 1, Compositor::CacheFlag);
3291 Q_ASSERT(toIt.cacheIndex() ==
model->m_cache.indexOf(cacheItem));
3292 model->m_cache.removeAt(toIt.cacheIndex());
3293 model->m_compositor.clearFlags(
3294 Compositor::Cache, toIt.cacheIndex(), 1, Compositor::CacheFlag);
3303 model->emitChanges();
3317 Compositor::Group
group =
d->group;
3332 if (++i < args->
length()) {
3341 }
else if (
count != 0) {
3343 if (count < 0 || count >
model->m_compositor.
count(
d->group) -
it.index[
d->group]) {
3367 if (
v->isNumber()) {
3389 Compositor::Group
group =
d->group;
3399 qmlWarning(
this) <<
tr(
"addGroups: index out of range");
3400 }
else if (
count != 0) {
3402 if (count < 0 || count >
model->m_compositor.
count(
d->group) -
it.index[
d->group]) {
3419 Compositor::Group
group =
d->group;
3429 qmlWarning(
this) <<
tr(
"removeGroups: index out of range");
3430 }
else if (
count != 0) {
3432 if (count < 0 || count >
model->m_compositor.
count(
d->group) -
it.index[
d->group]) {
3450 Compositor::Group
group =
d->group;
3460 qmlWarning(
this) <<
tr(
"setGroups: index out of range");
3461 }
else if (
count != 0) {
3463 if (count < 0 || count >
model->m_compositor.
count(
d->group) -
it.index[
d->group]) {
3489 Compositor::Group fromGroup =
d->group;
3490 Compositor::Group toGroup =
d->group;
3497 if (!
d->parseIndex(
v, &from, &fromGroup)) {
3503 if (!
d->parseIndex(
v, &to, &toGroup)) {
3518 }
else if (from < 0 || from + count >
model->m_compositor.
count(fromGroup)) {
3519 qmlWarning(
this) <<
tr(
"move: from index out of range");
3520 }
else if (!
model->m_compositor.verifyMoveTo(fromGroup, from, toGroup, to,
count,
d->group)) {
3522 }
else if (
count > 0) {
3526 model->m_compositor.move(fromGroup, from, toGroup, to,
count,
d->group, &removes, &inserts);
3527 model->itemsMoved(removes, inserts);
3528 model->emitChanges();
3552 , m_inheritGroup(true)
3555 if (
d->m_cacheMetaType) {
3557 m_compositorGroup = Compositor::Default;
3559 d->m_pendingParts.insert(
this);
3571 return m_filterGroup;
3577 qmlWarning(
this) <<
tr(
"The group of a DelegateModel cannot be changed within onChanged");
3581 if (m_filterGroup !=
group || m_inheritGroup) {
3582 m_filterGroup =
group;
3583 m_inheritGroup =
false;
3592 if (!m_inheritGroup) {
3593 m_inheritGroup =
true;
3602 if (!
model->m_cacheMetaType)
3605 if (m_inheritGroup) {
3606 if (m_filterGroup ==
model->m_filterGroup)
3608 m_filterGroup =
model->m_filterGroup;
3612 m_compositorGroup = Compositor::Default;
3614 for (
int i = 1;
i <
model->m_groupCount; ++
i) {
3615 if (m_filterGroup ==
model->m_cacheMetaType->groupNames.at(
i - 1)) {
3616 m_compositorGroup = Compositor::Group(
i);
3622 if (m_compositorGroup != previousGroup) {
3625 model->m_compositor.transition(previousGroup, m_compositorGroup, &removes, &inserts);
3628 changeSet.
move(removes, inserts);
3640 if (!m_inheritGroup)
3643 m_compositorGroup =
group;
3658 return model->m_delegate
3659 ?
model->m_compositor.
count(m_compositorGroup)
3672 if (!
model->m_delegate || index < 0 || index >=
model->m_compositor.
count(m_compositorGroup)) {
3673 qWarning() <<
"DelegateModel::item: index out range" <<
index <<
model->m_compositor.
count(m_compositorGroup);
3679 if (
QQuickPackage *package = qmlobject_cast<QQuickPackage *>(
object)) {
3680 QObject *part = package->part(m_part);
3683 m_packaged.
insert(part, package);
3687 model->release(
object);
3688 if (!
model->m_delegateValidated) {
3690 qmlWarning(
model->m_delegate) <<
tr(
"Delegate component must be Package type.");
3691 model->m_delegateValidated =
true;
3699 QQmlInstanceModel::ReleaseFlags
flags;
3702 if (
it != m_packaged.
end()) {
3706 m_packaged.erase(
it);
3707 if (!m_packaged.contains(
item))
3708 flags &= ~Referenced;
3709 if (
flags & Destroyed)
3723 model->m_adaptorModel.replaceWatchedRoles(m_watchedRoles, roles);
3724 m_watchedRoles = roles;
3730 Compositor::iterator
it =
model->m_compositor.find(
model->m_compositorGroup,
index);
3734 if (
auto incubationTask =
model->m_cache.at(
it.cacheIndex())->incubationTask)
3735 return incubationTask->status();
3743 if (
it != m_packaged.
end()) {
3745 return cacheItem->groupIndex(m_compositorGroup);
3757 if (m_modelUpdatePending)
3758 m_pendingPackageInitializations <<
index;
3772 m_modelUpdatePending =
false;
3779 qSwap(pendingPackageInitializations, m_pendingPackageInitializations);
3780 for (
int index : pendingPackageInitializations) {
3781 if (!
model->m_delegate || index < 0 || index >=
model->m_compositor.
count(m_compositorGroup))
3784 if (
QQuickPackage *package = qmlobject_cast<QQuickPackage *>(
object))
3786 model->release(
object);
3840 m_reusableItemsPool.append(modelItem);
3842 qCDebug(lcItemViewDelegateRecycling)
3843 <<
"item:" << modelItem
3844 <<
"delegate:" << modelItem->
delegate
3848 <<
"pool size:" << m_reusableItemsPool.size();
3855 for (
auto it = m_reusableItemsPool.
begin();
it != m_reusableItemsPool.
end(); ++
it) {
3856 if ((*it)->delegate != delegate)
3858 auto modelItem = *
it;
3859 m_reusableItemsPool.
erase(
it);
3861 qCDebug(lcItemViewDelegateRecycling)
3862 <<
"item:" << modelItem
3863 <<
"delegate:" << delegate
3864 <<
"old index:" << modelItem->modelIndex()
3865 <<
"old row:" << modelItem->modelRow()
3866 <<
"old column:" << modelItem->modelColumn()
3867 <<
"new index:" << newIndexHint
3868 <<
"pool size:" << m_reusableItemsPool.size();
3873 qCDebug(lcItemViewDelegateRecycling)
3874 <<
"no available item for delegate:" << delegate
3875 <<
"new index:" << newIndexHint
3876 <<
"pool size:" << m_reusableItemsPool.size();
3889 qCDebug(lcItemViewDelegateRecycling) <<
"pool size before drain:" << m_reusableItemsPool.size();
3891 for (
auto it = m_reusableItemsPool.
begin();
it != m_reusableItemsPool.
end();) {
3892 auto modelItem = *
it;
3893 modelItem->poolTime++;
3894 if (modelItem->poolTime <= maxPoolTime) {
3898 releaseItem(modelItem);
3902 qCDebug(lcItemViewDelegateRecycling) <<
"pool size after drain:" << m_reusableItemsPool.size();
3934 if (that->d()->change.moveId < 0)
3957 if (
id.isArrayIndex()) {
3966 *hasProperty =
false;
3974 object->setPrototypeOf(changeProto);
3975 object->d()->change = change;
3978 *hasProperty =
true;
3979 return object.asReturnedValue();
3985 if (
id ==
array->engine()->id_length()->propertyKey()) {
3987 *hasProperty =
true;
3991 return Object::virtualGet(
m,
id, receiver, hasProperty);
4001 o->setArrayType(QV4::Heap::ArrayData::Custom);
4014 changeProto.set(v4, proto);
4026 return o.asReturnedValue();
4031#include "moc_qqmldelegatemodel_p_p.cpp"
4033#include "moc_qqmldelegatemodel_p.cpp"
void modelAboutToBeReset(QPrivateSignal)
LayoutChangeHint
This enum describes the way the model changes layout.
void modelReset(QPrivateSignal)
virtual QHash< int, QByteArray > roleNames() const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
Returns the index of the data in row and column with parent.
QChar toUpper() const noexcept
Returns the uppercase equivalent if the character is lowercase or titlecase; otherwise returns the ch...
static QCoreApplication * instance() noexcept
Returns a pointer to the application's QCoreApplication (or QGuiApplication/QApplication) instance.
static void postEvent(QObject *receiver, QEvent *event, int priority=Qt::NormalEventPriority)
bool isEmpty() const noexcept
Returns true if the hash contains no items; otherwise returns false.
void insert(N *n)
Insert object into the list.
iterator end()
Returns an STL-style iterator pointing to the imaginary item after the last item in the list.
iterator begin()
Returns an STL-style interator pointing to the first item in the list.
QV4::ExecutionEngine * handle() const
static QJSValue fromReturnedValue(QV4::ReturnedValue d)
The QJSValue class acts as a container for Qt/JavaScript data types.
qsizetype size() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
iterator erase(const_iterator begin, const_iterator end)
iterator insert(qsizetype i, parameter_type t)
qsizetype length() const noexcept
const_reference at(qsizetype i) const noexcept
const_iterator constBegin() const noexcept
QList< T > mid(qsizetype pos, qsizetype len=-1) const
void append(parameter_type t)
iterator find(const Key &key)
bool contains(const Key &key) const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
iterator end() noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
QDynamicMetaObjectData * metaObject
static QObjectPrivate * get(QObject *o)
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QObject * sender() const
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; othe...
virtual bool event(QEvent *event)
This virtual function receives events to an object and should return true if the event e was recogniz...
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
void deleteLater()
\threadsafe
QPointer< QObject > proxiedObject
QQmlRefPointer< QQmlContextData > proxyContext
void statusChanged(Status) override
Called when the status of the incubator changes.
void setInitialState(QObject *) override
Called after the object is first created, but before property bindings are evaluated and,...
int index[QQmlListCompositor::MaximumGroupCount]
QQmlDelegateModelItem * incubating
QQmlDelegateModelPrivate * vdm
void initializeRequiredProperties(QQmlDelegateModelItem *modelItemToIncubate, QObject *object)
virtual QQmlComponent * delegate(QQmlAdaptorModel *adaptorModel, int row, int column=0) const =0
QQmlPropertyCache::ConstPtr propertyCache
bool notify(const QList< QQmlDelegateModelItem * > &items, int index, int count, const QVector< int > &roles) const
QAbstractItemModel * aim()
bool canFetchMore() const
QQmlDelegateModelItem * createItem(const QQmlRefPointer< QQmlDelegateModelItemMetaType > &metaType, int index)
bool hasProxyObject() const
QQmlAnyBinding is an abstraction over the various bindings in QML.
void installOn(const QQmlProperty &target, InterceptorMode mode=IgnoreInterceptors)
The QQmlChangeSet class stores an ordered list of notifications about changes to a linear data set.
const QVector< Change > & removes() const
void remove(int index, int count)
Appends a notification that count items were removed at index.
void change(int index, int count)
Appends a notification that count items were changed at index.
void move(int from, int to, int count, int moveId)
Appends a notification that count items were moved from one index to another.
void insert(int index, int count)
Appends a notification that count items were inserted at index.
const QVector< Change > & inserts() const
static QQmlComponentPrivate * get(QQmlComponent *c)
static QQmlProperty removePropertyFromRequired(QObject *createdComponent, const QString &name, RequiredProperties *requiredProperties, QQmlEngine *engine, bool *wasInRequiredProperties=nullptr)
The QQmlComponent class encapsulates a QML component definition.
QQmlContext * creationContext() const
Returns the QQmlContext the component was created in.
QList< QQmlError > errors() const
Returns the list of errors that occurred during the last compile or create operation.
void setContextObject(QObject *contextObject)
static QQmlRefPointer< QQmlContextData > get(QQmlContext *context)
static QQmlRefPointer< QQmlContextData > createChild(const QQmlRefPointer< QQmlContextData > &parent)
QQmlRefPointer< QQmlContextData > childContexts() const
static QQmlRefPointer< QQmlContextData > createRefCounted(const QQmlRefPointer< QQmlContextData > &parent)
The QQmlContext class defines a context within a QML engine.
bool isValid() const
Returns whether the context is valid.
QQmlEngine * engine() const
Return the context's QQmlEngine, or \nullptr if the context has no QQmlEngine or the QQmlEngine was d...
QQmlPropertyCache::ConstPtr propertyCache
static QQmlData * get(QObjectPrivate *priv, bool create)
void setInItems(bool inItems)
void emitUnresolvedChanged()
void setGroups(const QStringList &groups)
void emitChanges()
\qmlattachedproperty bool QtQml.Models::DelegateModel::inItems
int m_previousIndex[QQmlListCompositor::MaximumGroupCount]
int m_currentIndex[QQmlListCompositor::MaximumGroupCount]
QQmlDelegateModel * model
void setInPersistedItems(bool inPersisted)
QQmlDelegateModelAttached(QObject *parent)
QQmlDelegateModelItem * m_cacheItem
~QQmlDelegateModelEngineData()
QV4::PersistentValue changeProto
QV4::ReturnedValue array(QV4::ExecutionEngine *engine, const QVector< QQmlChangeSet::Change > &changes)
QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4)
bool parseIndex(const QV4::Value &value, int *index, Compositor::Group *group) const
void createdPackage(int index, QQuickPackage *package)
QPointer< QQmlDelegateModel > model
static QQmlDelegateModelGroupPrivate * get(QQmlDelegateModelGroup *group)
bool isChangedConnected()
bool parseGroupArgs(QQmlV4Function *args, Compositor::Group *group, int *index, int *count, int *groups) const
void initPackage(int index, QQuickPackage *package)
void emitModelUpdated(bool reset)
QQmlDelegateModelGroupEmitterList emitters
void destroyingPackage(QQuickPackage *package)
void setModel(QQmlDelegateModel *model, Compositor::Group group)
void emitChanges(QV4::ExecutionEngine *engine)
void resolve(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::resolve(int from, int to)
void setName(const QString &name)
bool defaultInclude() const
\qmlproperty bool QtQml.Models::DelegateModelGroup::includeByDefault
void insert(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::insert(int index, jsdict data, array groups = undefined)...
~QQmlDelegateModelGroup()
void setGroups(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::setGroups(int index, int count, stringlist groups)
void addGroups(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::addGroups(int index, int count, stringlist groups)
void remove(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::remove(int index, int count)
Q_INVOKABLE QJSValue get(int index)
\qmlmethod object QtQml.Models::DelegateModelGroup::get(int index)
void removeGroups(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::removeGroups(int index, int count, stringlist groups)
void setDefaultInclude(bool include)
void defaultIncludeChanged()
void create(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::create(int index) \qmlmethod QtQml.Models::DelegateModel...
void move(QQmlV4Function *)
\qmlmethod QtQml.Models::DelegateModelGroup::move(var from, var to, int count)
QQmlDelegateModelGroup(QObject *parent=nullptr)
\qmltype DelegateModelGroup \instantiates QQmlDelegateModelGroup \inqmlmodule QtQml....
QQDMIncubationTask * incubationTask
static QV4::ReturnedValue set_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg)
void childContextObjectDestroyed(QObject *childContextObject)
virtual void setValue(const QString &role, const QVariant &value)
QPointer< QQmlDelegateModelAttached > attached
static QV4::ReturnedValue get_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &)
static QV4::ReturnedValue get_index(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg)
static QV4::ReturnedValue get_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
int groupIndex(Compositor::Group group)
virtual bool resolveIndex(const QQmlAdaptorModel &, int)
static QQmlDelegateModelItem * dataForObject(QObject *object)
static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
bool isReferenced() const
virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit=false)
bool isObjectReferenced() const
QQmlDelegateModelItem(const QQmlRefPointer< QQmlDelegateModelItemMetaType > &metaType, QQmlAdaptorModel::Accessors *accessor, int modelIndex, int row, int column)
QQmlRefPointer< QQmlContextData > contextData
static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
QPointer< QObject > object
QQmlRefPointer< QQmlDelegateModelItemMetaType > const metaType
QQmlDelegateModelParts(QQmlDelegateModel *parent)
QList< QQmlPartsModel * > models
QQmlDelegateModel * model
void setInitialState(QQDMIncubationTask *incubationTask, QObject *o)
void removeCacheItem(QQmlDelegateModelItem *cacheItem)
QVariant variantValue(Compositor::Group group, int index, const QString &name)
bool m_incubatorCleanupScheduled
void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package)
QList< QQDMIncubationTask * > m_finishedIncubating
QQmlDelegateModelItemMetaType * m_cacheMetaType
QList< QQmlDelegateModelItem * > m_cache
QQmlDelegateModel::ReleaseFlags release(QObject *object, QQmlInstanceModel::ReusableFlag reusable=QQmlInstanceModel::NotReusable)
QQmlDelegateModelParts * m_parts
static qsizetype group_count(QQmlListProperty< QQmlDelegateModelGroup > *property)
QQmlAbstractDelegateComponent * m_delegateChooser
QPointer< QQmlContext > m_context
void emitCreatedItem(QQDMIncubationTask *incubationTask, QObject *item)
void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item)
static void group_append(QQmlListProperty< QQmlDelegateModelGroup > *property, QQmlDelegateModelGroup *group)
QQmlStrongJSQObjectReference< QQmlComponent > m_delegate
void emitDestroyingItem(QObject *item)
void addCacheItem(QQmlDelegateModelItem *item, Compositor::iterator it)
void reuseItem(QQmlDelegateModelItem *item, int newModelIndex, int newGroups)
void drainReusableItemsPool(int maxPoolTime)
QQmlDelegateModelGroup * m_persistedItems
static QQmlDelegateModelGroup * group_at(QQmlListProperty< QQmlDelegateModelGroup > *property, qsizetype index)
void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override
QObject * object(Compositor::Group group, int index, QQmlIncubator::IncubationMode incubationMode)
void destroyCacheItem(QQmlDelegateModelItem *cacheItem)
void connectToAbstractItemModel()
int adaptorModelCount() const
void itemsRemoved(const QVector< Compositor::Remove > &removes, QVarLengthArray< QVector< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedRemoves, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
bool insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups)
void itemsInserted(const QVector< Compositor::Insert > &inserts, QVarLengthArray< QVector< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedInserts, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
QQmlDelegateModelPrivate(QQmlContext *)
Encapsulates a model and delegate.
void delegateChanged(bool add=true, bool remove=true)
QQmlListCompositor m_compositor
QQmlDelegateModelGroup * m_items
void releaseIncubator(QQDMIncubationTask *incubationTask)
bool m_waitingToFetchMore
void incubatorStatusChanged(QQDMIncubationTask *incubationTask, QQmlIncubator::Status status)
void emitInitPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package)
void addGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void emitDestroyingPackage(QQuickPackage *package)
void requestMoreIfNecessary()
QQmlComponent * resolveDelegate(int index)
QQmlDelegateModelGroup * m_groups[Compositor::MaximumGroupCount]
void itemsChanged(const QVector< Compositor::Change > &changes)
void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void disconnectFromAbstractItemModel()
QQmlReusableDelegateModelItemsPool m_reusableItemsPool
void itemsMoved(const QVector< Compositor::Remove > &removes, const QVector< Compositor::Insert > &inserts)
QQmlAdaptorModel m_adaptorModel
~QQmlDelegateModelPrivate()
QQmlListCompositor::Group m_compositorGroup
static QQmlDelegateModelPrivate * get(QQmlDelegateModel *m)
void setModel(const QVariant &)
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void filterGroupChanged()
Q_INVOKABLE QVariant modelIndex(int idx) const
\qmlmethod QModelIndex QtQml.Models::DelegateModel::modelIndex(int index)
QQmlDelegateModelGroup * items
\qmlproperty DelegateModelGroup QtQml.Models::DelegateModel::items
void setDelegate(QQmlComponent *)
int count() const override
\qmlproperty int QtQml.Models::DelegateModel::count
void classBegin() override
Invoked after class creation, but before any properties have been set.
void drainReusableItemsPool(int maxPoolTime) override
QVariant variantValue(int index, const QString &role) override
bool event(QEvent *) override
This virtual function receives events to an object and should return true if the event e was recogniz...
QString filterGroup() const
\qmlproperty string QtQml.Models::DelegateModel::filterOnGroup
int indexOf(QObject *object, QObject *objectContext) const override
void setRootIndex(const QVariant &root)
void setFilterGroup(const QString &group)
const QAbstractItemModel * abstractItemModel() const override
Q_INVOKABLE QVariant parentModelIndex() const
\qmlmethod QModelIndex QtQml.Models::DelegateModel::parentModelIndex()
QObject * parts
\qmlproperty object QtQml.Models::DelegateModel::parts
static QQmlDelegateModelAttached * qmlAttachedProperties(QObject *obj)
bool isValid() const override
QQmlListProperty< QQmlDelegateModelGroup > groups
\qmlproperty list<DelegateModelGroup> QtQml.Models::DelegateModel::groups
void setWatchedRoles(const QList< QByteArray > &roles) override
QQmlDelegateModelGroup * persistedItems
\qmlproperty DelegateModelGroup QtQml.Models::DelegateModel::persistedItems
QQmlIncubator::Status incubationStatus(int index) override
ReleaseFlags release(QObject *object, ReusableFlag reusableFlag=NotReusable) override
void cancel(int index) override
static QQmlEnginePrivate * get(QQmlEngine *e)
The QQmlEngine class provides an environment for instantiating QML components.
static QQmlIncubatorPrivate * get(QQmlIncubator *incubator)
QList< QQmlError > errors() const
Return the list of errors encountered while incubating the object.
void clear()
Clears the incubator.
bool isError() const
Returns true if the incubator's status() is Error.
IncubationMode
Specifies the mode the incubator operates in.
void forceCompletion()
Force any in-progress incubation to finish synchronously.
Status status() const
Return the current status of the incubator.
Status
Specifies the status of the QQmlIncubator.
IncubationMode incubationMode() const
Return the incubation mode passed to the QQmlIncubator constructor.
void createdItem(int index, QObject *object)
void modelUpdated(const QQmlChangeSet &changeSet, bool reset)
void destroyingItem(QObject *object)
void initItem(int index, QObject *object)
void setRemoveGroups(int groups)
iterator find(Group group, int index)
Returns an iterator representing the item at index in a group.
void transition(Group from, Group to, QVector< QQmlChangeSet::Change > *removes, QVector< QQmlChangeSet::Change > *inserts)
void setDefaultGroup(Group group)
int count(Group group) const
Returns the number of items that belong to a group.
void clearFlags(Group fromGroup, int from, int count, Group group, uint flags, QVector< Remove > *removals=nullptr)
Clears the given flags flags on count items belonging to group starting at the position from.
void setFlags(Group fromGroup, int from, int count, Group group, int flags, QVector< Insert > *inserts=nullptr)
Sets the given flags flags on count items belonging to group starting at the position identified by f...
void clearDefaultGroup(Group group)
void insert(Group group, int before, void *list, int index, int count, uint flags, QVector< Insert > *inserts=nullptr)
Inserts a range of count indexes starting at index from a list with the given flags into a group at i...
The QQmlListProperty class allows applications to expose list-like properties of QObject-derived clas...
void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override
QVariant variantValue(int index, const QString &role) override
int count() const override
void filterGroupChanged()
void setFilterGroup(const QString &group)
QQmlIncubator::Status incubationStatus(int index) override
int indexOf(QObject *item, QObject *objectContext) const override
void destroyingPackage(QQuickPackage *package) override
void setWatchedRoles(const QList< QByteArray > &roles) override
QQmlPartsModel(QQmlDelegateModel *model, const QString &part, QObject *parent=nullptr)
\qmlsignal QtQml.Models::DelegateModelGroup::changed(array removed, array inserted)
ReleaseFlags release(QObject *item, ReusableFlag reusable=NotReusable) override
void createdPackage(int index, QQuickPackage *package) override
void initPackage(int index, QQuickPackage *package) override
QString filterGroup() const
bool isValid() const override
The QQmlProperty class abstracts accessing properties on objects created from QML.
int index() const
Return the Qt metaobject index of the property.
QML_ANONYMOUSQObject * object
void drain(int maxPoolTime, std::function< void(QQmlDelegateModelItem *cacheItem)> releaseItem)
void insertItem(QQmlDelegateModelItem *modelItem)
QQmlDelegateModelItem * takeItem(const QQmlComponent *delegate, int newIndexHint)
QObject * part(const QString &=QString())
iterator erase(const_iterator i)
constexpr QStringView mid(qsizetype pos, qsizetype n=-1) const noexcept
Returns the substring of length length starting at position start in this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString & replace(qsizetype i, qsizetype len, QChar after)
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
QString left(qsizetype n) const
Returns a substring that contains the n leftmost characters of the string.
QByteArray toUtf8() const &
ObjectType::Data * allocate(Args &&... args)
void set(ExecutionEngine *engine, const Value &value)
const T & at(qsizetype idx) const
void push_back(const T &t)
void reserve(qsizetype sz)
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
qDeleteAll(list.begin(), list.end())
QCache< int, Employee > cache
[0]
QSet< QString >::iterator it
QList< QVariant > arguments
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
QVector3D minimum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW
QVector3D maximum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW
static int arrayLength(const QString &rawType)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char * destination
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QV4::ExecutionEngine * v4Engine(QV4::Value *d)
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint GLenum GLsizei length
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLenum GLenum GLsizei void GLsizei void * column
GLdouble GLdouble GLdouble GLdouble q
GLenum GLenum GLsizei void * row
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
static qreal dot(const QPointF &a, const QPointF &b)
static void add(QPainterPath &path, const QWingedEdge &list, int edge, QPathEdge::Traversal traversal)
QQmlContext * qmlContext(const QObject *obj)
static QQmlRefPointer< QQmlContextData > initProxy(QQmlDelegateModelItem *cacheItem)
static bool isDoneIncubating(QQmlIncubator::Status status)
static void incrementIndexes(QQmlDelegateModelItem *cacheItem, int count, const int *deltas)
QQmlDelegateModelGroupEmitterList::iterator GroupEmitterListIt
QT_BEGIN_NAMESPACE typedef QQmlListCompositor Compositor
#define qmlobject_connect(Sender, SenderType, Signal, Receiver, ReceiverType, Method)
Connect Signal of Sender to Method of Receiver.
void QQml_setParent_noEvent(QObject *object, QObject *parent)
Makes the object a child of parent.
#define IS_SIGNAL_CONNECTED(Sender, SenderType, Name, Arguments)
Q_QML_EXPORT QQmlInfo qmlInfo(const QObject *me)
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
#define V4_DEFINE_EXTENSION(dataclass, datafunction)
#define THROW_TYPE_ERROR()
#define RETURN_UNDEFINED()
#define DEFINE_OBJECT_VTABLE(classname)
#define V4_OBJECT2(DataClass, superClass)
const char className[16]
[1]
QSqlQueryModel * model
[16]
settings remove("monkey")
obj metaObject() -> className()
\inmodule QtCore \reentrant
qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const noexcept
const QQmlChangeSet::Change & at(int index) const
static QV4::Heap::QQmlDelegateModelGroupChangeArray * create(QV4::ExecutionEngine *engine, const QVector< QQmlChangeSet::Change > &changes)
static QV4::ReturnedValue virtualGet(const QV4::Managed *m, QV4::PropertyKey id, const QV4::Value *receiver, bool *hasProperty)
static QV4::ReturnedValue method_get_index(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
static QV4::ReturnedValue method_get_moveId(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
static QV4::Heap::QQmlDelegateModelGroupChange * create(QV4::ExecutionEngine *e)
static QV4::ReturnedValue method_get_count(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
static ReturnedValue virtualCall(const QV4::FunctionObject *that, const Value *thisObject, const Value *argv, int argc)
static Heap::DelegateModelGroupFunction * create(QV4::ExecutionContext *scope, uint flag, QV4::ReturnedValue(*code)(QQmlDelegateModelItem *item, uint flag, const QV4::Value &arg))
static constexpr ReturnedValue undefined()
MemoryManager * memoryManager
ExecutionContext * rootContext() const
Heap::String * newString(const QString &s=QString())
QV4::ReturnedValue fromVariant(const QVariant &)
Heap::Object * newObject()
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjectsAndSymbols=true)
ReturnedValue throwTypeError()
void init(const QVector< QQmlChangeSet::Change > &changes)
QVector< QQmlChangeSet::Change > * changes
QQmlChangeSet::ChangeData change
QQmlDelegateModelItem * item
ExecutionEngine * engine() const
static ReturnedValue wrap(ExecutionEngine *engine, QObject *object)
constexpr ReturnedValue asReturnedValue() const
static constexpr Value undefinedValue()
QString toQStringNoThrow() const
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent