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