reflexion 0.1.38 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/capture_event.cpp +1 -1
- data/.doc/ext/reflex/event.cpp +7 -2
- data/.doc/ext/reflex/frame_event.cpp +25 -8
- data/.doc/ext/reflex/motion_event.cpp +4 -4
- data/.doc/ext/reflex/pointer.cpp +15 -6
- data/.doc/ext/reflex/pointer_event.cpp +0 -1
- data/.doc/ext/reflex/polygon_shape.cpp +1 -1
- data/.doc/ext/reflex/scroll_event.cpp +1 -1
- data/.doc/ext/reflex/style.cpp +2 -2
- data/.doc/ext/reflex/wheel_event.cpp +1 -1
- data/ChangeLog.md +14 -6
- data/VERSION +1 -1
- data/ext/reflex/capture_event.cpp +1 -1
- data/ext/reflex/defs.h +2 -2
- data/ext/reflex/event.cpp +7 -2
- data/ext/reflex/frame_event.cpp +26 -7
- data/ext/reflex/motion_event.cpp +4 -4
- data/ext/reflex/pointer.cpp +16 -6
- data/ext/reflex/pointer_event.cpp +0 -1
- data/ext/reflex/polygon_shape.cpp +1 -1
- data/ext/reflex/scroll_event.cpp +1 -1
- data/ext/reflex/selector.h +1 -1
- data/ext/reflex/style.cpp +2 -2
- data/ext/reflex/wheel_event.cpp +1 -1
- data/include/reflex/event.h +29 -13
- data/include/reflex/pointer.h +5 -3
- data/include/reflex/shape.h +1 -1
- data/lib/reflex/frame_event.rb +12 -2
- data/lib/reflex/pointer.rb +1 -1
- data/lib/reflex/pointer_event.rb +2 -2
- data/reflex.gemspec +4 -4
- data/src/body.h +1 -1
- data/src/event.cpp +83 -14
- data/src/event.h +11 -5
- data/src/fixture.h +1 -1
- data/src/ios/application.h +1 -1
- data/src/ios/event.mm +2 -1
- data/src/osx/application.h +1 -1
- data/src/osx/event.h +12 -6
- data/src/osx/event.mm +2 -1
- data/src/osx/native_window.mm +1 -1
- data/src/pointer.cpp +34 -18
- data/src/pointer.h +4 -2
- data/src/selector.h +1 -1
- data/src/shape.h +1 -1
- data/src/style.h +1 -1
- data/src/timer.h +1 -1
- data/src/view.cpp +149 -67
- data/src/view.h +1 -1
- data/src/win32/defs.h +1 -1
- data/src/window.cpp +25 -22
- data/src/window.h +15 -6
- data/src/world.h +1 -1
- data/test/test_event.rb +18 -15
- data/test/test_frame_event.rb +20 -16
- data/test/test_pointer.rb +20 -16
- data/test/test_pointer_event.rb +21 -21
- metadata +10 -10
data/src/pointer.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "pointer.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <limits.h>
|
4
5
|
#include <xot/time.h>
|
5
6
|
#include "reflex/exception.h"
|
6
7
|
|
@@ -43,7 +44,9 @@ namespace Reflex
|
|
43
44
|
|
44
45
|
Point position;
|
45
46
|
|
46
|
-
uint modifiers,
|
47
|
+
uint modifiers, flags;
|
48
|
+
|
49
|
+
ushort click_count, view_index;
|
47
50
|
|
48
51
|
double time;
|
49
52
|
|
@@ -51,14 +54,16 @@ namespace Reflex
|
|
51
54
|
|
52
55
|
Data (
|
53
56
|
ID id = -1, uint type = TYPE_NONE, Action action = ACTION_NONE,
|
54
|
-
const Point& position = 0, uint modifiers = 0,
|
57
|
+
const Point& position = 0, uint modifiers = 0,
|
55
58
|
bool drag = false, bool enter = false, bool exit = false,
|
56
|
-
double time = 0)
|
59
|
+
uint click_count = 0, uint view_index = 0, double time = 0)
|
57
60
|
: id(id), type(type), action(action),
|
58
|
-
position(position), modifiers(modifiers),
|
61
|
+
position(position), modifiers(modifiers),
|
59
62
|
flags(make_flags(drag, enter, exit)),
|
60
|
-
time(time)
|
63
|
+
click_count(click_count), view_index(view_index), time(time)
|
61
64
|
{
|
65
|
+
if (view_index >= USHRT_MAX)
|
66
|
+
argument_error(__FILE__, __LINE__);
|
62
67
|
}
|
63
68
|
|
64
69
|
uint make_flags (bool drag, bool enter, bool exit)
|
@@ -75,8 +80,6 @@ namespace Reflex
|
|
75
80
|
void
|
76
81
|
Pointer_update_positions (Pointer* pthis, std::function<void(Point*)> fun)
|
77
82
|
{
|
78
|
-
assert(pthis);
|
79
|
-
|
80
83
|
auto& self = pthis->self;
|
81
84
|
fun(&self->position);
|
82
85
|
if (self->prev)
|
@@ -89,6 +92,15 @@ namespace Reflex
|
|
89
92
|
pthis->self->id = id;
|
90
93
|
}
|
91
94
|
|
95
|
+
void
|
96
|
+
Pointer_set_view_index (Pointer* pthis, uint view_index)
|
97
|
+
{
|
98
|
+
if (view_index >= USHRT_MAX)
|
99
|
+
argument_error(__FILE__, __LINE__);
|
100
|
+
|
101
|
+
pthis->self->view_index = view_index;
|
102
|
+
}
|
103
|
+
|
92
104
|
void
|
93
105
|
Pointer_set_prev (Pointer* pthis, const Pointer* prev)
|
94
106
|
{
|
@@ -105,26 +117,24 @@ namespace Reflex
|
|
105
117
|
|
106
118
|
Pointer::Pointer (
|
107
119
|
ID id, uint type, Action action,
|
108
|
-
const Point& position, uint modifiers,
|
109
|
-
double time)
|
120
|
+
const Point& position, uint modifiers, bool drag,
|
121
|
+
uint click_count, uint view_index, double time)
|
110
122
|
: self(new Data(
|
111
123
|
id, type, action,
|
112
|
-
position, modifiers,
|
113
|
-
time))
|
124
|
+
position, modifiers, drag, false, false,
|
125
|
+
click_count, view_index, time))
|
114
126
|
{
|
115
127
|
}
|
116
128
|
|
117
129
|
Pointer::Pointer (const This& obj)
|
118
|
-
: self(
|
130
|
+
: self(obj.self)
|
119
131
|
{
|
120
132
|
}
|
121
133
|
|
122
134
|
Pointer&
|
123
135
|
Pointer::operator = (const This& obj)
|
124
136
|
{
|
125
|
-
|
126
|
-
|
127
|
-
*self = *obj.self;
|
137
|
+
self.operator=(obj.self);
|
128
138
|
return *this;
|
129
139
|
}
|
130
140
|
|
@@ -162,16 +172,22 @@ namespace Reflex
|
|
162
172
|
return self->modifiers;
|
163
173
|
}
|
164
174
|
|
175
|
+
bool
|
176
|
+
Pointer::is_drag () const
|
177
|
+
{
|
178
|
+
return self->flags & Data::DRAG;
|
179
|
+
}
|
180
|
+
|
165
181
|
uint
|
166
182
|
Pointer::click_count () const
|
167
183
|
{
|
168
184
|
return self->click_count;
|
169
185
|
}
|
170
186
|
|
171
|
-
|
172
|
-
Pointer::
|
187
|
+
uint
|
188
|
+
Pointer::view_index () const
|
173
189
|
{
|
174
|
-
return self->
|
190
|
+
return self->view_index;
|
175
191
|
}
|
176
192
|
|
177
193
|
double
|
data/src/pointer.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
|
7
7
|
#include <functional>
|
8
|
-
#include
|
8
|
+
#include "reflex/pointer.h"
|
9
9
|
|
10
10
|
|
11
11
|
namespace Reflex
|
@@ -15,7 +15,9 @@ namespace Reflex
|
|
15
15
|
void Pointer_update_positions (
|
16
16
|
Pointer* pthis, std::function<void(Point*)> fun);
|
17
17
|
|
18
|
-
void Pointer_set_id
|
18
|
+
void Pointer_set_id (Pointer* pthis, Pointer::ID id);
|
19
|
+
|
20
|
+
void Pointer_set_view_index (Pointer* pthis, uint view_index);
|
19
21
|
|
20
22
|
void Pointer_set_prev (Pointer* pthis, const Pointer* prev);
|
21
23
|
|
data/src/selector.h
CHANGED
data/src/shape.h
CHANGED
data/src/style.h
CHANGED
data/src/timer.h
CHANGED
data/src/view.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "view.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <limits.h>
|
4
5
|
#include <assert.h>
|
5
6
|
#include <memory>
|
6
7
|
#include <algorithm>
|
@@ -47,29 +48,34 @@ namespace Reflex
|
|
47
48
|
|
48
49
|
UPDATE_LAYOUT = Xot::bit(5, FLAG_LAST),
|
49
50
|
|
50
|
-
|
51
|
+
SORT_CHILDREN = Xot::bit(6, FLAG_LAST),
|
51
52
|
|
52
|
-
|
53
|
+
FIT_TO_CONTENT = Xot::bit(7, FLAG_LAST),
|
53
54
|
|
54
|
-
|
55
|
+
HAS_VARIABLE_LENGTHS = Xot::bit(8, FLAG_LAST),
|
56
|
+
|
57
|
+
NO_SHAPE = Xot::bit(9, FLAG_LAST),
|
55
58
|
|
56
59
|
};// Flag
|
57
60
|
|
58
|
-
Window* window
|
61
|
+
Window* window = NULL;
|
59
62
|
|
60
|
-
View* parent
|
63
|
+
View* parent = NULL;
|
61
64
|
|
62
65
|
Bounds frame;
|
63
66
|
|
64
|
-
float zoom
|
67
|
+
float zoom = 1;
|
68
|
+
|
69
|
+
float angle = 0;
|
65
70
|
|
66
|
-
|
71
|
+
ushort capture = CAPTURE_NONE;
|
67
72
|
|
68
|
-
|
73
|
+
short hide_count = 0;
|
69
74
|
|
70
|
-
|
75
|
+
ushort child_index = 0;
|
71
76
|
|
72
|
-
uint flags
|
77
|
+
uint flags =
|
78
|
+
FLAG_CLIP | FLAG_RESIZE_TO_FIT | REDRAW | UPDATE_LAYOUT | UPDATE_STYLE;
|
73
79
|
|
74
80
|
std::unique_ptr<Point> ppivot;
|
75
81
|
|
@@ -99,6 +105,8 @@ namespace Reflex
|
|
99
105
|
|
100
106
|
std::unique_ptr<ChildList> pchildren;
|
101
107
|
|
108
|
+
std::unique_ptr<ChildList> pchildren_sorted;
|
109
|
+
|
102
110
|
Point& pivot ()
|
103
111
|
{
|
104
112
|
if (!ppivot) ppivot.reset(new Point);
|
@@ -243,9 +251,10 @@ namespace Reflex
|
|
243
251
|
{
|
244
252
|
assert(m && *m == 1 && ppivot && *ppivot != 0 && pbody);
|
245
253
|
|
254
|
+
Point pos = pbody->position();
|
246
255
|
Point pivot = *ppivot * frame.size();
|
247
256
|
float angle = pbody->angle();
|
248
|
-
m->translate(
|
257
|
+
m->translate(pos.x, pos.y, frame.z)
|
249
258
|
.rotate(angle)
|
250
259
|
.translate( pivot)
|
251
260
|
.rotate(-angle)
|
@@ -304,10 +313,24 @@ namespace Reflex
|
|
304
313
|
view->remove_child(wall.get());
|
305
314
|
}
|
306
315
|
|
307
|
-
ChildList
|
316
|
+
ChildList* children (bool create = false, bool sort = false)
|
317
|
+
{
|
318
|
+
if (!pchildren)
|
319
|
+
{
|
320
|
+
if (!create) return NULL;
|
321
|
+
pchildren.reset(new ChildList);
|
322
|
+
}
|
323
|
+
|
324
|
+
if (sort && check_and_remove_flag(SORT_CHILDREN))
|
325
|
+
do_sort_children();
|
326
|
+
|
327
|
+
return sort && pchildren_sorted ? pchildren_sorted.get() : pchildren.get();
|
328
|
+
}
|
329
|
+
|
330
|
+
void sort_children (bool order_only = false)
|
308
331
|
{
|
309
|
-
|
310
|
-
|
332
|
+
add_flag(SORT_CHILDREN);
|
333
|
+
if (!order_only && pchildren_sorted) pchildren_sorted.reset();
|
311
334
|
}
|
312
335
|
|
313
336
|
void add_flag (uint flag)
|
@@ -330,6 +353,50 @@ namespace Reflex
|
|
330
353
|
return Xot::check_and_remove_flag(&flags, flag);
|
331
354
|
}
|
332
355
|
|
356
|
+
private:
|
357
|
+
|
358
|
+
void do_sort_children ()
|
359
|
+
{
|
360
|
+
assert(pchildren);
|
361
|
+
|
362
|
+
auto& children = *pchildren;
|
363
|
+
|
364
|
+
size_t size = children.size();
|
365
|
+
if (size >= USHRT_MAX)
|
366
|
+
invalid_state_error(__FILE__, __LINE__, "too many children");
|
367
|
+
|
368
|
+
ushort index = 0;
|
369
|
+
bool have_z = false;
|
370
|
+
for (auto& child : children)
|
371
|
+
{
|
372
|
+
child->self->child_index = index++;
|
373
|
+
have_z |= child->frame().z != 0;
|
374
|
+
}
|
375
|
+
|
376
|
+
if (!have_z)
|
377
|
+
{
|
378
|
+
pchildren_sorted.reset();
|
379
|
+
return;
|
380
|
+
}
|
381
|
+
|
382
|
+
if (!pchildren_sorted)
|
383
|
+
{
|
384
|
+
pchildren_sorted.reset(
|
385
|
+
new ChildList(children.begin(), children.end()));
|
386
|
+
}
|
387
|
+
|
388
|
+
std::sort(
|
389
|
+
pchildren_sorted->begin(), pchildren_sorted->end(),
|
390
|
+
[](const auto& a, const auto& b)
|
391
|
+
{
|
392
|
+
auto *aa = a->self.get(), *bb = b->self.get();
|
393
|
+
if (aa->frame.z != bb->frame.z)
|
394
|
+
return aa->frame.z < bb->frame.z;
|
395
|
+
else
|
396
|
+
return aa->child_index < bb->child_index;
|
397
|
+
});
|
398
|
+
}
|
399
|
+
|
333
400
|
};// View::Data
|
334
401
|
|
335
402
|
|
@@ -351,8 +418,8 @@ namespace Reflex
|
|
351
418
|
|
352
419
|
void place_children ()
|
353
420
|
{
|
354
|
-
View::ChildList*
|
355
|
-
if (!
|
421
|
+
View::ChildList* children = parent->self->children();
|
422
|
+
if (!children || children->empty())
|
356
423
|
return;
|
357
424
|
|
358
425
|
bool leftward = flow_main_h < 0 || flow_sub_h < 0;
|
@@ -362,7 +429,7 @@ namespace Reflex
|
|
362
429
|
upward ? parent_frame.height : 0);
|
363
430
|
Point position = start_position;
|
364
431
|
|
365
|
-
for (iterator begin =
|
432
|
+
for (iterator begin = children->begin(), end = children->end(); true;)
|
366
433
|
{
|
367
434
|
iterator line_end;
|
368
435
|
coord main_fill_size = 0;
|
@@ -653,11 +720,11 @@ namespace Reflex
|
|
653
720
|
view->self->window = window;
|
654
721
|
view->self->update_body_and_shapes();
|
655
722
|
|
656
|
-
View::ChildList*
|
657
|
-
if (
|
723
|
+
View::ChildList* children = view->self->children();
|
724
|
+
if (children)
|
658
725
|
{
|
659
|
-
for (auto&
|
660
|
-
View_set_window(
|
726
|
+
for (auto& child : *children)
|
727
|
+
View_set_window(child.get(), window);
|
661
728
|
}
|
662
729
|
|
663
730
|
if (view->self->window)
|
@@ -673,15 +740,15 @@ namespace Reflex
|
|
673
740
|
{
|
674
741
|
assert(parent);
|
675
742
|
|
676
|
-
View::ChildList*
|
677
|
-
if (!
|
743
|
+
View::ChildList* children = parent->self->children();
|
744
|
+
if (!children) return;
|
678
745
|
|
679
|
-
for (auto&
|
746
|
+
for (auto& child : *children)
|
680
747
|
{
|
681
|
-
assert(
|
748
|
+
assert(child);
|
682
749
|
|
683
|
-
if (
|
684
|
-
|
750
|
+
if (child->self->has_flag(View::Data::HAS_VARIABLE_LENGTHS))
|
751
|
+
child->self->add_flag(View::Data::APPLY_STYLE);
|
685
752
|
}
|
686
753
|
}
|
687
754
|
|
@@ -733,6 +800,9 @@ namespace Reflex
|
|
733
800
|
if (update_body && (moved || rotated) && self->pbody)
|
734
801
|
self->update_body_frame();
|
735
802
|
|
803
|
+
if (moved && event.dz() != 0 && self->parent)
|
804
|
+
self->parent->self->sort_children(true);
|
805
|
+
|
736
806
|
if ((moved || resized) && self->parent)
|
737
807
|
self->parent->self->add_flag(View::Data::FIT_TO_CONTENT);
|
738
808
|
|
@@ -779,19 +849,19 @@ namespace Reflex
|
|
779
849
|
{
|
780
850
|
assert(result && view);
|
781
851
|
|
782
|
-
View::ChildList*
|
783
|
-
if (!
|
852
|
+
View::ChildList* children = view->self->children();
|
853
|
+
if (!children) return;
|
784
854
|
|
785
|
-
for (auto&
|
855
|
+
for (auto& child : *children)
|
786
856
|
{
|
787
|
-
if (!
|
857
|
+
if (!child)
|
788
858
|
invalid_state_error(__FILE__, __LINE__);
|
789
859
|
|
790
|
-
if (
|
791
|
-
result->push_back(
|
860
|
+
if (child->selector().contains(selector))
|
861
|
+
result->push_back(child);
|
792
862
|
|
793
863
|
if (recursive)
|
794
|
-
find_all_children(result,
|
864
|
+
find_all_children(result, child.get(), selector, true);
|
795
865
|
}
|
796
866
|
}
|
797
867
|
|
@@ -814,11 +884,11 @@ namespace Reflex
|
|
814
884
|
|
815
885
|
if (!recursive) return;
|
816
886
|
|
817
|
-
View::ChildList*
|
818
|
-
if (
|
887
|
+
View::ChildList* children = view->self->children();
|
888
|
+
if (children)
|
819
889
|
{
|
820
|
-
for (auto&
|
821
|
-
find_all_styles(result,
|
890
|
+
for (auto& child : *children)
|
891
|
+
find_all_styles(result, child.get(), selector, true);
|
822
892
|
}
|
823
893
|
}
|
824
894
|
|
@@ -866,7 +936,10 @@ namespace Reflex
|
|
866
936
|
frame.set_position(m * Point(0));
|
867
937
|
}
|
868
938
|
else
|
869
|
-
|
939
|
+
{
|
940
|
+
Point pos = body->position();
|
941
|
+
frame.set_position(pos.x, pos.y, frame.z);
|
942
|
+
}
|
870
943
|
|
871
944
|
update_view_frame(view, frame, view->zoom(), body->angle(), false);
|
872
945
|
}
|
@@ -882,11 +955,11 @@ namespace Reflex
|
|
882
955
|
|
883
956
|
child_world->on_update(dt);
|
884
957
|
|
885
|
-
View::ChildList*
|
886
|
-
if (
|
958
|
+
View::ChildList* children = self->children();
|
959
|
+
if (children)
|
887
960
|
{
|
888
|
-
for (auto&
|
889
|
-
update_view_body(
|
961
|
+
for (auto& child : *children)
|
962
|
+
update_view_body(child.get());
|
890
963
|
}
|
891
964
|
}
|
892
965
|
|
@@ -910,8 +983,8 @@ namespace Reflex
|
|
910
983
|
|
911
984
|
children.clear();
|
912
985
|
find_all_children(&children, view, sel, true);
|
913
|
-
for (auto&
|
914
|
-
|
986
|
+
for (auto& child : children)
|
987
|
+
child->self->add_flag(View::Data::UPDATE_STYLE);
|
915
988
|
}
|
916
989
|
|
917
990
|
sels->clear();
|
@@ -1010,11 +1083,11 @@ namespace Reflex
|
|
1010
1083
|
|
1011
1084
|
fire_timers(view, event.now());
|
1012
1085
|
|
1013
|
-
View::ChildList*
|
1014
|
-
if (
|
1086
|
+
View::ChildList* children = self->children();
|
1087
|
+
if (children)
|
1015
1088
|
{
|
1016
|
-
for (auto&
|
1017
|
-
View_update_tree(
|
1089
|
+
for (auto& child : *children)
|
1090
|
+
View_update_tree(child.get(), event);
|
1018
1091
|
}
|
1019
1092
|
|
1020
1093
|
update_view_shapes(view);
|
@@ -1148,13 +1221,13 @@ namespace Reflex
|
|
1148
1221
|
|
1149
1222
|
if (event->is_blocked()) return;
|
1150
1223
|
|
1151
|
-
View::ChildList*
|
1152
|
-
if (
|
1224
|
+
View::ChildList* children = self->children(false, true);
|
1225
|
+
if (children)
|
1153
1226
|
{
|
1154
|
-
for (auto&
|
1227
|
+
for (auto& child : *children)
|
1155
1228
|
{
|
1156
|
-
if (event->bounds() &
|
1157
|
-
View_draw_tree(
|
1229
|
+
if (event->bounds() & child->self->frame)
|
1230
|
+
View_draw_tree(child.get(), event, offset, clip);
|
1158
1231
|
}
|
1159
1232
|
}
|
1160
1233
|
|
@@ -1321,15 +1394,14 @@ namespace Reflex
|
|
1321
1394
|
}
|
1322
1395
|
|
1323
1396
|
static void
|
1324
|
-
call_children (View* parent, std::function<bool(View*)> fun)
|
1397
|
+
call_children (View* parent, std::function<bool(View*)> fun, bool sort = true)
|
1325
1398
|
{
|
1326
1399
|
assert(parent);
|
1327
1400
|
|
1328
|
-
auto*
|
1329
|
-
if (!
|
1401
|
+
auto* children = parent->self->children(false, sort);
|
1402
|
+
if (!children) return;
|
1330
1403
|
|
1331
|
-
auto end =
|
1332
|
-
for (auto it = pchildren->rbegin(); it != end; ++it)
|
1404
|
+
for (auto it = children->rbegin(), end = children->rend(); it != end; ++it)
|
1333
1405
|
{
|
1334
1406
|
if (!fun(it->get()))
|
1335
1407
|
break;
|
@@ -1367,6 +1439,9 @@ namespace Reflex
|
|
1367
1439
|
case Pointer::CANCEL: view->on_pointer_cancel(event); break;
|
1368
1440
|
default: break;
|
1369
1441
|
}
|
1442
|
+
|
1443
|
+
if (!event->is_captured())
|
1444
|
+
PointerEvent_increment_view_indices(event);
|
1370
1445
|
}
|
1371
1446
|
|
1372
1447
|
static void
|
@@ -1381,7 +1456,7 @@ namespace Reflex
|
|
1381
1456
|
PointerEvent_each_pointer(&event, [&](const auto& pointer)
|
1382
1457
|
{
|
1383
1458
|
if (pointer.action() == Pointer::DOWN)
|
1384
|
-
Window_register_capture(win, view, pointer.id());
|
1459
|
+
Window_register_capture(win, view, pointer.id(), pointer.view_index());
|
1385
1460
|
});
|
1386
1461
|
}
|
1387
1462
|
|
@@ -1710,7 +1785,7 @@ namespace Reflex
|
|
1710
1785
|
{
|
1711
1786
|
assert(parent && child);
|
1712
1787
|
|
1713
|
-
View::ChildList* children = parent->self->
|
1788
|
+
View::ChildList* children = parent->self->children();
|
1714
1789
|
if (!children) return;
|
1715
1790
|
|
1716
1791
|
auto end = children->end();
|
@@ -1719,7 +1794,10 @@ namespace Reflex
|
|
1719
1794
|
|
1720
1795
|
children->erase(it);
|
1721
1796
|
if (children->empty())
|
1797
|
+
{
|
1722
1798
|
parent->self->pchildren.reset();
|
1799
|
+
parent->self->pchildren_sorted.reset();
|
1800
|
+
}
|
1723
1801
|
}
|
1724
1802
|
|
1725
1803
|
void
|
@@ -1735,7 +1813,7 @@ namespace Reflex
|
|
1735
1813
|
else if (found != belong)
|
1736
1814
|
invalid_state_error(__FILE__, __LINE__);
|
1737
1815
|
|
1738
|
-
self->children()
|
1816
|
+
self->children(true)->push_back(child);
|
1739
1817
|
|
1740
1818
|
View* prev_parent = child->parent();
|
1741
1819
|
set_parent(child, this);
|
@@ -1743,6 +1821,8 @@ namespace Reflex
|
|
1743
1821
|
if (prev_parent)
|
1744
1822
|
erase_child_from_children(prev_parent, child);
|
1745
1823
|
|
1824
|
+
self->sort_children();
|
1825
|
+
|
1746
1826
|
update_view_layout(this);
|
1747
1827
|
}
|
1748
1828
|
|
@@ -1763,16 +1843,18 @@ namespace Reflex
|
|
1763
1843
|
|
1764
1844
|
erase_child_from_children(this, child);
|
1765
1845
|
|
1846
|
+
self->sort_children();
|
1847
|
+
|
1766
1848
|
update_view_layout(this);
|
1767
1849
|
}
|
1768
1850
|
|
1769
1851
|
void
|
1770
1852
|
View::clear_children ()
|
1771
1853
|
{
|
1772
|
-
|
1854
|
+
auto* children = self->children();
|
1855
|
+
if (!children || children->empty()) return;
|
1773
1856
|
|
1774
|
-
auto
|
1775
|
-
for (auto& child : children)
|
1857
|
+
for (auto& child : *children)
|
1776
1858
|
remove_child(child);
|
1777
1859
|
}
|
1778
1860
|
|
@@ -2264,9 +2346,9 @@ namespace Reflex
|
|
2264
2346
|
bool capture = types != CAPTURE_NONE;
|
2265
2347
|
|
2266
2348
|
if (capture && !registered)
|
2267
|
-
Window_register_capture(w, this);
|
2349
|
+
Window_register_capture(w, this, CAPTURE_ALL);
|
2268
2350
|
else if (!capture && registered)
|
2269
|
-
Window_unregister_capture(w, this);
|
2351
|
+
Window_unregister_capture(w, this, CAPTURE_ALL);
|
2270
2352
|
|
2271
2353
|
CaptureEvent e(~old & types, old & ~types);
|
2272
2354
|
on_capture(&e);
|
data/src/view.h
CHANGED