reflexion 0.1.19 → 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/contact_event.cpp +6 -6
  3. data/.doc/ext/reflex/event.cpp +9 -1
  4. data/.doc/ext/reflex/focus_event.cpp +6 -6
  5. data/.doc/ext/reflex/key_event.cpp +211 -13
  6. data/.doc/ext/reflex/native.cpp +2 -0
  7. data/.doc/ext/reflex/pointer.cpp +158 -0
  8. data/.doc/ext/reflex/pointer_event.cpp +31 -90
  9. data/.doc/ext/reflex/selector.cpp +8 -0
  10. data/.doc/ext/reflex/view.cpp +57 -0
  11. data/.doc/ext/reflex/window.cpp +41 -0
  12. data/VERSION +1 -1
  13. data/ext/reflex/contact_event.cpp +6 -6
  14. data/ext/reflex/event.cpp +11 -2
  15. data/ext/reflex/focus_event.cpp +6 -6
  16. data/ext/reflex/key_event.cpp +212 -13
  17. data/ext/reflex/native.cpp +2 -0
  18. data/ext/reflex/pointer.cpp +170 -0
  19. data/ext/reflex/pointer_event.cpp +30 -95
  20. data/ext/reflex/selector.cpp +9 -0
  21. data/ext/reflex/view.cpp +67 -3
  22. data/ext/reflex/window.cpp +49 -3
  23. data/include/reflex/defs.h +140 -106
  24. data/include/reflex/event.h +26 -27
  25. data/include/reflex/pointer.h +107 -0
  26. data/include/reflex/ruby/pointer.h +41 -0
  27. data/include/reflex/ruby/view.h +9 -0
  28. data/include/reflex/ruby/window.h +9 -0
  29. data/include/reflex/selector.h +1 -1
  30. data/include/reflex/view.h +6 -4
  31. data/include/reflex/window.h +14 -8
  32. data/lib/reflex/application.rb +3 -3
  33. data/lib/reflex/autoinit.rb +1 -1
  34. data/lib/reflex/button.rb +7 -7
  35. data/lib/reflex/capture_event.rb +7 -7
  36. data/lib/reflex/contact_event.rb +4 -4
  37. data/lib/reflex/draw_event.rb +2 -2
  38. data/lib/reflex/ellipse_shape.rb +2 -2
  39. data/lib/reflex/focus_event.rb +4 -4
  40. data/lib/reflex/frame_event.rb +5 -5
  41. data/lib/reflex/helper.rb +20 -20
  42. data/lib/reflex/image_view.rb +2 -2
  43. data/lib/reflex/key_event.rb +6 -6
  44. data/lib/reflex/model.rb +22 -22
  45. data/lib/reflex/model_owner.rb +7 -7
  46. data/lib/reflex/model_view.rb +1 -1
  47. data/lib/reflex/module.rb +5 -5
  48. data/lib/reflex/pointer.rb +107 -0
  49. data/lib/reflex/pointer_event.rb +16 -54
  50. data/lib/reflex/polygon_shape.rb +2 -2
  51. data/lib/reflex/reflex.rb +3 -3
  52. data/lib/reflex/scroll_event.rb +1 -1
  53. data/lib/reflex/selector.rb +4 -4
  54. data/lib/reflex/shape.rb +13 -13
  55. data/lib/reflex/style.rb +11 -11
  56. data/lib/reflex/style_length.rb +1 -1
  57. data/lib/reflex/text_view.rb +2 -2
  58. data/lib/reflex/timer.rb +2 -2
  59. data/lib/reflex/timer_event.rb +1 -1
  60. data/lib/reflex/update_event.rb +1 -1
  61. data/lib/reflex/view.rb +32 -32
  62. data/lib/reflex/wheel_event.rb +3 -3
  63. data/lib/reflex/window.rb +7 -6
  64. data/lib/reflex.rb +1 -0
  65. data/lib/reflexion.rb +17 -17
  66. data/reflex.gemspec +5 -5
  67. data/samples/reflexion/noise.rb +1 -1
  68. data/samples/tree.rb +1 -1
  69. data/src/event.cpp +189 -37
  70. data/src/event.h +32 -0
  71. data/src/ios/event.h +15 -3
  72. data/src/ios/event.mm +126 -11
  73. data/src/ios/view_controller.mm +50 -22
  74. data/src/ios/window.mm +18 -0
  75. data/src/osx/event.h +14 -3
  76. data/src/osx/event.mm +213 -23
  77. data/src/osx/native_window.mm +84 -17
  78. data/src/osx/window.mm +22 -0
  79. data/src/pointer.cpp +203 -0
  80. data/src/pointer.h +26 -0
  81. data/src/selector.cpp +1 -1
  82. data/src/view.cpp +103 -64
  83. data/src/view.h +0 -4
  84. data/src/window.cpp +334 -98
  85. data/src/window.h +28 -3
  86. data/test/helper.rb +3 -3
  87. data/test/test_application.rb +1 -1
  88. data/test/test_capture_event.rb +6 -6
  89. data/test/test_event.rb +18 -4
  90. data/test/test_has_frame.rb +11 -11
  91. data/test/test_pointer.rb +149 -0
  92. data/test/test_pointer_event.rb +70 -104
  93. data/test/test_reflex.rb +1 -1
  94. data/test/test_selector.rb +15 -8
  95. data/test/test_shape.rb +8 -8
  96. data/test/test_style.rb +13 -13
  97. data/test/test_style_length.rb +5 -5
  98. data/test/test_view.rb +57 -30
  99. data/test/test_window.rb +45 -26
  100. metadata +46 -35
@@ -4,9 +4,9 @@
4
4
 
5
5
  #include <assert.h>
6
6
  #import <Cocoa/Cocoa.h>
7
- #include "rays/bounds.h"
8
7
  #include "reflex/exception.h"
9
8
  #include "../view.h"
9
+ #include "../pointer.h"
10
10
  #include "event.h"
11
11
  #include "window.h"
12
12
  #import "opengl_view.h"
@@ -20,12 +20,30 @@ static const NSUInteger WINDOW_STYLE_MASK =
20
20
  0;//NSTexturedBackgroundWindowMask
21
21
 
22
22
 
23
+ static int
24
+ count_mouse_buttons (const Reflex::PointerEvent& e)
25
+ {
26
+ uint nbuttons = 0;
27
+ PointerEvent_each_pointer(&e, [&](const auto& pointer) {
28
+ uint t = pointer.type();
29
+ nbuttons +=
30
+ (t & Reflex::Pointer::MOUSE_LEFT ? 1 : 0) +
31
+ (t & Reflex::Pointer::MOUSE_RIGHT ? 1 : 0) +
32
+ (t & Reflex::Pointer::MOUSE_MIDDLE ? 1 : 0);
33
+ });
34
+ return nbuttons;
35
+ }
36
+
23
37
  @implementation NativeWindow
24
38
 
25
39
  {
26
40
  Reflex::Window *pwindow, *ptr_for_rebind;
27
41
  OpenGLView* view;
28
42
  NSTimer* timer;
43
+ int update_count;
44
+ int clicking_count;
45
+ Reflex::Pointer::ID pointer_id;
46
+ Reflex::Pointer prevPointer;
29
47
  }
30
48
 
31
49
  - (id) init
@@ -37,9 +55,13 @@ static const NSUInteger WINDOW_STYLE_MASK =
37
55
  defer: NO];
38
56
  if (!self) return nil;
39
57
 
40
- pwindow = ptr_for_rebind = NULL;
41
- view = nil;
42
- timer = nil;
58
+ pwindow =
59
+ ptr_for_rebind = NULL;
60
+ view = nil;
61
+ timer = nil;
62
+ update_count = 0;
63
+ clicking_count = 0;
64
+ pointer_id = 0;
43
65
 
44
66
  [self setDelegate: self];
45
67
  [self setupContentView];
@@ -152,6 +174,8 @@ static const NSUInteger WINDOW_STYLE_MASK =
152
174
  Reflex::Window* win = self.window;
153
175
  if (!win) return;
154
176
 
177
+ ++update_count;
178
+
155
179
  double now = Xot::time();
156
180
  Reflex::UpdateEvent e(now, now - win->self->prev_time_update);
157
181
  win->self->prev_time_update = now;
@@ -172,6 +196,9 @@ static const NSUInteger WINDOW_STYLE_MASK =
172
196
  Reflex::Window* win = self.window;
173
197
  if (!win) return;
174
198
 
199
+ if (update_count == 0)
200
+ [self update];
201
+
175
202
  double now = Xot::time();
176
203
  double dt = now - win->self->prev_time_draw;
177
204
  double fps = 1. / dt;
@@ -250,7 +277,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
250
277
  b.move_to(0, 0);
251
278
 
252
279
  if (win->painter())
253
- win->painter()->canvas(b, self.backingScaleFactor);
280
+ win->painter()->canvas(b, win->painter()->pixel_density());
254
281
 
255
282
  if (win->root())
256
283
  View_set_frame(win->root(), b);
@@ -266,7 +293,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
266
293
  if (!win) return;
267
294
 
268
295
  Reflex::NativeKeyEvent e(event, Reflex::KeyEvent::DOWN);
269
- win->on_key(&e);
296
+ Window_call_key_event(win, &e);
270
297
  }
271
298
 
272
299
  - (void) keyUp: (NSEvent*) event
@@ -275,12 +302,16 @@ static const NSUInteger WINDOW_STYLE_MASK =
275
302
  if (!win) return;
276
303
 
277
304
  Reflex::NativeKeyEvent e(event, Reflex::KeyEvent::UP);
278
- win->on_key(&e);
305
+ Window_call_key_event(win, &e);
279
306
  }
280
307
 
281
308
  - (void) flagsChanged: (NSEvent*) event
282
309
  {
283
- // TODO: implement later.
310
+ Reflex::Window* win = self.window;
311
+ if (!win) return;
312
+
313
+ Reflex::NativeFlagKeyEvent e(event);
314
+ Window_call_key_event(win, &e);
284
315
  }
285
316
 
286
317
  - (void) mouseDown: (NSEvent*) event
@@ -288,8 +319,22 @@ static const NSUInteger WINDOW_STYLE_MASK =
288
319
  Reflex::Window* win = self.window;
289
320
  if (!win) return;
290
321
 
291
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::DOWN);
292
- win->on_pointer(&e);
322
+ if (clicking_count == 0) ++pointer_id;
323
+
324
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::DOWN);
325
+
326
+ if (e[0].position().y < 0)
327
+ {
328
+ // ignore mouseDown event since the mouseUp event to the window title bar
329
+ // will not come and will break clicking_count.
330
+ return;
331
+ }
332
+
333
+ [self attachAndUpdatePrevPointer: &e];
334
+
335
+ clicking_count += count_mouse_buttons(e);
336
+
337
+ Window_call_pointer_event(win, &e);
293
338
  }
294
339
 
295
340
  - (void) mouseUp: (NSEvent*) event
@@ -297,8 +342,16 @@ static const NSUInteger WINDOW_STYLE_MASK =
297
342
  Reflex::Window* win = self.window;
298
343
  if (!win) return;
299
344
 
300
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::UP);
301
- win->on_pointer(&e);
345
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::UP);
346
+ [self attachAndUpdatePrevPointer: &e];
347
+
348
+ clicking_count -= count_mouse_buttons(e);
349
+ if (clicking_count == 0)
350
+ ++pointer_id;
351
+ else if (clicking_count < 0)
352
+ Reflex::invalid_state_error(__FILE__, __LINE__);
353
+
354
+ Window_call_pointer_event(win, &e);
302
355
  }
303
356
 
304
357
  - (void) mouseDragged: (NSEvent*) event
@@ -306,8 +359,10 @@ static const NSUInteger WINDOW_STYLE_MASK =
306
359
  Reflex::Window* win = self.window;
307
360
  if (!win) return;
308
361
 
309
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
310
- win->on_pointer(&e);
362
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::MOVE);
363
+ [self attachAndUpdatePrevPointer: &e];
364
+
365
+ Window_call_pointer_event(win, &e);
311
366
  }
312
367
 
313
368
  - (void) mouseMoved: (NSEvent*) event
@@ -315,8 +370,20 @@ static const NSUInteger WINDOW_STYLE_MASK =
315
370
  Reflex::Window* win = self.window;
316
371
  if (!win) return;
317
372
 
318
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
319
- win->on_pointer(&e);
373
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::MOVE);
374
+ [self attachAndUpdatePrevPointer: &e];
375
+
376
+ Window_call_pointer_event(win, &e);
377
+ }
378
+
379
+ - (void) attachAndUpdatePrevPointer: (Reflex::PointerEvent*) e
380
+ {
381
+ assert(e->size() == 1);
382
+
383
+ Reflex::Pointer& pointer = Reflex::PointerEvent_pointer_at(e, 0);
384
+ if (prevPointer)
385
+ Reflex::Pointer_set_prev(&pointer, &prevPointer);
386
+ prevPointer = pointer;
320
387
  }
321
388
 
322
389
  - (void) scrollWheel: (NSEvent*) event
@@ -325,7 +392,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
325
392
  if (!win) return;
326
393
 
327
394
  Reflex::NativeWheelEvent e(event, view);
328
- win->on_wheel(&e);
395
+ Window_call_wheel_event(win, &e);
329
396
  }
330
397
 
331
398
  + (NSRect) frameRectForContentRect: (NSRect) contentRect
data/src/osx/window.mm CHANGED
@@ -112,6 +112,28 @@ namespace Reflex
112
112
  rect.size.height);
113
113
  }
114
114
 
115
+ void
116
+ Window_set_resizable (Window* window, bool state)
117
+ {
118
+ NativeWindow* native = get_native(window);
119
+ if (state)
120
+ native.styleMask |= NSResizableWindowMask;
121
+ else
122
+ native.styleMask &= ~NSResizableWindowMask;
123
+ }
124
+
125
+ bool
126
+ Window_is_resizable (const Window& window)
127
+ {
128
+ return get_native(&window).styleMask & NSResizableWindowMask;
129
+ }
130
+
131
+ float
132
+ Window_get_pixel_density (const Window& window)
133
+ {
134
+ return get_native(&window).backingScaleFactor;
135
+ }
136
+
115
137
 
116
138
  WindowData::WindowData ()
117
139
  {
data/src/pointer.cpp ADDED
@@ -0,0 +1,203 @@
1
+ #include "pointer.h"
2
+
3
+
4
+ #include <xot/time.h>
5
+ #include "reflex/exception.h"
6
+
7
+
8
+ namespace Reflex
9
+ {
10
+
11
+
12
+ class PrevPointerPtr : public Xot::PImpl<Pointer>
13
+ {
14
+
15
+ typedef Xot::PImpl<Pointer> Super;
16
+
17
+ public:
18
+
19
+ PrevPointerPtr () : Super(NULL) {}
20
+
21
+ };// PrevPointerPtr
22
+
23
+
24
+ struct Pointer::Data
25
+ {
26
+
27
+ enum Flag
28
+ {
29
+
30
+ DRAG = Xot::bit(0),
31
+
32
+ ENTER = Xot::bit(1),
33
+
34
+ EXIT = Xot::bit(2),
35
+
36
+ };// Flag
37
+
38
+ ID id;
39
+
40
+ uint type;
41
+
42
+ Action action;
43
+
44
+ Point position;
45
+
46
+ uint modifiers, click_count, flags;
47
+
48
+ double time;
49
+
50
+ PrevPointerPtr prev;
51
+
52
+ Data (
53
+ ID id = -1, uint type = TYPE_NONE, Action action = ACTION_NONE,
54
+ const Point& position = 0, uint modifiers = 0, uint click_count = 0,
55
+ bool drag = false, bool enter = false, bool exit = false,
56
+ double time = 0)
57
+ : id(id), type(type), action(action),
58
+ position(position), modifiers(modifiers), click_count(click_count),
59
+ flags(make_flags(drag, enter, exit)),
60
+ time(time)
61
+ {
62
+ }
63
+
64
+ uint make_flags (bool drag, bool enter, bool exit)
65
+ {
66
+ return
67
+ (drag ? DRAG : 0) |
68
+ (enter ? ENTER : 0) |
69
+ (exit ? EXIT : 0);
70
+ }
71
+
72
+ };// Pointer::Data
73
+
74
+
75
+ void
76
+ Pointer_update_positions (Pointer* pthis, std::function<void(Point*)> fun)
77
+ {
78
+ assert(pthis);
79
+
80
+ auto& self = pthis->self;
81
+ fun(&self->position);
82
+ if (self->prev)
83
+ fun(&self->prev->self->position);
84
+ }
85
+
86
+ void
87
+ Pointer_set_id (Pointer* pthis, Pointer::ID id)
88
+ {
89
+ pthis->self->id = id;
90
+ }
91
+
92
+ void
93
+ Pointer_set_prev (Pointer* pthis, const Pointer* prev)
94
+ {
95
+ if (prev)
96
+ pthis->self->prev.reset(new Pointer(*prev));
97
+ else
98
+ pthis->self->prev.reset();
99
+ }
100
+
101
+
102
+ Pointer::Pointer ()
103
+ {
104
+ }
105
+
106
+ Pointer::Pointer (
107
+ ID id, uint type, Action action,
108
+ const Point& position, uint modifiers, uint click_count, bool drag,
109
+ double time)
110
+ : self(new Data(
111
+ id, type, action,
112
+ position, modifiers, click_count, drag, false, false,
113
+ time))
114
+ {
115
+ }
116
+
117
+ Pointer::Pointer (const This& obj)
118
+ : self(new Data(*obj.self))
119
+ {
120
+ }
121
+
122
+ Pointer&
123
+ Pointer::operator = (const This& obj)
124
+ {
125
+ if (&obj == this) return *this;
126
+
127
+ *self = *obj.self;
128
+ return *this;
129
+ }
130
+
131
+ Pointer::~Pointer ()
132
+ {
133
+ }
134
+
135
+ Pointer::ID
136
+ Pointer::id () const
137
+ {
138
+ return self->id;
139
+ }
140
+
141
+ uint
142
+ Pointer::type () const
143
+ {
144
+ return self->type;
145
+ }
146
+
147
+ Pointer::Action
148
+ Pointer::action () const
149
+ {
150
+ return self->action;
151
+ }
152
+
153
+ const Point&
154
+ Pointer::position () const
155
+ {
156
+ return self->position;
157
+ }
158
+
159
+ uint
160
+ Pointer::modifiers () const
161
+ {
162
+ return self->modifiers;
163
+ }
164
+
165
+ uint
166
+ Pointer::click_count () const
167
+ {
168
+ return self->click_count;
169
+ }
170
+
171
+ bool
172
+ Pointer::is_drag () const
173
+ {
174
+ return self->flags & Data::DRAG;
175
+ }
176
+
177
+ double
178
+ Pointer::time () const
179
+ {
180
+ return self->time;
181
+ }
182
+
183
+ const Pointer*
184
+ Pointer::prev () const
185
+ {
186
+ return self->prev.get();
187
+ }
188
+
189
+ Pointer::operator bool () const
190
+ {
191
+ return
192
+ self->type != TYPE_NONE &&
193
+ ACTION_NONE < self->action && self->action <= STAY;
194
+ }
195
+
196
+ bool
197
+ Pointer::operator ! () const
198
+ {
199
+ return !operator bool();
200
+ }
201
+
202
+
203
+ }// Reflex
data/src/pointer.h ADDED
@@ -0,0 +1,26 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_POINTER_H__
4
+ #define __REFLEX_SRC_POINTER_H__
5
+
6
+
7
+ #include <functional>
8
+ #include <reflex/pointer.h>
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ void Pointer_update_positions (
16
+ Pointer* pthis, std::function<void(Point*)> fun);
17
+
18
+ void Pointer_set_id (Pointer* pthis, Pointer::ID id);
19
+
20
+ void Pointer_set_prev (Pointer* pthis, const Pointer* prev);
21
+
22
+
23
+ }// Reflex
24
+
25
+
26
+ #endif//EOH
data/src/selector.cpp CHANGED
@@ -139,7 +139,7 @@ namespace Reflex
139
139
  }
140
140
 
141
141
  bool
142
- Selector::is_empty () const
142
+ Selector::empty () const
143
143
  {
144
144
  return self->name.empty() && self->tags.empty();
145
145
  }