reflexion 0.1.21 → 0.1.25
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 +6 -5
- data/.doc/ext/reflex/contact_event.cpp +18 -16
- data/.doc/ext/reflex/draw_event.cpp +10 -8
- data/.doc/ext/reflex/event.cpp +10 -10
- data/.doc/ext/reflex/focus_event.cpp +18 -17
- data/.doc/ext/reflex/frame_event.cpp +17 -17
- data/.doc/ext/reflex/key_event.cpp +227 -28
- data/.doc/ext/reflex/native.cpp +2 -0
- data/.doc/ext/reflex/pointer.cpp +158 -0
- data/.doc/ext/reflex/pointer_event.cpp +32 -91
- data/.doc/ext/reflex/scroll_event.cpp +14 -17
- data/.doc/ext/reflex/selector.cpp +8 -0
- data/.doc/ext/reflex/timer.cpp +9 -1
- data/.doc/ext/reflex/timer_event.cpp +4 -13
- data/.doc/ext/reflex/update_event.cpp +6 -5
- data/.doc/ext/reflex/view.cpp +57 -0
- data/.doc/ext/reflex/wheel_event.cpp +39 -22
- data/.doc/ext/reflex/window.cpp +24 -0
- data/VERSION +1 -1
- data/ext/reflex/capture_event.cpp +6 -5
- data/ext/reflex/contact_event.cpp +18 -16
- data/ext/reflex/draw_event.cpp +9 -7
- data/ext/reflex/event.cpp +11 -11
- data/ext/reflex/focus_event.cpp +18 -17
- data/ext/reflex/frame_event.cpp +16 -16
- data/ext/reflex/key_event.cpp +228 -28
- data/ext/reflex/native.cpp +2 -0
- data/ext/reflex/pointer.cpp +170 -0
- data/ext/reflex/pointer_event.cpp +31 -96
- data/ext/reflex/scroll_event.cpp +15 -18
- data/ext/reflex/selector.cpp +9 -0
- data/ext/reflex/timer.cpp +15 -6
- data/ext/reflex/timer_event.cpp +9 -19
- data/ext/reflex/update_event.cpp +6 -5
- data/ext/reflex/view.cpp +67 -3
- data/ext/reflex/wheel_event.cpp +40 -21
- data/ext/reflex/window.cpp +30 -3
- data/include/reflex/defs.h +140 -106
- data/include/reflex/event.h +232 -124
- data/include/reflex/pointer.h +107 -0
- data/include/reflex/ruby/pointer.h +41 -0
- data/include/reflex/ruby/view.h +9 -0
- data/include/reflex/ruby/window.h +9 -0
- data/include/reflex/selector.h +1 -1
- data/include/reflex/shape.h +2 -2
- data/include/reflex/view.h +6 -4
- data/include/reflex/window.h +10 -8
- data/lib/reflex/application.rb +3 -3
- data/lib/reflex/autoinit.rb +1 -1
- data/lib/reflex/button.rb +7 -7
- data/lib/reflex/capture_event.rb +7 -7
- data/lib/reflex/contact_event.rb +10 -10
- data/lib/reflex/draw_event.rb +2 -2
- data/lib/reflex/ellipse_shape.rb +2 -2
- data/lib/reflex/focus_event.rb +11 -11
- data/lib/reflex/frame_event.rb +5 -5
- data/lib/reflex/helper.rb +20 -20
- data/lib/reflex/image_view.rb +2 -2
- data/lib/reflex/key_event.rb +12 -12
- data/lib/reflex/model.rb +22 -22
- data/lib/reflex/model_owner.rb +7 -7
- data/lib/reflex/model_view.rb +1 -1
- data/lib/reflex/module.rb +5 -5
- data/lib/reflex/pointer.rb +107 -0
- data/lib/reflex/pointer_event.rb +16 -54
- data/lib/reflex/polygon_shape.rb +2 -2
- data/lib/reflex/reflex.rb +3 -3
- data/lib/reflex/scroll_event.rb +1 -1
- data/lib/reflex/selector.rb +4 -4
- data/lib/reflex/shape.rb +13 -13
- data/lib/reflex/style.rb +11 -11
- data/lib/reflex/style_length.rb +1 -1
- data/lib/reflex/text_view.rb +2 -2
- data/lib/reflex/timer.rb +2 -2
- data/lib/reflex/timer_event.rb +3 -2
- data/lib/reflex/update_event.rb +1 -1
- data/lib/reflex/view.rb +32 -32
- data/lib/reflex/wheel_event.rb +2 -10
- data/lib/reflex/window.rb +6 -6
- data/lib/reflex.rb +1 -0
- data/lib/reflexion.rb +17 -17
- data/reflex.gemspec +5 -5
- data/samples/reflexion/noise.rb +1 -1
- data/samples/tree.rb +1 -1
- data/src/event.cpp +792 -86
- data/src/event.h +47 -0
- data/src/image_view.cpp +2 -2
- data/src/ios/event.h +15 -3
- data/src/ios/event.mm +126 -11
- data/src/ios/view_controller.mm +50 -22
- data/src/ios/window.mm +1 -1
- data/src/osx/event.h +15 -4
- data/src/osx/event.mm +214 -24
- data/src/osx/native_window.mm +84 -17
- data/src/pointer.cpp +203 -0
- data/src/pointer.h +26 -0
- data/src/selector.cpp +1 -1
- data/src/shape.cpp +11 -13
- data/src/shape.h +1 -1
- data/src/view.cpp +205 -118
- data/src/view.h +5 -10
- data/src/window.cpp +334 -104
- data/src/window.h +22 -3
- data/src/world.cpp +6 -4
- data/test/helper.rb +3 -3
- data/test/test_application.rb +1 -1
- data/test/test_capture_event.rb +22 -6
- data/test/test_contact_event.rb +40 -0
- data/test/test_draw_event.rb +35 -0
- data/test/test_event.rb +33 -5
- data/test/test_focus_event.rb +34 -0
- data/test/test_frame_event.rb +38 -0
- data/test/test_has_frame.rb +11 -11
- data/test/test_key_event.rb +33 -0
- data/test/test_pointer.rb +149 -0
- data/test/test_pointer_event.rb +70 -104
- data/test/test_reflex.rb +1 -1
- data/test/test_scroll_event.rb +39 -0
- data/test/test_selector.rb +15 -8
- data/test/test_shape.rb +8 -8
- data/test/test_style.rb +13 -13
- data/test/test_style_length.rb +5 -5
- data/test/test_timer_event.rb +38 -0
- data/test/test_update_event.rb +29 -0
- data/test/test_view.rb +57 -30
- data/test/test_wheel_event.rb +40 -0
- data/test/test_window.rb +29 -27
- metadata +64 -35
data/src/window.cpp
CHANGED
@@ -1,14 +1,25 @@
|
|
1
1
|
#include "window.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <set>
|
4
5
|
#include "reflex/exception.h"
|
5
6
|
#include "view.h"
|
7
|
+
#include "event.h"
|
6
8
|
|
7
9
|
|
8
10
|
namespace Reflex
|
9
11
|
{
|
10
12
|
|
11
13
|
|
14
|
+
using ViewList = std::vector<View::Ref>;
|
15
|
+
|
16
|
+
using PointerMap = std::map<Pointer::ID, Pointer>;
|
17
|
+
|
18
|
+
using ExtractedPointerIDSet = std::set<Pointer::ID>;
|
19
|
+
|
20
|
+
using CaptureTargetIDList = Window::Data::CaptureTargetIDList;
|
21
|
+
|
22
|
+
|
12
23
|
void
|
13
24
|
Window_set_focus (Window* window, View* view)
|
14
25
|
{
|
@@ -20,22 +31,95 @@ namespace Reflex
|
|
20
31
|
|
21
32
|
window->self->focus.reset(view);
|
22
33
|
|
23
|
-
FocusEvent e(FocusEvent::BLUR, view, current);
|
24
|
-
|
25
34
|
if (current)
|
26
35
|
{
|
36
|
+
FocusEvent e(FocusEvent::BLUR, view, current);
|
27
37
|
current->on_focus(&e);
|
28
38
|
current->redraw();
|
29
39
|
}
|
30
40
|
|
31
41
|
if (view)
|
32
42
|
{
|
33
|
-
e
|
43
|
+
FocusEvent e(FocusEvent::FOCUS, view, current);
|
34
44
|
view->on_focus(&e);
|
35
45
|
view->redraw();
|
36
46
|
}
|
37
47
|
}
|
38
48
|
|
49
|
+
namespace global
|
50
|
+
{
|
51
|
+
|
52
|
+
static Window_CreateRootViewFun create_root_view_fun = NULL;
|
53
|
+
|
54
|
+
}// global
|
55
|
+
|
56
|
+
void
|
57
|
+
Window_set_create_root_view_fun (Window_CreateRootViewFun fun)
|
58
|
+
{
|
59
|
+
global::create_root_view_fun = fun;
|
60
|
+
}
|
61
|
+
|
62
|
+
static View*
|
63
|
+
create_root_view ()
|
64
|
+
{
|
65
|
+
return global::create_root_view_fun
|
66
|
+
? global::create_root_view_fun()
|
67
|
+
: new View();
|
68
|
+
}
|
69
|
+
|
70
|
+
void
|
71
|
+
Window_register_capture (Window* window, View* view, Pointer::ID target)
|
72
|
+
{
|
73
|
+
assert(window);
|
74
|
+
|
75
|
+
if (!view)
|
76
|
+
argument_error(__FILE__, __LINE__);
|
77
|
+
|
78
|
+
if (view->window() != window)
|
79
|
+
invalid_state_error(__FILE__, __LINE__);
|
80
|
+
|
81
|
+
if (target < 0) return;
|
82
|
+
|
83
|
+
auto& targets = window->self->captures[view];
|
84
|
+
if (std::find(targets.begin(), targets.end(), target) != targets.end())
|
85
|
+
return;
|
86
|
+
|
87
|
+
targets.insert(
|
88
|
+
target == CAPTURE_ALL ? targets.begin() : targets.end(),
|
89
|
+
target);
|
90
|
+
}
|
91
|
+
|
92
|
+
void
|
93
|
+
Window_unregister_capture (Window* window, View* view, Pointer::ID target)
|
94
|
+
{
|
95
|
+
assert(window);
|
96
|
+
|
97
|
+
if (!view)
|
98
|
+
argument_error(__FILE__, __LINE__);
|
99
|
+
|
100
|
+
auto captures_it = window->self->captures.find(view);
|
101
|
+
if (captures_it == window->self->captures.end()) return;
|
102
|
+
|
103
|
+
auto& targets = captures_it->second;
|
104
|
+
auto targets_it = std::find(targets.begin(), targets.end(), target);
|
105
|
+
if (targets_it == targets.end()) return;
|
106
|
+
|
107
|
+
targets.erase(targets_it);
|
108
|
+
}
|
109
|
+
|
110
|
+
static void
|
111
|
+
cleanup_captures (Window* window)
|
112
|
+
{
|
113
|
+
assert(window);
|
114
|
+
|
115
|
+
auto& caps = window->self->captures;
|
116
|
+
for (auto it = caps.begin(), end = caps.end(); it != end;)
|
117
|
+
{
|
118
|
+
auto t = it++;
|
119
|
+
if (t->second.empty()) caps.erase(t);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
39
123
|
void
|
40
124
|
Window_call_draw_event (Window* window, DrawEvent* event)
|
41
125
|
{
|
@@ -48,8 +132,8 @@ namespace Reflex
|
|
48
132
|
|
49
133
|
Rays::Bounds frame = window->frame();
|
50
134
|
|
51
|
-
event
|
52
|
-
event
|
135
|
+
DrawEvent_set_painter(event, painter);
|
136
|
+
DrawEvent_set_bounds(event, Bounds(0, 0, frame.width, frame.height));
|
53
137
|
|
54
138
|
painter->begin();
|
55
139
|
painter->push_state();
|
@@ -57,72 +141,265 @@ namespace Reflex
|
|
57
141
|
|
58
142
|
window->on_draw(event);
|
59
143
|
if (!event->is_blocked())
|
60
|
-
Reflex::View_draw_tree(window->root(),
|
144
|
+
Reflex::View_draw_tree(window->root(), event, 0, frame.move_to(0));
|
61
145
|
|
62
146
|
painter->pop_state();
|
63
147
|
painter->end();
|
64
148
|
}
|
65
149
|
|
66
|
-
|
150
|
+
static bool
|
151
|
+
is_capturing (
|
152
|
+
const View* view, const CaptureTargetIDList& targets, View::Capture type)
|
67
153
|
{
|
154
|
+
return
|
155
|
+
!targets.empty() &&
|
156
|
+
targets[0] == CAPTURE_ALL &&
|
157
|
+
(view->capture() & type) == type;
|
158
|
+
}
|
68
159
|
|
69
|
-
|
160
|
+
void
|
161
|
+
Window_call_key_event (Window* window, KeyEvent* event)
|
162
|
+
{
|
163
|
+
assert(window);
|
70
164
|
|
71
|
-
|
165
|
+
if (!event)
|
166
|
+
argument_error(__FILE__, __LINE__);
|
72
167
|
|
73
|
-
|
74
|
-
|
168
|
+
for (auto& [view, targets] : window->self->captures)
|
169
|
+
{
|
170
|
+
if (!is_capturing(view.get(), targets, View::CAPTURE_KEY))
|
171
|
+
continue;
|
172
|
+
|
173
|
+
KeyEvent e = event->dup();
|
174
|
+
KeyEvent_set_captured(&e, true);
|
175
|
+
View_call_key_event(const_cast<View*>(view.get()), &e);
|
176
|
+
}
|
177
|
+
|
178
|
+
if (window->self->focus)
|
179
|
+
View_call_key_event(window->self->focus.get(), event);
|
180
|
+
|
181
|
+
cleanup_captures(window);
|
182
|
+
|
183
|
+
if (event->is_blocked()) return;
|
184
|
+
|
185
|
+
window->on_key(event);
|
186
|
+
|
187
|
+
switch (event->action())
|
188
|
+
{
|
189
|
+
case KeyEvent::DOWN: window->on_key_down(event); break;
|
190
|
+
case KeyEvent::UP: window->on_key_up(event); break;
|
191
|
+
default: break;
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
static void
|
196
|
+
get_views_capturing_all_pointers (Window* window, ViewList* result)
|
75
197
|
{
|
76
|
-
|
198
|
+
assert(window && result);
|
199
|
+
|
200
|
+
result->clear();
|
201
|
+
for (const auto& [view, targets] : window->self->captures)
|
202
|
+
{
|
203
|
+
if (is_capturing(view.get(), targets, View::CAPTURE_POINTER))
|
204
|
+
result->emplace_back(view);
|
205
|
+
}
|
77
206
|
}
|
78
207
|
|
79
|
-
static
|
80
|
-
|
208
|
+
static void
|
209
|
+
capture_all_pointers (
|
210
|
+
Window* window, const PointerEvent& event, ViewList& views_capturing_all)
|
81
211
|
{
|
82
|
-
|
83
|
-
|
84
|
-
|
212
|
+
assert(window);
|
213
|
+
|
214
|
+
if (views_capturing_all.empty()) return;
|
215
|
+
|
216
|
+
PointerEvent_each_pointer(&event, [&](const auto& pointer)
|
217
|
+
{
|
218
|
+
if (pointer.action() == Pointer::DOWN)
|
219
|
+
{
|
220
|
+
for (auto& view : views_capturing_all)
|
221
|
+
Window_register_capture(window, view, pointer.id());
|
222
|
+
}
|
223
|
+
});
|
85
224
|
}
|
86
225
|
|
87
|
-
void
|
88
|
-
|
226
|
+
static void
|
227
|
+
extract_pointer (
|
228
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
229
|
+
const Pointer& pointer)
|
89
230
|
{
|
90
|
-
|
91
|
-
argument_error(__FILE__, __LINE__);
|
231
|
+
assert(event && extracteds);
|
92
232
|
|
93
|
-
|
94
|
-
|
95
|
-
|
233
|
+
PointerEvent_add_pointer(event, pointer);
|
234
|
+
extracteds->insert(pointer.id());
|
235
|
+
}
|
96
236
|
|
97
|
-
|
237
|
+
static void
|
238
|
+
extract_targeted_pointers (
|
239
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
240
|
+
const CaptureTargetIDList& targets, const PointerMap& pointers)
|
241
|
+
{
|
242
|
+
assert(event && event->empty() && extracteds);
|
243
|
+
|
244
|
+
for (auto pointer_id : targets)
|
245
|
+
{
|
246
|
+
auto it = pointers.find(pointer_id);
|
247
|
+
if (it != pointers.end())
|
248
|
+
extract_pointer(event, extracteds, it->second);
|
249
|
+
}
|
98
250
|
}
|
99
251
|
|
100
|
-
void
|
101
|
-
|
252
|
+
static void
|
253
|
+
capture_targeted_pointers_and_call_events (
|
254
|
+
ExtractedPointerIDSet* extracteds,
|
255
|
+
Window* window, const PointerMap& pointers)
|
102
256
|
{
|
103
|
-
|
104
|
-
argument_error(__FILE__, __LINE__);
|
257
|
+
assert(extracteds && window);
|
105
258
|
|
106
|
-
|
107
|
-
|
259
|
+
for (auto& [view, targets] : window->self->captures)
|
260
|
+
{
|
261
|
+
if (targets.empty()) continue;
|
108
262
|
|
109
|
-
|
110
|
-
|
263
|
+
PointerEvent event;
|
264
|
+
PointerEvent_set_captured(&event, true);
|
265
|
+
extract_targeted_pointers(&event, extracteds, targets, pointers);
|
266
|
+
if (event.empty()) continue;
|
111
267
|
|
112
|
-
|
268
|
+
PointerEvent_update_for_capturing_view(&event, view);
|
269
|
+
View_call_pointer_event(const_cast<View*>(view.get()), &event);
|
270
|
+
}
|
113
271
|
}
|
114
272
|
|
115
273
|
static void
|
116
|
-
|
274
|
+
extract_hovering_pointers (
|
275
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
276
|
+
const PointerMap& pointers)
|
117
277
|
{
|
118
|
-
|
119
|
-
|
278
|
+
assert(event && event->empty() && extracteds);
|
279
|
+
|
280
|
+
for (const auto& [_, pointer] : pointers)
|
120
281
|
{
|
121
|
-
|
122
|
-
if (
|
282
|
+
// dragging pointers is captured as a targeted
|
283
|
+
if (pointer.is_drag()) continue;
|
284
|
+
|
285
|
+
extract_pointer(event, extracteds, pointer);
|
286
|
+
}
|
287
|
+
}
|
288
|
+
|
289
|
+
static void
|
290
|
+
capture_hovering_pointers_and_call_events (
|
291
|
+
ExtractedPointerIDSet* extracteds,
|
292
|
+
const ViewList& views_capturing_all, const PointerMap& pointers)
|
293
|
+
{
|
294
|
+
assert(extracteds);
|
295
|
+
|
296
|
+
if (views_capturing_all.empty()) return;
|
297
|
+
|
298
|
+
PointerEvent event;
|
299
|
+
PointerEvent_set_captured(&event, true);
|
300
|
+
extract_hovering_pointers(&event, extracteds, pointers);
|
301
|
+
if (event.empty()) return;
|
302
|
+
|
303
|
+
for (auto& view : views_capturing_all)
|
304
|
+
{
|
305
|
+
PointerEvent e = event.dup();
|
306
|
+
PointerEvent_update_for_capturing_view(&e, view);
|
307
|
+
View_call_pointer_event(const_cast<View*>(view.get()), &e);
|
308
|
+
}
|
309
|
+
}
|
310
|
+
|
311
|
+
static void
|
312
|
+
erase_extracted_pointers (
|
313
|
+
PointerMap* pointers, const ExtractedPointerIDSet& extracteds)
|
314
|
+
{
|
315
|
+
assert(pointers);
|
316
|
+
|
317
|
+
for (auto id : extracteds)
|
318
|
+
{
|
319
|
+
auto it = pointers->find(id);
|
320
|
+
if (it != pointers->end()) pointers->erase(it);
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
324
|
+
static void
|
325
|
+
erase_extracted_pointers (
|
326
|
+
PointerEvent* event, const ExtractedPointerIDSet& extracteds)
|
327
|
+
{
|
328
|
+
assert(event);
|
329
|
+
|
330
|
+
for (auto id : extracteds)
|
331
|
+
PointerEvent_erase_pointer(event, id);
|
332
|
+
}
|
333
|
+
|
334
|
+
static void
|
335
|
+
call_captured_pointer_events (Window* window, PointerEvent* event)
|
336
|
+
{
|
337
|
+
assert(window && event);
|
338
|
+
|
339
|
+
ViewList views_capturing_all;
|
340
|
+
get_views_capturing_all_pointers(window, &views_capturing_all);
|
341
|
+
capture_all_pointers(window, *event, views_capturing_all);
|
342
|
+
|
343
|
+
PointerMap pointers;
|
344
|
+
PointerEvent_each_pointer(event, [&](const auto& pointer)
|
345
|
+
{
|
346
|
+
if (pointer.id() >= 0) pointers[pointer.id()] = pointer;
|
347
|
+
});
|
348
|
+
|
349
|
+
ExtractedPointerIDSet extracteds;
|
350
|
+
capture_targeted_pointers_and_call_events(&extracteds, window, pointers);
|
351
|
+
erase_extracted_pointers(&pointers, extracteds);
|
352
|
+
|
353
|
+
capture_hovering_pointers_and_call_events(&extracteds, views_capturing_all, pointers);
|
354
|
+
erase_extracted_pointers(event, extracteds);
|
355
|
+
}
|
356
|
+
|
357
|
+
void
|
358
|
+
Window_call_pointer_event (Window* window, PointerEvent* event)
|
359
|
+
{
|
360
|
+
assert(window);
|
361
|
+
|
362
|
+
if (!event)
|
363
|
+
argument_error(__FILE__, __LINE__);
|
364
|
+
|
365
|
+
call_captured_pointer_events(window, event);
|
366
|
+
|
367
|
+
if (!event->empty())
|
368
|
+
{
|
369
|
+
PointerEvent_update_for_child_view(event, window->root());
|
370
|
+
View_call_pointer_event(window->root(), event);
|
371
|
+
}
|
372
|
+
|
373
|
+
cleanup_captures(window);
|
374
|
+
|
375
|
+
if (event->empty() || event->is_blocked())
|
376
|
+
return;
|
377
|
+
|
378
|
+
window->on_pointer(event);
|
379
|
+
|
380
|
+
switch ((*event)[0].action())
|
381
|
+
{
|
382
|
+
case Pointer::DOWN: window->on_pointer_down(event); break;
|
383
|
+
case Pointer::UP: window->on_pointer_up(event); break;
|
384
|
+
case Pointer::MOVE: window->on_pointer_move(event); break;
|
385
|
+
case Pointer::CANCEL: window->on_pointer_cancel(event); break;
|
386
|
+
default: break;
|
123
387
|
}
|
124
388
|
}
|
125
389
|
|
390
|
+
void
|
391
|
+
Window_call_wheel_event (Window* window, WheelEvent* event)
|
392
|
+
{
|
393
|
+
assert(window);
|
394
|
+
|
395
|
+
if (!event)
|
396
|
+
argument_error(__FILE__, __LINE__);
|
397
|
+
|
398
|
+
window->on_wheel(event);
|
399
|
+
|
400
|
+
View_call_wheel_event(window->root(), event);
|
401
|
+
}
|
402
|
+
|
126
403
|
|
127
404
|
Window::Window ()
|
128
405
|
: self(Window_create_data())
|
@@ -191,6 +468,18 @@ namespace Reflex
|
|
191
468
|
self->redraw = true;
|
192
469
|
}
|
193
470
|
|
471
|
+
Point
|
472
|
+
Window::from_screen (const Point& point) const
|
473
|
+
{
|
474
|
+
return point - frame().position();
|
475
|
+
}
|
476
|
+
|
477
|
+
Point
|
478
|
+
Window::to_screen (const Point& point) const
|
479
|
+
{
|
480
|
+
return point + frame().position();
|
481
|
+
}
|
482
|
+
|
194
483
|
void
|
195
484
|
Window::set_title (const char* title)
|
196
485
|
{
|
@@ -230,7 +519,7 @@ namespace Reflex
|
|
230
519
|
bool
|
231
520
|
Window::is_resizable () const
|
232
521
|
{
|
233
|
-
Window_is_resizable(*this);
|
522
|
+
return Window_is_resizable(*this);
|
234
523
|
}
|
235
524
|
|
236
525
|
bool
|
@@ -275,20 +564,6 @@ namespace Reflex
|
|
275
564
|
return const_cast<Window*>(this)->painter();
|
276
565
|
}
|
277
566
|
|
278
|
-
Point
|
279
|
-
Window::from_screen (const Point& point) const
|
280
|
-
{
|
281
|
-
not_implemented_error(__FILE__, __LINE__);
|
282
|
-
return 0;
|
283
|
-
}
|
284
|
-
|
285
|
-
Point
|
286
|
-
Window::to_screen (const Point& point) const
|
287
|
-
{
|
288
|
-
not_implemented_error(__FILE__, __LINE__);
|
289
|
-
return 0;
|
290
|
-
}
|
291
|
-
|
292
567
|
void
|
293
568
|
Window::on_show (Event* e)
|
294
569
|
{
|
@@ -327,28 +602,6 @@ namespace Reflex
|
|
327
602
|
void
|
328
603
|
Window::on_key (KeyEvent* e)
|
329
604
|
{
|
330
|
-
if (!e)
|
331
|
-
argument_error(__FILE__, __LINE__);
|
332
|
-
|
333
|
-
switch (e->type)
|
334
|
-
{
|
335
|
-
case KeyEvent::DOWN: on_key_down(e); break;
|
336
|
-
case KeyEvent::UP: on_key_up(e); break;
|
337
|
-
case KeyEvent::NONE: break;
|
338
|
-
}
|
339
|
-
|
340
|
-
auto end = self->capturing_views.end();
|
341
|
-
for (auto it = self->capturing_views.begin(); it != end; ++it)
|
342
|
-
{
|
343
|
-
KeyEvent event = *e;
|
344
|
-
event.capture = true;
|
345
|
-
View_call_key_event(const_cast<View*>(it->first.get()), event);
|
346
|
-
}
|
347
|
-
|
348
|
-
if (self->focus)
|
349
|
-
View_call_key_event(self->focus.get(), *e);
|
350
|
-
|
351
|
-
cleanup_capturing_views(this);
|
352
605
|
}
|
353
606
|
|
354
607
|
void
|
@@ -364,30 +617,6 @@ namespace Reflex
|
|
364
617
|
void
|
365
618
|
Window::on_pointer (PointerEvent* e)
|
366
619
|
{
|
367
|
-
if (!e)
|
368
|
-
argument_error(__FILE__, __LINE__);
|
369
|
-
|
370
|
-
switch (e->type)
|
371
|
-
{
|
372
|
-
case PointerEvent::DOWN: on_pointer_down(e); break;
|
373
|
-
case PointerEvent::UP: on_pointer_up(e); break;
|
374
|
-
case PointerEvent::MOVE: on_pointer_move(e); break;
|
375
|
-
case PointerEvent::NONE: break;
|
376
|
-
}
|
377
|
-
|
378
|
-
auto end = self->capturing_views.end();
|
379
|
-
for (auto it = self->capturing_views.begin(); it != end; ++it)
|
380
|
-
{
|
381
|
-
PointerEvent event = *e;
|
382
|
-
event.capture = true;
|
383
|
-
for (size_t i = 0; i < event.size; ++i)
|
384
|
-
event[i] = it->first.get()->from_window(event[i]);
|
385
|
-
View_call_pointer_event(const_cast<View*>(it->first.get()), event);
|
386
|
-
}
|
387
|
-
|
388
|
-
View_call_pointer_event(root(), *e);
|
389
|
-
|
390
|
-
cleanup_capturing_views(this);
|
391
620
|
}
|
392
621
|
|
393
622
|
void
|
@@ -406,12 +635,13 @@ namespace Reflex
|
|
406
635
|
}
|
407
636
|
|
408
637
|
void
|
409
|
-
Window::
|
638
|
+
Window::on_pointer_cancel (PointerEvent* e)
|
410
639
|
{
|
411
|
-
|
412
|
-
argument_error(__FILE__, __LINE__);
|
640
|
+
}
|
413
641
|
|
414
|
-
|
642
|
+
void
|
643
|
+
Window::on_wheel (WheelEvent* e)
|
644
|
+
{
|
415
645
|
}
|
416
646
|
|
417
647
|
Window::operator bool () const
|
data/src/window.h
CHANGED
@@ -4,22 +4,29 @@
|
|
4
4
|
#define __REFLEX_SRC_WINDOW_H__
|
5
5
|
|
6
6
|
|
7
|
+
#include <vector>
|
7
8
|
#include <map>
|
8
9
|
#include <xot/time.h>
|
9
10
|
#include <rays/point.h>
|
10
11
|
#include <rays/painter.h>
|
11
12
|
#include <reflex/window.h>
|
12
13
|
#include <reflex/view.h>
|
14
|
+
#include "pointer.h"
|
13
15
|
|
14
16
|
|
15
17
|
namespace Reflex
|
16
18
|
{
|
17
19
|
|
18
20
|
|
21
|
+
enum {CAPTURE_ALL = INT_MAX};
|
22
|
+
|
23
|
+
|
19
24
|
struct Window::Data
|
20
25
|
{
|
21
26
|
|
22
|
-
typedef std::
|
27
|
+
typedef std::vector<Pointer::ID> CaptureTargetIDList;
|
28
|
+
|
29
|
+
typedef std::map<View::Ref, CaptureTargetIDList> CaptureMap;
|
23
30
|
|
24
31
|
int hide_count = 1;
|
25
32
|
|
@@ -33,7 +40,7 @@ namespace Reflex
|
|
33
40
|
|
34
41
|
double prev_time_update, prev_time_draw, prev_fps = 0;
|
35
42
|
|
36
|
-
|
43
|
+
CaptureMap captures;
|
37
44
|
|
38
45
|
Data ()
|
39
46
|
{
|
@@ -84,7 +91,19 @@ namespace Reflex
|
|
84
91
|
|
85
92
|
void Window_set_focus (Window* window, View* view);
|
86
93
|
|
87
|
-
void
|
94
|
+
void Window_register_capture (
|
95
|
+
Window* window, View* view, Pointer::ID target = CAPTURE_ALL);
|
96
|
+
|
97
|
+
void Window_unregister_capture (
|
98
|
+
Window* window, View* view, Pointer::ID target = CAPTURE_ALL);
|
99
|
+
|
100
|
+
void Window_call_draw_event (Window* window, DrawEvent* event);
|
101
|
+
|
102
|
+
void Window_call_key_event (Window* window, KeyEvent* event);
|
103
|
+
|
104
|
+
void Window_call_pointer_event (Window* window, PointerEvent* event);
|
105
|
+
|
106
|
+
void Window_call_wheel_event (Window* window, WheelEvent* event);
|
88
107
|
|
89
108
|
float Window_get_pixel_density (const Window& window);
|
90
109
|
|
data/src/world.cpp
CHANGED
@@ -251,8 +251,9 @@ namespace Reflex
|
|
251
251
|
if (!View_is_active(*s1->owner()) || !View_is_active(*s2->owner()))
|
252
252
|
return;
|
253
253
|
|
254
|
-
|
255
|
-
Shape_call_contact_event(
|
254
|
+
ContactEvent e1(ContactEvent::BEGIN, s2), e2(ContactEvent::BEGIN, s1);
|
255
|
+
Shape_call_contact_event(s1, &e1);
|
256
|
+
Shape_call_contact_event(s2, &e2);
|
256
257
|
}
|
257
258
|
|
258
259
|
void
|
@@ -267,8 +268,9 @@ namespace Reflex
|
|
267
268
|
if (!View_is_active(*s1->owner()) || !View_is_active(*s2->owner()))
|
268
269
|
return;
|
269
270
|
|
270
|
-
|
271
|
-
Shape_call_contact_event(
|
271
|
+
ContactEvent e1(ContactEvent::END, s2), e2(ContactEvent::END, s1);
|
272
|
+
Shape_call_contact_event(s1, &e1);
|
273
|
+
Shape_call_contact_event(s2, &e2);
|
272
274
|
}
|
273
275
|
|
274
276
|
|
data/test/helper.rb
CHANGED
data/test/test_application.rb
CHANGED
data/test/test_capture_event.rb
CHANGED
@@ -6,13 +6,29 @@ require_relative 'helper'
|
|
6
6
|
|
7
7
|
class TestCaptureEvent < Test::Unit::TestCase
|
8
8
|
|
9
|
-
def event
|
10
|
-
Reflex::CaptureEvent.new
|
11
|
-
Reflex::View.capture_flag.symbols2bits
|
12
|
-
}
|
9
|
+
def event(*args)
|
10
|
+
Reflex::CaptureEvent.new(*args.map {|arg|
|
11
|
+
Reflex::View.capture_flag.symbols2bits(*arg)
|
12
|
+
})
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def test_initialize()
|
16
|
+
e = event :key, :pointer
|
17
|
+
assert_equal [:key], e.begin
|
18
|
+
assert_equal [:pointer], e.end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_dup()
|
22
|
+
e1 = event :key, :pointer
|
23
|
+
e2 = e1.dup
|
24
|
+
e1.block
|
25
|
+
e3 = e1.dup
|
26
|
+
assert_true e1.blocked?
|
27
|
+
assert_false e2.blocked?
|
28
|
+
assert_true e3.blocked?
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_begin()
|
16
32
|
c = event [:key, :pointer], []
|
17
33
|
assert_equal [:key, :pointer], c.begin
|
18
34
|
assert_equal true, c.begin?(:key)
|
@@ -26,7 +42,7 @@ class TestCaptureEvent < Test::Unit::TestCase
|
|
26
42
|
assert_equal false, c.begin?(:all)
|
27
43
|
end
|
28
44
|
|
29
|
-
def test_end
|
45
|
+
def test_end()
|
30
46
|
c = event [], [:key, :pointer]
|
31
47
|
assert_equal [:key, :pointer], c.end
|
32
48
|
assert_equal true, c.end?(:key)
|