reflexion 0.1.19 → 0.1.23
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/contact_event.cpp +6 -6
- data/.doc/ext/reflex/event.cpp +9 -1
- data/.doc/ext/reflex/focus_event.cpp +6 -6
- data/.doc/ext/reflex/key_event.cpp +211 -13
- data/.doc/ext/reflex/native.cpp +2 -0
- data/.doc/ext/reflex/pointer.cpp +158 -0
- data/.doc/ext/reflex/pointer_event.cpp +31 -90
- data/.doc/ext/reflex/selector.cpp +8 -0
- data/.doc/ext/reflex/view.cpp +57 -0
- data/.doc/ext/reflex/window.cpp +41 -0
- data/VERSION +1 -1
- data/ext/reflex/contact_event.cpp +6 -6
- data/ext/reflex/event.cpp +11 -2
- data/ext/reflex/focus_event.cpp +6 -6
- data/ext/reflex/key_event.cpp +212 -13
- data/ext/reflex/native.cpp +2 -0
- data/ext/reflex/pointer.cpp +170 -0
- data/ext/reflex/pointer_event.cpp +30 -95
- data/ext/reflex/selector.cpp +9 -0
- data/ext/reflex/view.cpp +67 -3
- data/ext/reflex/window.cpp +49 -3
- data/include/reflex/defs.h +140 -106
- data/include/reflex/event.h +26 -27
- 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/view.h +6 -4
- data/include/reflex/window.h +14 -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 +4 -4
- data/lib/reflex/draw_event.rb +2 -2
- data/lib/reflex/ellipse_shape.rb +2 -2
- data/lib/reflex/focus_event.rb +4 -4
- 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 +6 -6
- 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 +1 -1
- data/lib/reflex/update_event.rb +1 -1
- data/lib/reflex/view.rb +32 -32
- data/lib/reflex/wheel_event.rb +3 -3
- data/lib/reflex/window.rb +7 -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 +189 -37
- data/src/event.h +32 -0
- 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 +18 -0
- data/src/osx/event.h +14 -3
- data/src/osx/event.mm +213 -23
- data/src/osx/native_window.mm +84 -17
- data/src/osx/window.mm +22 -0
- data/src/pointer.cpp +203 -0
- data/src/pointer.h +26 -0
- data/src/selector.cpp +1 -1
- data/src/view.cpp +103 -64
- data/src/view.h +0 -4
- data/src/window.cpp +334 -98
- data/src/window.h +28 -3
- data/test/helper.rb +3 -3
- data/test/test_application.rb +1 -1
- data/test/test_capture_event.rb +6 -6
- data/test/test_event.rb +18 -4
- data/test/test_has_frame.rb +11 -11
- 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_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_view.rb +57 -30
- data/test/test_window.rb +45 -26
- metadata +46 -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
|
{
|
@@ -36,6 +47,80 @@ namespace Reflex
|
|
36
47
|
}
|
37
48
|
}
|
38
49
|
|
50
|
+
namespace global
|
51
|
+
{
|
52
|
+
|
53
|
+
static Window_CreateRootViewFun create_root_view_fun = NULL;
|
54
|
+
|
55
|
+
}// global
|
56
|
+
|
57
|
+
void
|
58
|
+
Window_set_create_root_view_fun (Window_CreateRootViewFun fun)
|
59
|
+
{
|
60
|
+
global::create_root_view_fun = fun;
|
61
|
+
}
|
62
|
+
|
63
|
+
static View*
|
64
|
+
create_root_view ()
|
65
|
+
{
|
66
|
+
return global::create_root_view_fun
|
67
|
+
? global::create_root_view_fun()
|
68
|
+
: new View();
|
69
|
+
}
|
70
|
+
|
71
|
+
void
|
72
|
+
Window_register_capture (Window* window, View* view, Pointer::ID target)
|
73
|
+
{
|
74
|
+
assert(window);
|
75
|
+
|
76
|
+
if (!view)
|
77
|
+
argument_error(__FILE__, __LINE__);
|
78
|
+
|
79
|
+
if (view->window() != window)
|
80
|
+
invalid_state_error(__FILE__, __LINE__);
|
81
|
+
|
82
|
+
if (target < 0) return;
|
83
|
+
|
84
|
+
auto& targets = window->self->captures[view];
|
85
|
+
if (std::find(targets.begin(), targets.end(), target) != targets.end())
|
86
|
+
return;
|
87
|
+
|
88
|
+
targets.insert(
|
89
|
+
target == CAPTURE_ALL ? targets.begin() : targets.end(),
|
90
|
+
target);
|
91
|
+
}
|
92
|
+
|
93
|
+
void
|
94
|
+
Window_unregister_capture (Window* window, View* view, Pointer::ID target)
|
95
|
+
{
|
96
|
+
assert(window);
|
97
|
+
|
98
|
+
if (!view)
|
99
|
+
argument_error(__FILE__, __LINE__);
|
100
|
+
|
101
|
+
auto captures_it = window->self->captures.find(view);
|
102
|
+
if (captures_it == window->self->captures.end()) return;
|
103
|
+
|
104
|
+
auto& targets = captures_it->second;
|
105
|
+
auto targets_it = std::find(targets.begin(), targets.end(), target);
|
106
|
+
if (targets_it == targets.end()) return;
|
107
|
+
|
108
|
+
targets.erase(targets_it);
|
109
|
+
}
|
110
|
+
|
111
|
+
static void
|
112
|
+
cleanup_captures (Window* window)
|
113
|
+
{
|
114
|
+
assert(window);
|
115
|
+
|
116
|
+
auto& caps = window->self->captures;
|
117
|
+
for (auto it = caps.begin(), end = caps.end(); it != end;)
|
118
|
+
{
|
119
|
+
auto t = it++;
|
120
|
+
if (t->second.empty()) caps.erase(t);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
39
124
|
void
|
40
125
|
Window_call_draw_event (Window* window, DrawEvent* event)
|
41
126
|
{
|
@@ -63,66 +148,252 @@ namespace Reflex
|
|
63
148
|
painter->end();
|
64
149
|
}
|
65
150
|
|
66
|
-
|
151
|
+
static bool
|
152
|
+
is_capturing (
|
153
|
+
const View* view, const CaptureTargetIDList& targets, View::Capture type)
|
67
154
|
{
|
155
|
+
return
|
156
|
+
!targets.empty() &&
|
157
|
+
targets[0] == CAPTURE_ALL &&
|
158
|
+
(view->capture() & type) == type;
|
159
|
+
}
|
68
160
|
|
69
|
-
|
161
|
+
void
|
162
|
+
Window_call_key_event (Window* window, KeyEvent* event)
|
163
|
+
{
|
164
|
+
assert(window);
|
70
165
|
|
71
|
-
|
166
|
+
if (!event)
|
167
|
+
argument_error(__FILE__, __LINE__);
|
72
168
|
|
73
|
-
|
74
|
-
|
169
|
+
window->on_key(event);
|
170
|
+
|
171
|
+
switch (event->type)
|
172
|
+
{
|
173
|
+
case KeyEvent::DOWN: window->on_key_down(event); break;
|
174
|
+
case KeyEvent::UP: window->on_key_up(event); break;
|
175
|
+
default: break;
|
176
|
+
}
|
177
|
+
|
178
|
+
for (auto& [view, targets] : window->self->captures)
|
179
|
+
{
|
180
|
+
if (!is_capturing(view.get(), targets, View::CAPTURE_KEY))
|
181
|
+
continue;
|
182
|
+
|
183
|
+
KeyEvent e = *event;
|
184
|
+
e.captured = true;
|
185
|
+
View_call_key_event(const_cast<View*>(view.get()), e);
|
186
|
+
}
|
187
|
+
|
188
|
+
if (window->self->focus)
|
189
|
+
View_call_key_event(window->self->focus.get(), *event);
|
190
|
+
|
191
|
+
cleanup_captures(window);
|
192
|
+
}
|
193
|
+
|
194
|
+
static void
|
195
|
+
get_views_capturing_all_pointers (Window* window, ViewList* result)
|
75
196
|
{
|
76
|
-
|
197
|
+
assert(window && result);
|
198
|
+
|
199
|
+
result->clear();
|
200
|
+
for (const auto& [view, targets] : window->self->captures)
|
201
|
+
{
|
202
|
+
if (is_capturing(view.get(), targets, View::CAPTURE_POINTER))
|
203
|
+
result->emplace_back(view);
|
204
|
+
}
|
77
205
|
}
|
78
206
|
|
79
|
-
static
|
80
|
-
|
207
|
+
static void
|
208
|
+
capture_all_pointers (
|
209
|
+
Window* window, const PointerEvent& event, ViewList& views_capturing_all)
|
81
210
|
{
|
82
|
-
|
83
|
-
|
84
|
-
|
211
|
+
assert(window);
|
212
|
+
|
213
|
+
if (views_capturing_all.empty()) return;
|
214
|
+
|
215
|
+
PointerEvent_each_pointer(&event, [&](const auto& pointer)
|
216
|
+
{
|
217
|
+
if (pointer.action() == Pointer::DOWN)
|
218
|
+
{
|
219
|
+
for (auto& view : views_capturing_all)
|
220
|
+
Window_register_capture(window, view, pointer.id());
|
221
|
+
}
|
222
|
+
});
|
85
223
|
}
|
86
224
|
|
87
|
-
void
|
88
|
-
|
225
|
+
static void
|
226
|
+
extract_pointer (
|
227
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
228
|
+
const Pointer& pointer)
|
89
229
|
{
|
90
|
-
|
91
|
-
|
230
|
+
assert(event && extracteds);
|
231
|
+
|
232
|
+
PointerEvent_add_pointer(event, pointer);
|
233
|
+
extracteds->insert(pointer.id());
|
234
|
+
}
|
92
235
|
|
93
|
-
|
94
|
-
|
95
|
-
|
236
|
+
static void
|
237
|
+
extract_targeted_pointers (
|
238
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
239
|
+
const CaptureTargetIDList& targets, const PointerMap& pointers)
|
240
|
+
{
|
241
|
+
assert(event && event->empty() && extracteds);
|
96
242
|
|
97
|
-
|
243
|
+
for (auto pointer_id : targets)
|
244
|
+
{
|
245
|
+
auto it = pointers.find(pointer_id);
|
246
|
+
if (it != pointers.end())
|
247
|
+
extract_pointer(event, extracteds, it->second);
|
248
|
+
}
|
98
249
|
}
|
99
250
|
|
100
|
-
void
|
101
|
-
|
251
|
+
static void
|
252
|
+
capture_targeted_pointers_and_call_events (
|
253
|
+
ExtractedPointerIDSet* extracteds,
|
254
|
+
Window* window, const PointerMap& pointers)
|
102
255
|
{
|
103
|
-
|
104
|
-
argument_error(__FILE__, __LINE__);
|
256
|
+
assert(extracteds && window);
|
105
257
|
|
106
|
-
|
107
|
-
|
258
|
+
for (auto& [view, targets] : window->self->captures)
|
259
|
+
{
|
260
|
+
if (targets.empty()) continue;
|
108
261
|
|
109
|
-
|
110
|
-
|
262
|
+
PointerEvent e(true);
|
263
|
+
extract_targeted_pointers(&e, extracteds, targets, pointers);
|
264
|
+
if (e.empty()) continue;
|
111
265
|
|
112
|
-
|
266
|
+
PointerEvent_update_for_capturing_view(&e, view);
|
267
|
+
View_call_pointer_event(const_cast<View*>(view.get()), e);
|
268
|
+
}
|
113
269
|
}
|
114
270
|
|
115
271
|
static void
|
116
|
-
|
272
|
+
extract_hovering_pointers (
|
273
|
+
PointerEvent* event, ExtractedPointerIDSet* extracteds,
|
274
|
+
const PointerMap& pointers)
|
117
275
|
{
|
118
|
-
|
119
|
-
|
276
|
+
assert(event && event->empty() && extracteds);
|
277
|
+
|
278
|
+
for (const auto& [_, pointer] : pointers)
|
120
279
|
{
|
121
|
-
|
122
|
-
if (
|
280
|
+
// dragging pointers is captured as a targeted
|
281
|
+
if (pointer.is_drag()) continue;
|
282
|
+
|
283
|
+
extract_pointer(event, extracteds, pointer);
|
284
|
+
}
|
285
|
+
}
|
286
|
+
|
287
|
+
static void
|
288
|
+
capture_hovering_pointers_and_call_events (
|
289
|
+
ExtractedPointerIDSet* extracteds,
|
290
|
+
const ViewList& views_capturing_all, const PointerMap& pointers)
|
291
|
+
{
|
292
|
+
assert(extracteds);
|
293
|
+
|
294
|
+
if (views_capturing_all.empty()) return;
|
295
|
+
|
296
|
+
PointerEvent event(true);
|
297
|
+
extract_hovering_pointers(&event, extracteds, pointers);
|
298
|
+
if (event.empty()) return;
|
299
|
+
|
300
|
+
for (auto& view : views_capturing_all)
|
301
|
+
{
|
302
|
+
PointerEvent e = event;
|
303
|
+
PointerEvent_update_for_capturing_view(&e, view);
|
304
|
+
View_call_pointer_event(const_cast<View*>(view.get()), e);
|
123
305
|
}
|
124
306
|
}
|
125
307
|
|
308
|
+
static void
|
309
|
+
erase_extracted_pointers (
|
310
|
+
PointerMap* pointers, const ExtractedPointerIDSet& extracteds)
|
311
|
+
{
|
312
|
+
assert(pointers);
|
313
|
+
|
314
|
+
for (auto id : extracteds)
|
315
|
+
{
|
316
|
+
auto it = pointers->find(id);
|
317
|
+
if (it != pointers->end()) pointers->erase(it);
|
318
|
+
}
|
319
|
+
}
|
320
|
+
|
321
|
+
static void
|
322
|
+
erase_extracted_pointers (
|
323
|
+
PointerEvent* event, const ExtractedPointerIDSet& extracteds)
|
324
|
+
{
|
325
|
+
assert(event);
|
326
|
+
|
327
|
+
for (auto id : extracteds)
|
328
|
+
PointerEvent_erase_pointer(event, id);
|
329
|
+
}
|
330
|
+
|
331
|
+
static void
|
332
|
+
call_captured_pointer_events (Window* window, PointerEvent* event)
|
333
|
+
{
|
334
|
+
assert(window && event);
|
335
|
+
|
336
|
+
ViewList views_capturing_all;
|
337
|
+
get_views_capturing_all_pointers(window, &views_capturing_all);
|
338
|
+
capture_all_pointers(window, *event, views_capturing_all);
|
339
|
+
|
340
|
+
PointerMap pointers;
|
341
|
+
PointerEvent_each_pointer(event, [&](const auto& pointer)
|
342
|
+
{
|
343
|
+
if (pointer.id() >= 0) pointers[pointer.id()] = pointer;
|
344
|
+
});
|
345
|
+
|
346
|
+
ExtractedPointerIDSet extracteds;
|
347
|
+
capture_targeted_pointers_and_call_events(&extracteds, window, pointers);
|
348
|
+
erase_extracted_pointers(&pointers, extracteds);
|
349
|
+
|
350
|
+
capture_hovering_pointers_and_call_events(&extracteds, views_capturing_all, pointers);
|
351
|
+
erase_extracted_pointers(event, extracteds);
|
352
|
+
}
|
353
|
+
|
354
|
+
void
|
355
|
+
Window_call_pointer_event (Window* window, PointerEvent* event)
|
356
|
+
{
|
357
|
+
assert(window);
|
358
|
+
|
359
|
+
if (!event)
|
360
|
+
argument_error(__FILE__, __LINE__);
|
361
|
+
|
362
|
+
window->on_pointer(event);
|
363
|
+
|
364
|
+
switch ((*event)[0].action())
|
365
|
+
{
|
366
|
+
case Pointer::DOWN: window->on_pointer_down(event); break;
|
367
|
+
case Pointer::UP: window->on_pointer_up(event); break;
|
368
|
+
case Pointer::MOVE: window->on_pointer_move(event); break;
|
369
|
+
case Pointer::CANCEL: window->on_pointer_cancel(event); break;
|
370
|
+
default: break;
|
371
|
+
}
|
372
|
+
|
373
|
+
call_captured_pointer_events(window, event);
|
374
|
+
|
375
|
+
if (!event->empty())
|
376
|
+
{
|
377
|
+
PointerEvent_update_for_child_view(event, window->root());
|
378
|
+
View_call_pointer_event(window->root(), *event);
|
379
|
+
}
|
380
|
+
|
381
|
+
cleanup_captures(window);
|
382
|
+
}
|
383
|
+
|
384
|
+
void
|
385
|
+
Window_call_wheel_event (Window* window, WheelEvent* event)
|
386
|
+
{
|
387
|
+
assert(window);
|
388
|
+
|
389
|
+
if (!event)
|
390
|
+
argument_error(__FILE__, __LINE__);
|
391
|
+
|
392
|
+
window->on_wheel(event);
|
393
|
+
|
394
|
+
View_call_wheel_event(window->root(), *event);
|
395
|
+
}
|
396
|
+
|
126
397
|
|
127
398
|
Window::Window ()
|
128
399
|
: self(Window_create_data())
|
@@ -133,7 +404,7 @@ namespace Reflex
|
|
133
404
|
self->root->set_name(VIEW_TAG_ROOT);
|
134
405
|
View_set_window(self->root.get(), this);
|
135
406
|
|
136
|
-
self->painter.canvas(0, 0, 1, 1);
|
407
|
+
self->painter.canvas(0, 0, 1, 1, Window_get_pixel_density(*this));
|
137
408
|
}
|
138
409
|
|
139
410
|
Window::~Window ()
|
@@ -191,6 +462,18 @@ namespace Reflex
|
|
191
462
|
self->redraw = true;
|
192
463
|
}
|
193
464
|
|
465
|
+
Point
|
466
|
+
Window::from_screen (const Point& point) const
|
467
|
+
{
|
468
|
+
return point - frame().position();
|
469
|
+
}
|
470
|
+
|
471
|
+
Point
|
472
|
+
Window::to_screen (const Point& point) const
|
473
|
+
{
|
474
|
+
return point + frame().position();
|
475
|
+
}
|
476
|
+
|
194
477
|
void
|
195
478
|
Window::set_title (const char* title)
|
196
479
|
{
|
@@ -221,6 +504,18 @@ namespace Reflex
|
|
221
504
|
return Window_get_frame(*this);
|
222
505
|
}
|
223
506
|
|
507
|
+
void
|
508
|
+
Window::set_resizable (bool state)
|
509
|
+
{
|
510
|
+
Window_set_resizable(this, state);
|
511
|
+
}
|
512
|
+
|
513
|
+
bool
|
514
|
+
Window::is_resizable () const
|
515
|
+
{
|
516
|
+
return Window_is_resizable(*this);
|
517
|
+
}
|
518
|
+
|
224
519
|
bool
|
225
520
|
Window::hidden () const
|
226
521
|
{
|
@@ -263,20 +558,6 @@ namespace Reflex
|
|
263
558
|
return const_cast<Window*>(this)->painter();
|
264
559
|
}
|
265
560
|
|
266
|
-
Point
|
267
|
-
Window::from_screen (const Point& point) const
|
268
|
-
{
|
269
|
-
not_implemented_error(__FILE__, __LINE__);
|
270
|
-
return 0;
|
271
|
-
}
|
272
|
-
|
273
|
-
Point
|
274
|
-
Window::to_screen (const Point& point) const
|
275
|
-
{
|
276
|
-
not_implemented_error(__FILE__, __LINE__);
|
277
|
-
return 0;
|
278
|
-
}
|
279
|
-
|
280
561
|
void
|
281
562
|
Window::on_show (Event* e)
|
282
563
|
{
|
@@ -315,28 +596,6 @@ namespace Reflex
|
|
315
596
|
void
|
316
597
|
Window::on_key (KeyEvent* e)
|
317
598
|
{
|
318
|
-
if (!e)
|
319
|
-
argument_error(__FILE__, __LINE__);
|
320
|
-
|
321
|
-
switch (e->type)
|
322
|
-
{
|
323
|
-
case KeyEvent::DOWN: on_key_down(e); break;
|
324
|
-
case KeyEvent::UP: on_key_up(e); break;
|
325
|
-
case KeyEvent::NONE: break;
|
326
|
-
}
|
327
|
-
|
328
|
-
auto end = self->capturing_views.end();
|
329
|
-
for (auto it = self->capturing_views.begin(); it != end; ++it)
|
330
|
-
{
|
331
|
-
KeyEvent event = *e;
|
332
|
-
event.capture = true;
|
333
|
-
View_call_key_event(const_cast<View*>(it->first.get()), event);
|
334
|
-
}
|
335
|
-
|
336
|
-
if (self->focus)
|
337
|
-
View_call_key_event(self->focus.get(), *e);
|
338
|
-
|
339
|
-
cleanup_capturing_views(this);
|
340
599
|
}
|
341
600
|
|
342
601
|
void
|
@@ -352,30 +611,6 @@ namespace Reflex
|
|
352
611
|
void
|
353
612
|
Window::on_pointer (PointerEvent* e)
|
354
613
|
{
|
355
|
-
if (!e)
|
356
|
-
argument_error(__FILE__, __LINE__);
|
357
|
-
|
358
|
-
switch (e->type)
|
359
|
-
{
|
360
|
-
case PointerEvent::DOWN: on_pointer_down(e); break;
|
361
|
-
case PointerEvent::UP: on_pointer_up(e); break;
|
362
|
-
case PointerEvent::MOVE: on_pointer_move(e); break;
|
363
|
-
case PointerEvent::NONE: break;
|
364
|
-
}
|
365
|
-
|
366
|
-
auto end = self->capturing_views.end();
|
367
|
-
for (auto it = self->capturing_views.begin(); it != end; ++it)
|
368
|
-
{
|
369
|
-
PointerEvent event = *e;
|
370
|
-
event.capture = true;
|
371
|
-
for (size_t i = 0; i < event.size; ++i)
|
372
|
-
event[i] = it->first.get()->from_window(event[i]);
|
373
|
-
View_call_pointer_event(const_cast<View*>(it->first.get()), event);
|
374
|
-
}
|
375
|
-
|
376
|
-
View_call_pointer_event(root(), *e);
|
377
|
-
|
378
|
-
cleanup_capturing_views(this);
|
379
614
|
}
|
380
615
|
|
381
616
|
void
|
@@ -394,12 +629,13 @@ namespace Reflex
|
|
394
629
|
}
|
395
630
|
|
396
631
|
void
|
397
|
-
Window::
|
632
|
+
Window::on_pointer_cancel (PointerEvent* e)
|
398
633
|
{
|
399
|
-
|
400
|
-
argument_error(__FILE__, __LINE__);
|
634
|
+
}
|
401
635
|
|
402
|
-
|
636
|
+
void
|
637
|
+
Window::on_wheel (WheelEvent* e)
|
638
|
+
{
|
403
639
|
}
|
404
640
|
|
405
641
|
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
|
{
|
@@ -78,9 +85,27 @@ namespace Reflex
|
|
78
85
|
|
79
86
|
Bounds Window_get_frame (const Window& window);
|
80
87
|
|
88
|
+
void Window_set_resizable (Window* window, bool state);
|
89
|
+
|
90
|
+
bool Window_is_resizable (const Window& window);
|
91
|
+
|
81
92
|
void Window_set_focus (Window* window, View* view);
|
82
93
|
|
83
|
-
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);
|
107
|
+
|
108
|
+
float Window_get_pixel_density (const Window& window);
|
84
109
|
|
85
110
|
|
86
111
|
typedef View* (*Window_CreateRootViewFun) ();
|
data/test/helper.rb
CHANGED
data/test/test_application.rb
CHANGED
data/test/test_capture_event.rb
CHANGED
@@ -6,13 +6,13 @@ 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 test_begin
|
15
|
+
def test_begin()
|
16
16
|
c = event [:key, :pointer], []
|
17
17
|
assert_equal [:key, :pointer], c.begin
|
18
18
|
assert_equal true, c.begin?(:key)
|
@@ -26,7 +26,7 @@ class TestCaptureEvent < Test::Unit::TestCase
|
|
26
26
|
assert_equal false, c.begin?(:all)
|
27
27
|
end
|
28
28
|
|
29
|
-
def test_end
|
29
|
+
def test_end()
|
30
30
|
c = event [], [:key, :pointer]
|
31
31
|
assert_equal [:key, :pointer], c.end
|
32
32
|
assert_equal true, c.end?(:key)
|
data/test/test_event.rb
CHANGED
@@ -6,15 +6,29 @@ require_relative 'helper'
|
|
6
6
|
|
7
7
|
class TestEvent < Test::Unit::TestCase
|
8
8
|
|
9
|
-
def event
|
9
|
+
def event()
|
10
10
|
Reflex::Event.new
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def test_dup()
|
14
|
+
e1 = event
|
15
|
+
e2 = e1.dup
|
16
|
+
e1.block
|
17
|
+
e3 = e1.dup
|
18
|
+
assert_equal true, e1.blocked?
|
19
|
+
assert_equal false, e2.blocked?
|
20
|
+
assert_equal true, e3.blocked?
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_block()
|
14
24
|
e = event
|
15
|
-
assert_equal false, e.
|
25
|
+
assert_equal false, e.blocked?
|
16
26
|
e.block
|
17
|
-
assert_equal true,
|
27
|
+
assert_equal true, e.blocked?
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_time()
|
31
|
+
assert_in_delta Time.now.to_f, event.time, 0.001
|
18
32
|
end
|
19
33
|
|
20
34
|
end# TestEvent
|