Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmladaptormodel.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
6
7#include <private/qqmldmabstractitemmodeldata_p.h>
8#include <private/qqmldmlistaccessordata_p.h>
9#include <private/qqmldmobjectdata_p.h>
10
12
13QQmlAdaptorModel::Accessors::~Accessors()
14{
15}
16
17QQmlAdaptorModel::QQmlAdaptorModel()
18 : QQmlGuard<QObject>(QQmlAdaptorModel::objectDestroyedImpl, nullptr)
19 , accessors(&m_nullAccessors)
20{
21}
22
23QQmlAdaptorModel::~QQmlAdaptorModel()
24{
25 accessors->cleanup(*this);
26}
27
28void QQmlAdaptorModel::setModel(const QVariant &variant)
29{
30 accessors->cleanup(*this);
31
32 // Don't use variant anymore after this. list may transform it.
33 list.setList(variant);
34
35 modelStrongReference.clear();
36
37 if (QObject *object = qvariant_cast<QObject *>(list.list())) {
38 if (QQmlData *ddata = QQmlData::get(object))
39 modelStrongReference = ddata->jsWrapper;
40 setObject(object);
41 if (qobject_cast<QAbstractItemModel *>(object))
42 accessors = new VDMAbstractItemModelDataType(this);
43 else
44 accessors = new VDMObjectDelegateDataType(this);
45 return;
46 }
47
48 switch (list.type()) {
49 case QQmlListAccessor::ListProperty:
50 setObject(static_cast<const QQmlListReference *>(list.list().constData())->object());
51 if (QQmlData *ddata = QQmlData::get(object()))
52 modelStrongReference = ddata->jsWrapper;
53 accessors = new VDMObjectDelegateDataType(this);
54 break;
55 case QQmlListAccessor::ObjectList:
56 case QQmlListAccessor::ObjectSequence:
57 setObject(nullptr);
58 accessors = new VDMObjectDelegateDataType(this);
59 break;
60 case QQmlListAccessor::StringList:
61 case QQmlListAccessor::UrlList:
62 case QQmlListAccessor::VariantList:
63 case QQmlListAccessor::Integer:
64 case QQmlListAccessor::ValueSequence:
65 setObject(nullptr);
66 accessors = new VDMListDelegateDataType(this);
67 break;
68 case QQmlListAccessor::Instance:
69 case QQmlListAccessor::Invalid:
70 setObject(nullptr);
71 accessors = &m_nullAccessors;
72 break;
73 }
74}
75
76void QQmlAdaptorModel::invalidateModel()
77{
78 accessors->cleanup(*this);
79 accessors = &m_nullAccessors;
80 // Don't clear the model object as we still need the guard to clear the list variant if the
81 // object is destroyed.
82}
83
84bool QQmlAdaptorModel::isValid() const
85{
86 return accessors != &m_nullAccessors;
87}
88
89int QQmlAdaptorModel::count() const
90{
91 return rowCount() * columnCount();
92}
93
94int QQmlAdaptorModel::rowCount() const
95{
96 return qMax(0, accessors->rowCount(*this));
97}
98
99int QQmlAdaptorModel::columnCount() const
100{
101 return qMax(0, accessors->columnCount(*this));
102}
103
104int QQmlAdaptorModel::rowAt(int index) const
105{
106 int count = rowCount();
107 return count <= 0 ? -1 : index % count;
108}
109
110int QQmlAdaptorModel::columnAt(int index) const
111{
112 int count = rowCount();
113 return count <= 0 ? -1 : index / count;
114}
115
116int QQmlAdaptorModel::indexAt(int row, int column) const
117{
118 return column * rowCount() + row;
119}
120
121void QQmlAdaptorModel::useImportVersion(QTypeRevision revision)
122{
123 modelItemRevision = revision;
124}
125
126void QQmlAdaptorModel::objectDestroyedImpl(QQmlGuardImpl *guard)
127{
128 auto This = static_cast<QQmlAdaptorModel *>(guard);
129 This->setModel(QVariant());
130}
131
132QT_END_NAMESPACE