reflexion 0.3.2 → 0.3.4

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.
data/src/window.cpp CHANGED
@@ -22,6 +22,37 @@ namespace Reflex
22
22
  using CaptureTargetIDList = Window::Data::CaptureTargetIDList;
23
23
 
24
24
 
25
+ void
26
+ Window_register (Window* win)
27
+ {
28
+ auto& all = Window_all();
29
+
30
+ auto it = std::find(all.begin(), all.end(), win);
31
+ if (it != all.end())
32
+ invalid_state_error(__FILE__, __LINE__);
33
+
34
+ all.push_back(win);
35
+ }
36
+
37
+ void
38
+ Window_unregister (Window* win)
39
+ {
40
+ auto& all = Window_all();
41
+
42
+ auto it = std::find(all.begin(), all.end(), win);
43
+ if (it == all.end()) return;
44
+
45
+ all.erase(it);
46
+ }
47
+
48
+ Application::WindowList&
49
+ Window_all ()
50
+ {
51
+ static Application::WindowList windows;
52
+ return windows;
53
+ }
54
+
55
+
25
56
  Window::Data::Data ()
26
57
  : flags(Window_default_flags())
27
58
  {
@@ -98,7 +129,7 @@ namespace Reflex
98
129
  return;
99
130
 
100
131
  targets.insert(
101
- target == CAPTURE_ALL ? targets.begin() : targets.end(),
132
+ target == CAPTURE_ALL_EVENTS ? targets.begin() : targets.end(),
102
133
  target);
103
134
  }
104
135
 
@@ -132,23 +163,38 @@ namespace Reflex
132
163
  }
133
164
 
134
165
  void
135
- Window_call_activate_event (Reflex::Window* window)
166
+ Window_call_activate_event (Window* window)
136
167
  {
137
168
  if (!window) return;
138
169
 
139
- Reflex::Event e;
170
+ Event e;
140
171
  window->on_activate(&e);
141
172
  }
142
173
 
143
174
  void
144
- Window_call_deactivate_event (Reflex::Window* window)
175
+ Window_call_deactivate_event (Window* window)
145
176
  {
146
177
  if (!window) return;
147
178
 
148
- Reflex::Event e;
179
+ Event e;
149
180
  window->on_deactivate(&e);
150
181
  }
151
182
 
183
+ void
184
+ Window_call_update_event (Window* window)
185
+ {
186
+ Window::Data* self = window->self.get();
187
+
188
+ double now = Xot::time();
189
+ UpdateEvent e(now, now - self->prev_time_update);
190
+ self->prev_time_update = now;
191
+
192
+ window->on_update(&e);
193
+ if (e.is_blocked()) return;
194
+
195
+ View_update_tree(window->root(), e);
196
+ }
197
+
152
198
  void
153
199
  Window_call_draw_event (Window* window, DrawEvent* event)
154
200
  {
@@ -172,19 +218,19 @@ namespace Reflex
172
218
 
173
219
  window->on_draw(event);
174
220
  if (!event->is_blocked())
175
- Reflex::View_draw_tree(window->root(), event, 0, frame.move_to(0));
221
+ View_draw_tree(window->root(), event, 0, frame.move_to(0));
176
222
 
177
223
  painter->pop_state();
178
224
  painter->end();
179
225
  }
180
226
 
181
227
  static bool
182
- is_capturing_all (
228
+ is_capturing (
183
229
  const View* view, const CaptureTargetIDList& targets, View::Capture type)
184
230
  {
185
231
  return
186
232
  !targets.empty() &&
187
- targets[0] == CAPTURE_ALL &&
233
+ targets[0] == CAPTURE_ALL_EVENTS &&
188
234
  (view->capture() & type) == type;
189
235
  }
190
236
 
@@ -196,20 +242,11 @@ namespace Reflex
196
242
  if (!event)
197
243
  argument_error(__FILE__, __LINE__);
198
244
 
199
- window->on_key(event);
200
-
201
- switch (event->action())
202
- {
203
- case KeyEvent::DOWN: window->on_key_down(event); break;
204
- case KeyEvent::UP: window->on_key_up(event); break;
205
- default: break;
206
- }
207
-
208
245
  for (auto& [view, targets] : window->self->captures)
209
246
  {
210
247
  if (
211
248
  !view->window() ||
212
- !is_capturing_all(view.get(), targets, View::CAPTURE_KEY))
249
+ !is_capturing(view.get(), targets, View::CAPTURE_KEY))
213
250
  {
214
251
  continue;
215
252
  }
@@ -217,9 +254,24 @@ namespace Reflex
217
254
  KeyEvent e = event->dup();
218
255
  KeyEvent_set_captured(&e, true);
219
256
  View_call_key_event(const_cast<View*>(view.get()), &e);
257
+
258
+ if (e.is_blocked()) event->block();
220
259
  }
221
260
 
222
- if (window->self->focus)
261
+ if (!event->is_blocked())
262
+ window->on_key(event);
263
+
264
+ if (!event->is_blocked())
265
+ {
266
+ switch (event->action())
267
+ {
268
+ case KeyEvent::DOWN: window->on_key_down(event); break;
269
+ case KeyEvent::UP: window->on_key_up(event); break;
270
+ default: break;
271
+ }
272
+ }
273
+
274
+ if (!event->is_blocked() && window->self->focus)
223
275
  View_call_key_event(window->self->focus.get(), event);
224
276
 
225
277
  cleanup_captures(window);
@@ -336,7 +388,7 @@ namespace Reflex
336
388
  result->clear();
337
389
  for (const auto& [view, targets] : window->self->captures)
338
390
  {
339
- if (is_capturing_all(view.get(), targets, View::CAPTURE_POINTER))
391
+ if (is_capturing(view.get(), targets, View::CAPTURE_POINTER))
340
392
  result->emplace_back(view);
341
393
  }
342
394
  }
@@ -385,7 +437,7 @@ namespace Reflex
385
437
 
386
438
  static void
387
439
  capture_targeted_pointers_and_call_events (
388
- ExtractedPointerIDSet* extracteds,
440
+ ExtractedPointerIDSet* extracteds, bool* blocked,
389
441
  Window* window, const PointerMap& pointers)
390
442
  {
391
443
  for (auto& [view, targets] : window->self->captures)
@@ -399,6 +451,8 @@ namespace Reflex
399
451
 
400
452
  PointerEvent_update_for_capturing_view(&event, view);
401
453
  View_call_pointer_event(const_cast<View*>(view.get()), &event);
454
+
455
+ if (event.is_blocked()) *blocked = true;
402
456
  }
403
457
  }
404
458
 
@@ -420,7 +474,7 @@ namespace Reflex
420
474
 
421
475
  static void
422
476
  capture_hovering_pointers_and_call_events (
423
- ExtractedPointerIDSet* extracteds,
477
+ ExtractedPointerIDSet* extracteds, bool* blocked,
424
478
  const ViewList& views_capturing_all, const PointerMap& pointers)
425
479
  {
426
480
  assert(extracteds);
@@ -439,6 +493,8 @@ namespace Reflex
439
493
  PointerEvent e = event.dup();
440
494
  PointerEvent_update_for_capturing_view(&e, view);
441
495
  View_call_pointer_event(const_cast<View*>(view.get()), &e);
496
+
497
+ if (e.is_blocked()) *blocked = true;
442
498
  }
443
499
  }
444
500
 
@@ -481,11 +537,17 @@ namespace Reflex
481
537
  });
482
538
 
483
539
  ExtractedPointerIDSet extracteds;
484
- capture_targeted_pointers_and_call_events(&extracteds, window, pointers);
540
+ bool blocked = false;
541
+
542
+ capture_targeted_pointers_and_call_events(
543
+ &extracteds, &blocked, window, pointers);
485
544
  erase_extracted_pointers(&pointers, extracteds);
486
545
 
487
- capture_hovering_pointers_and_call_events(&extracteds, views_capturing_all, pointers);
546
+ capture_hovering_pointers_and_call_events(
547
+ &extracteds, &blocked, views_capturing_all, pointers);
488
548
  erase_extracted_pointers(event, extracteds);
549
+
550
+ if (blocked) event->block();
489
551
  }
490
552
 
491
553
  void
@@ -498,20 +560,24 @@ namespace Reflex
498
560
 
499
561
  setup_pointer_event(window, event);
500
562
 
501
- window->on_pointer(event);
563
+ call_captured_pointer_events(window, event);
564
+
565
+ if (!event->is_blocked() && !event->empty())
566
+ window->on_pointer(event);
502
567
 
503
- switch ((*event)[0].action())
568
+ if (!event->is_blocked() && !event->empty())
504
569
  {
505
- case Pointer::DOWN: window->on_pointer_down(event); break;
506
- case Pointer::UP: window->on_pointer_up(event); break;
507
- case Pointer::MOVE: window->on_pointer_move(event); break;
508
- case Pointer::CANCEL: window->on_pointer_cancel(event); break;
509
- default: break;
570
+ switch ((*event)[0].action())
571
+ {
572
+ case Pointer::DOWN: window->on_pointer_down(event); break;
573
+ case Pointer::UP: window->on_pointer_up(event); break;
574
+ case Pointer::MOVE: window->on_pointer_move(event); break;
575
+ case Pointer::CANCEL: window->on_pointer_cancel(event); break;
576
+ default: break;
577
+ }
510
578
  }
511
579
 
512
- call_captured_pointer_events(window, event);
513
-
514
- if (!event->empty())
580
+ if (!event->is_blocked() && !event->empty())
515
581
  {
516
582
  PointerEvent_update_for_child_view(event, window->root());
517
583
  View_call_pointer_event(window->root(), event);
data/src/window.h CHANGED
@@ -12,6 +12,7 @@
12
12
  #include <rays/painter.h>
13
13
  #include "reflex/window.h"
14
14
  #include "reflex/view.h"
15
+ #include "application.h"
15
16
  #include "pointer.h"
16
17
 
17
18
 
@@ -22,7 +23,7 @@ namespace Reflex
22
23
  typedef std::list<Pointer> PointerList;
23
24
 
24
25
 
25
- enum {CAPTURE_ALL = INT_MAX};
26
+ enum {CAPTURE_ALL_EVENTS = INT_MAX};
26
27
 
27
28
 
28
29
  struct Window::Data
@@ -75,6 +76,13 @@ namespace Reflex
75
76
 
76
77
  Window::Data* Window_create_data ();
77
78
 
79
+ void Window_register (Window* win);
80
+
81
+ void Window_unregister (Window* win);
82
+
83
+ Application::WindowList& Window_all ();
84
+
85
+
78
86
  uint Window_default_flags ();
79
87
 
80
88
  void Window_initialize (Window* window);
@@ -112,6 +120,8 @@ namespace Reflex
112
120
 
113
121
  void Window_call_deactivate_event (Window* window);
114
122
 
123
+ void Window_call_update_event (Window* window);
124
+
115
125
  void Window_call_draw_event (Window* window, DrawEvent* event);
116
126
 
117
127
  void Window_call_key_event (Window* window, KeyEvent* event);
data/test/test_view.rb CHANGED
@@ -373,6 +373,57 @@ class TestView < Test::Unit::TestCase
373
373
  assert_raise(ArgumentError) {v.scroll_by 100}
374
374
  end
375
375
 
376
+ def test_capture()
377
+ v, w = view, window
378
+ w.add v
379
+ assert_equal [], v.capture
380
+
381
+ v.capture = :key; assert_equal [:key], v.capture
382
+ v.capture = :pointer; assert_equal [:pointer], v.capture
383
+ v.capture = :all; assert_equal [:key, :pointer], v.capture
384
+
385
+ v.capture -= [:key]; assert_equal [:pointer], v.capture
386
+ v.capture += [:key]; assert_equal [:key, :pointer], v.capture
387
+
388
+ v.capture = []; assert_equal [], v.capture
389
+ v.capture += [:key, :pointer]; assert_equal [:key, :pointer], v.capture
390
+ v.capture = []; assert_equal [], v.capture
391
+ v.capture += [:all]; assert_equal [:key, :pointer], v.capture
392
+
393
+ v.capture -= []; assert_equal [:key, :pointer], v.capture
394
+ v.capture = []; assert_equal [], v.capture
395
+ v.capture += []; assert_equal [], v.capture
396
+ end
397
+
398
+ def test_capturing()
399
+ v, w = view, window
400
+ w.add v
401
+
402
+ v.capture = []
403
+ assert_false v.capturing?
404
+ assert_false v.capturing? :key
405
+ assert_false v.capturing? :pointer
406
+ assert_false v.capturing? :all
407
+
408
+ v.capture = :key
409
+ assert_true v.capturing?
410
+ assert_true v.capturing? :key
411
+ assert_false v.capturing? :pointer
412
+ assert_false v.capturing? :all
413
+
414
+ v.capture = :pointer
415
+ assert_true v.capturing?
416
+ assert_false v.capturing? :key
417
+ assert_true v.capturing? :pointer
418
+ assert_false v.capturing? :all
419
+
420
+ v.capture = :all
421
+ assert_true v.capturing?
422
+ assert_true v.capturing? :key
423
+ assert_true v.capturing? :pointer
424
+ assert_true v.capturing? :all
425
+ end
426
+
376
427
  def test_parent()
377
428
  parent, child = view, view
378
429
  parent.add_child child
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reflexion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-13 00:00:00.000000000 Z
11
+ date: 2025-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xot
@@ -16,80 +16,60 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.2
19
+ version: 0.3.4
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.3.2
22
+ version: 0.3.4
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: 0.3.2
29
+ version: 0.3.4
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.3.2
32
+ version: 0.3.4
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rucy
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.3.2
39
+ version: 0.3.4
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 0.3.2
42
+ version: 0.3.4
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 0.3.2
49
+ version: 0.3.4
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 0.3.2
53
- - !ruby/object:Gem::Dependency
54
- name: beeps
55
- requirement: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: 0.3.2
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 0.3.2
63
- type: :runtime
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: 0.3.2
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: 0.3.2
52
+ version: 0.3.4
73
53
  - !ruby/object:Gem::Dependency
74
54
  name: rays
75
55
  requirement: !ruby/object:Gem::Requirement
76
56
  requirements:
77
57
  - - "~>"
78
58
  - !ruby/object:Gem::Version
79
- version: 0.3.2
59
+ version: 0.3.4
80
60
  - - ">="
81
61
  - !ruby/object:Gem::Version
82
- version: 0.3.2
62
+ version: 0.3.4
83
63
  type: :runtime
84
64
  prerelease: false
85
65
  version_requirements: !ruby/object:Gem::Requirement
86
66
  requirements:
87
67
  - - "~>"
88
68
  - !ruby/object:Gem::Version
89
- version: 0.3.2
69
+ version: 0.3.4
90
70
  - - ">="
91
71
  - !ruby/object:Gem::Version
92
- version: 0.3.2
72
+ version: 0.3.4
93
73
  description: This library helps you to develop interactive graphical user interface.
94
74
  email: xordog@gmail.com
95
75
  executables: []
@@ -341,6 +321,8 @@ files:
341
321
  - samples/tree.rb
342
322
  - samples/views.rb
343
323
  - samples/visuals.rb
324
+ - src/application.cpp
325
+ - src/application.h
344
326
  - src/body.cpp
345
327
  - src/body.h
346
328
  - src/event.cpp
@@ -402,6 +384,7 @@ files:
402
384
  - src/win32/screen.cpp
403
385
  - src/win32/screen.h
404
386
  - src/win32/window.cpp
387
+ - src/win32/window.h
405
388
  - src/window.cpp
406
389
  - src/window.h
407
390
  - src/world.cpp