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