1
1
#include " region.hpp"
2
2
#include < cmath>
3
3
4
+ #include < qlist.h>
4
5
#include < qobject.h>
5
6
#include < qpoint.h>
6
7
#include < qqmllist.h>
@@ -19,6 +20,7 @@ PendingRegion::PendingRegion(QObject* parent): QObject(parent) {
19
20
QObject::connect (this , &PendingRegion::widthChanged, this , &PendingRegion::changed);
20
21
QObject::connect (this , &PendingRegion::heightChanged, this , &PendingRegion::changed);
21
22
QObject::connect (this , &PendingRegion::childrenChanged, this , &PendingRegion::changed);
23
+ QObject::connect (this , &PendingRegion::regionsChanged, this , &PendingRegion::childrenChanged);
22
24
}
23
25
24
26
void PendingRegion::setItem (QQuickItem* item) {
@@ -39,21 +41,33 @@ void PendingRegion::setItem(QQuickItem* item) {
39
41
emit this ->itemChanged ();
40
42
}
41
43
42
- void PendingRegion::onItemDestroyed () { this ->mItem = nullptr ; }
43
-
44
- void PendingRegion::onChildDestroyed () { this ->mRegions .removeAll (this ->sender ()); }
45
-
46
- QQmlListProperty<PendingRegion> PendingRegion::regions () {
47
- return QQmlListProperty<PendingRegion>(
48
- this ,
49
- nullptr ,
50
- &PendingRegion::regionsAppend,
51
- &PendingRegion::regionsCount,
52
- &PendingRegion::regionAt,
53
- &PendingRegion::regionsClear,
54
- &PendingRegion::regionsReplace,
55
- &PendingRegion::regionsRemoveLast
56
- );
44
+ void PendingRegion::onItemDestroyed () {
45
+ this ->mItem = nullptr ;
46
+ emit this ->itemChanged ();
47
+ }
48
+
49
+ void PendingRegion::onChildDestroyed () {
50
+ this ->mRegions .removeAll (this ->sender ());
51
+ emit this ->regionsChanged ();
52
+ }
53
+
54
+ const QList<PendingRegion*>& PendingRegion::regions () const { return this ->mRegions ; }
55
+
56
+ void PendingRegion::setRegions (const QList<PendingRegion*>& regions) {
57
+ if (regions == this ->mRegions ) return ;
58
+
59
+ for (auto * region: this ->mRegions ) {
60
+ QObject::disconnect (region, nullptr , this , nullptr );
61
+ }
62
+
63
+ this ->mRegions = regions;
64
+
65
+ for (auto * region: regions) {
66
+ QObject::connect (region, &QObject::destroyed, this , &PendingRegion::onChildDestroyed);
67
+ QObject::connect (region, &PendingRegion::changed, this , &PendingRegion::childrenChanged);
68
+ }
69
+
70
+ emit this ->regionsChanged ();
57
71
}
58
72
59
73
bool PendingRegion::empty () const {
@@ -115,58 +129,3 @@ QRegion PendingRegion::applyTo(const QRect& rect) const {
115
129
return this ->applyTo (baseRegion);
116
130
}
117
131
}
118
-
119
- void PendingRegion::regionsAppend (QQmlListProperty<PendingRegion>* prop, PendingRegion* region) {
120
- auto * self = static_cast <PendingRegion*>(prop->object ); // NOLINT
121
- if (!region) return ;
122
-
123
- QObject::connect (region, &QObject::destroyed, self, &PendingRegion::onChildDestroyed);
124
- QObject::connect (region, &PendingRegion::changed, self, &PendingRegion::childrenChanged);
125
-
126
- self->mRegions .append (region);
127
-
128
- emit self->childrenChanged ();
129
- }
130
-
131
- PendingRegion* PendingRegion::regionAt (QQmlListProperty<PendingRegion>* prop, qsizetype i) {
132
- return static_cast <PendingRegion*>(prop->object )->mRegions .at (i); // NOLINT
133
- }
134
-
135
- void PendingRegion::regionsClear (QQmlListProperty<PendingRegion>* prop) {
136
- auto * self = static_cast <PendingRegion*>(prop->object ); // NOLINT
137
-
138
- for (auto * region: self->mRegions ) {
139
- QObject::disconnect (region, nullptr , self, nullptr );
140
- }
141
-
142
- self->mRegions .clear (); // NOLINT
143
- emit self->childrenChanged ();
144
- }
145
-
146
- qsizetype PendingRegion::regionsCount (QQmlListProperty<PendingRegion>* prop) {
147
- return static_cast <PendingRegion*>(prop->object )->mRegions .length (); // NOLINT
148
- }
149
-
150
- void PendingRegion::regionsRemoveLast (QQmlListProperty<PendingRegion>* prop) {
151
- auto * self = static_cast <PendingRegion*>(prop->object ); // NOLINT
152
-
153
- auto * last = self->mRegions .last ();
154
- if (last != nullptr ) QObject::disconnect (last, nullptr , self, nullptr );
155
-
156
- self->mRegions .removeLast ();
157
- emit self->childrenChanged ();
158
- }
159
-
160
- void PendingRegion::regionsReplace (
161
- QQmlListProperty<PendingRegion>* prop,
162
- qsizetype i,
163
- PendingRegion* region
164
- ) {
165
- auto * self = static_cast <PendingRegion*>(prop->object ); // NOLINT
166
-
167
- auto * old = self->mRegions .at (i);
168
- if (old != nullptr ) QObject::disconnect (old, nullptr , self, nullptr );
169
-
170
- self->mRegions .replace (i, region);
171
- emit self->childrenChanged ();
172
- }
0 commit comments