1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtQml module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QQMLLIST_H
41#define QQMLLIST_H
42
43#include <QtQml/qtqmlglobal.h>
44#include <QtCore/qlist.h>
45#include <QtCore/qvariant.h>
46
47QT_BEGIN_NAMESPACE
48
49
50class QObject;
51struct QMetaObject;
52
53#ifndef QQMLLISTPROPERTY
54#define QQMLLISTPROPERTY
55template<typename T>
56class QQmlListProperty {
57public:
58 typedef void (*AppendFunction)(QQmlListProperty<T> *, T*);
59 typedef int (*CountFunction)(QQmlListProperty<T> *);
60 typedef T *(*AtFunction)(QQmlListProperty<T> *, int);
61 typedef void (*ClearFunction)(QQmlListProperty<T> *);
62
63 QQmlListProperty()
64 : append(nullptr),
65 count(nullptr),
66 at(nullptr),
67 clear(nullptr)
68 {}
69 QQmlListProperty(QObject *o, QList<T *> &list)
70 : object(o), data(&list), append(qlist_append), count(qlist_count), at(qlist_at),
71 clear(qlist_clear)
72
73 {}
74 QQmlListProperty(QObject *o, void *d, AppendFunction a, CountFunction c, AtFunction t,
75 ClearFunction r )
76 : object(o),
77 data(d),
78 append(a),
79 count(c),
80 at(t),
81 clear(r)
82
83 {}
84 QQmlListProperty(QObject *o, void *d, CountFunction c, AtFunction t)
85 : object(o),
86 data(d),
87 append(nullptr),
88 count(c), at(t),
89 clear(nullptr)
90 {}
91 bool operator==(const QQmlListProperty &o) const {
92 return object == o.object &&
93 data == o.data &&
94 append == o.append &&
95 count == o.count &&
96 at == o.at &&
97 clear == o.clear;
98 }
99
100 QObject *object = nullptr;
101 void *data = nullptr;
102
103 AppendFunction append;
104
105 CountFunction count;
106 AtFunction at;
107
108 ClearFunction clear;
109
110 void *dummy1 = nullptr;
111 void *dummy2 = nullptr;
112
113private:
114 static void qlist_append(QQmlListProperty *p, T *v) {
115 reinterpret_cast<QList<T *> *>(p->data)->append(v);
116 }
117 static int qlist_count(QQmlListProperty *p) {
118 return reinterpret_cast<QList<T *> *>(p->data)->count();
119 }
120 static T *qlist_at(QQmlListProperty *p, int idx) {
121 return reinterpret_cast<QList<T *> *>(p->data)->at(idx);
122 }
123 static void qlist_clear(QQmlListProperty *p) {
124 return reinterpret_cast<QList<T *> *>(p->data)->clear();
125 }
126};
127#endif
128
129class QQmlEngine;
130class QQmlListReferencePrivate;
131class Q_QML_EXPORT QQmlListReference
132{
133public:
134 QQmlListReference();
135 QQmlListReference(QObject *, const char *property, QQmlEngine * = nullptr);
136 QQmlListReference(const QQmlListReference &);
137 QQmlListReference &operator=(const QQmlListReference &);
138 ~QQmlListReference();
139
140 bool isValid() const;
141
142 QObject *object() const;
143 const QMetaObject *listElementType() const;
144
145 bool canAppend() const;
146 bool canAt() const;
147 bool canClear() const;
148 bool canCount() const;
149
150 bool isManipulable() const;
151 bool isReadable() const;
152
153 bool append(QObject *) const;
154 QObject *at(int) const;
155 bool clear() const;
156 int count() const;
157
158private:
159 friend class QQmlListReferencePrivate;
160 QQmlListReferencePrivate* d;
161};
162
163QT_END_NAMESPACE
164
165Q_DECLARE_METATYPE(QQmlListReference)
166
167#endif // QQMLLIST_H
168