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.
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
data/lib/reflexion.rb CHANGED
@@ -18,7 +18,7 @@ module Reflexion
18
18
  }
19
19
 
20
20
 
21
- def call_event (event, *args, &block)
21
+ def call_event(event, *args, &block)
22
22
  $event = event
23
23
  Xot::BlockUtil.instance_eval_or_block_call *args, &block if block
24
24
  $event = nil
@@ -27,7 +27,7 @@ module Reflexion
27
27
 
28
28
  class App < Application
29
29
 
30
- def on_motion (e)
30
+ def on_motion(e)
31
31
  super
32
32
  call_event e, e, &$motion
33
33
  end
@@ -39,29 +39,29 @@ module Reflexion
39
39
 
40
40
  attr_reader :event
41
41
 
42
- def initialize (*args, &block)
42
+ def initialize(*args, &block)
43
43
  super
44
44
  $window = self
45
45
  call_event nil, self, &$setup
46
46
  end
47
47
 
48
- def on_update (e)
48
+ def on_update(e)
49
49
  super
50
50
  redraw
51
51
  call_event e, e, &$update
52
52
  end
53
53
 
54
- def on_draw (e)
54
+ def on_draw(e)
55
55
  super
56
56
  call_event e, e.painter, &$draw
57
57
  end
58
58
 
59
- def on_key (e)
59
+ def on_key(e)
60
60
  super
61
61
  call_event e, e, &$key
62
62
  end
63
63
 
64
- def on_pointer (e)
64
+ def on_pointer(e)
65
65
  super
66
66
  call_event e, e, &$pointer
67
67
  end
@@ -71,43 +71,43 @@ module Reflexion
71
71
 
72
72
  module_function
73
73
 
74
- def window ()
74
+ def window()
75
75
  $window ||= MainWindow.new DEFAULTS
76
76
  end
77
77
 
78
- def event ()
78
+ def event()
79
79
  $event
80
80
  end
81
81
 
82
- def setup (&block)
82
+ def setup(&block)
83
83
  $setup = block
84
84
  end
85
85
 
86
- def update (&block)
86
+ def update(&block)
87
87
  $update = block
88
88
  end
89
89
 
90
- def draw (&block)
90
+ def draw(&block)
91
91
  $draw = block
92
92
  end
93
93
 
94
- def key (&block)
94
+ def key(&block)
95
95
  $key = block
96
96
  end
97
97
 
98
- def pointer (&block)
98
+ def pointer(&block)
99
99
  $pointer = block
100
100
  end
101
101
 
102
- def motion (&block)
102
+ def motion(&block)
103
103
  $motion = block
104
104
  end
105
105
 
106
- def start ()
106
+ def start()
107
107
  App.new {window.show}.start
108
108
  end
109
109
 
110
- def quit ()
110
+ def quit()
111
111
  window.close
112
112
  end
113
113
 
data/reflex.gemspec CHANGED
@@ -26,12 +26,12 @@ Gem::Specification.new do |s|
26
26
  s.homepage = "https://github.com/xord/reflex"
27
27
 
28
28
  s.platform = Gem::Platform::RUBY
29
- s.required_ruby_version = '~> 2'
29
+ s.required_ruby_version = '>= 2.6.0'
30
30
 
31
- s.add_runtime_dependency 'xot', '~> 0.1.19'
32
- s.add_runtime_dependency 'rucy', '~> 0.1.18'
33
- s.add_runtime_dependency 'beeps', '~> 0.1.18'
34
- s.add_runtime_dependency 'rays', '~> 0.1.19'
31
+ s.add_runtime_dependency 'xot', '~> 0.1.23'
32
+ s.add_runtime_dependency 'rucy', '~> 0.1.23'
33
+ s.add_runtime_dependency 'beeps', '~> 0.1.23'
34
+ s.add_runtime_dependency 'rays', '~> 0.1.23'
35
35
 
36
36
  s.files = `git ls-files`.split $/
37
37
  s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
@@ -12,7 +12,7 @@ y = 0
12
12
 
13
13
  draw do
14
14
  stroke :white
15
- lines *(0..200).map {|x|
15
+ line *(0..200).map {|x|
16
16
  xx = x * 5
17
17
  yy = 200 + Rays.perlin(x / 10.0, y / 100.0) * 100
18
18
  [xx, yy]
data/samples/tree.rb CHANGED
@@ -48,7 +48,7 @@ class W < Reflex::Window
48
48
  end
49
49
 
50
50
  def on_pointer_move (e)
51
- $scroll = [-e.x.floor, -e.y.floor]
51
+ $scroll = [e.x.floor, e.y.floor]
52
52
  end
53
53
 
54
54
  end# W
data/src/event.cpp CHANGED
@@ -1,9 +1,11 @@
1
- #include "reflex/event.h"
1
+ #include "event.h"
2
2
 
3
3
 
4
4
  #include "reflex/timer.h"
5
5
  #include "reflex/shape.h"
6
6
  #include "reflex/exception.h"
7
+ #include "view.h"
8
+ #include "pointer.h"
7
9
 
8
10
 
9
11
  namespace Reflex
@@ -11,7 +13,7 @@ namespace Reflex
11
13
 
12
14
 
13
15
  Event::Event ()
14
- : blocked(false)
16
+ : blocked(false), time_(Xot::time())
15
17
  {
16
18
  }
17
19
 
@@ -27,6 +29,12 @@ namespace Reflex
27
29
  return blocked;
28
30
  }
29
31
 
32
+ double
33
+ Event::time () const
34
+ {
35
+ return time_;
36
+ }
37
+
30
38
 
31
39
  UpdateEvent::UpdateEvent (double now, float dt)
32
40
  : now(now), dt(dt)
@@ -123,76 +131,220 @@ namespace Reflex
123
131
 
124
132
 
125
133
  KeyEvent::KeyEvent ()
126
- : type(NONE), code(KEY_NONE), modifiers(MOD_NONE), repeat(0), capture(false)
134
+ : type(NONE), code(KEY_NONE), modifiers(MOD_NONE), repeat(0), captured(false)
127
135
  {
128
136
  }
129
137
 
130
138
  KeyEvent::KeyEvent (
131
139
  Type type, const char* chars, int code, uint modifiers, int repeat)
132
140
  : type(type), chars(chars ? chars : ""), code(code), modifiers(modifiers),
133
- repeat(repeat), capture(false)
141
+ repeat(repeat), captured(false)
134
142
  {
135
143
  }
136
144
 
137
145
 
138
- PointerEvent::PointerEvent ()
139
- : type(NONE), pointer_type(POINTER_NONE),
140
- size(0), modifiers(MOD_NONE), count(0), drag(false), capture(false),
141
- x(0), y(0), z(0)
146
+ struct PointerEvent::Data
147
+ {
148
+
149
+ std::vector<Pointer> pointers;
150
+
151
+ bool captured;
152
+
153
+ Data (bool captured = false)
154
+ : captured(captured)
155
+ {
156
+ }
157
+
158
+ };// PointerEvent::Data
159
+
160
+
161
+ void
162
+ PointerEvent_add_pointer (PointerEvent* pthis, const Pointer& pointer)
142
163
  {
164
+ if (!pthis)
165
+ argument_error(__FILE__, __LINE__);
166
+
167
+ pthis->self->pointers.emplace_back(pointer);
143
168
  }
144
169
 
145
- PointerEvent::PointerEvent (
146
- Type type, uint pointer_type, coord x, coord y, uint modifiers, uint count, bool drag)
147
- : type(type), pointer_type(pointer_type),
148
- size(1), modifiers(modifiers), count(count), drag(drag), capture(false),
149
- x(x), y(y), z(0)
170
+ void
171
+ PointerEvent_erase_pointer (PointerEvent* pthis, Pointer::ID id)
150
172
  {
173
+ if (!pthis)
174
+ argument_error(__FILE__, __LINE__);
175
+
176
+ auto& pointers = pthis->self->pointers;
177
+ auto it = std::find_if(
178
+ pointers.begin(), pointers.end(),
179
+ [=](const auto& pointer)
180
+ {
181
+ return pointer.id() == id;
182
+ });
183
+
184
+ if (it == pointers.end()) return;
185
+
186
+ pointers.erase(it);
151
187
  }
152
188
 
153
- PointerEvent::PointerEvent (
154
- Type type, uint pointer_type, const Point* positions_, size_t size,
155
- uint modifiers, uint count, bool drag)
156
- : type(type), pointer_type(pointer_type),
157
- size(size), modifiers(modifiers), count(count), drag(drag), capture(false)
189
+ Pointer&
190
+ PointerEvent_pointer_at (PointerEvent* pthis, size_t index)
158
191
  {
159
- if (!positions_ && size > 0)
192
+ if (!pthis)
160
193
  argument_error(__FILE__, __LINE__);
161
194
 
162
- if (size > MAX) size = MAX;
195
+ auto& pointers = pthis->self->pointers;
196
+ if (index >= pointers.size())
197
+ index_error(__FILE__, __LINE__);
163
198
 
164
- if (positions_)
199
+ return pointers[index];
200
+ }
201
+
202
+ void
203
+ PointerEvent_each_pointer (
204
+ const PointerEvent* pthis, std::function<void(const Pointer&)> fun)
205
+ {
206
+ if (!pthis)
207
+ argument_error(__FILE__, __LINE__);
208
+
209
+ for (const auto& pointer : pthis->self->pointers)
210
+ fun(pointer);
211
+ }
212
+
213
+ static void
214
+ filter_and_offset_pointer_positions (PointerEvent* event, const Bounds& frame)
215
+ {
216
+ assert(event);
217
+
218
+ const Point& offset = frame.position();
219
+
220
+ std::vector<Pointer> pointers;
221
+ for (const auto& pointer : event->self->pointers)
165
222
  {
166
- for (size_t i = 0; i < size; ++i)
167
- positions[i] = *(Coord3*) &positions_[i];
223
+ if (!frame.is_include(pointer.position()))
224
+ continue;
225
+
226
+ pointers.emplace_back(pointer);
227
+ Pointer_update_positions(&pointers.back(), [&](Point* pos)
228
+ {
229
+ *pos -= offset;
230
+ });
168
231
  }
232
+
233
+ event->self->pointers = pointers;
169
234
  }
170
235
 
171
- Point&
172
- PointerEvent::position (size_t i)
236
+ static void
237
+ scroll_and_zoom_pointer_positions (
238
+ PointerEvent* event, const Point& scroll, float zoom)
173
239
  {
174
- if (i >= size)
175
- index_error(__FILE__, __LINE__);
240
+ assert(event);
241
+
242
+ if (zoom == 0)
243
+ argument_error(__FILE__, __LINE__);
244
+
245
+ if (scroll == 0 && zoom == 1)
246
+ return;
176
247
 
177
- return *(Point*) &positions[i];
248
+ for (auto& pointer : event->self->pointers)
249
+ {
250
+ Pointer_update_positions(&pointer, [=](Point* pos)
251
+ {
252
+ *pos -= scroll;
253
+ *pos /= zoom;
254
+ });
255
+ }
178
256
  }
179
257
 
180
- const Point&
181
- PointerEvent::position (size_t i) const
258
+ void
259
+ PointerEvent_update_for_child_view (PointerEvent* pthis, const View* view)
182
260
  {
183
- return const_cast<PointerEvent*>(this)->position(i);
261
+ if (!pthis || !view)
262
+ argument_error(__FILE__, __LINE__);
263
+
264
+ filter_and_offset_pointer_positions(pthis, view->frame());
265
+ scroll_and_zoom_pointer_positions(pthis, view->scroll(), view->zoom());
184
266
  }
185
267
 
186
- Point&
187
- PointerEvent::operator [] (size_t i)
268
+ void
269
+ PointerEvent_update_for_capturing_view (PointerEvent* pthis, const View* view)
188
270
  {
189
- return position(i);
271
+ if (!pthis || !view)
272
+ argument_error(__FILE__, __LINE__);
273
+
274
+ for (auto& pointer : pthis->self->pointers)
275
+ {
276
+ Pointer_update_positions(&pointer, [=](Point* pos)
277
+ {
278
+ *pos = view->from_window(*pos);
279
+ });
280
+ }
281
+
282
+ scroll_and_zoom_pointer_positions(pthis, view->scroll(), view->zoom());
190
283
  }
191
284
 
192
- const Point&
193
- PointerEvent::operator [] (size_t i) const
285
+
286
+ PointerEvent::PointerEvent (bool captured)
287
+ : self(new Data(captured))
288
+ {
289
+ }
290
+
291
+ PointerEvent::PointerEvent (const Pointer& pointer, bool captured)
292
+ : self(new Data(captured))
293
+ {
294
+ self->pointers.emplace_back(pointer);
295
+ }
296
+
297
+ PointerEvent::PointerEvent (const Pointer* pointers, size_t size, bool captured)
298
+ : self(new Data(captured))
299
+ {
300
+ for (size_t i = 0; i < size; ++i)
301
+ self->pointers.emplace_back(pointers[i]);
302
+ }
303
+
304
+ PointerEvent::PointerEvent (const This& obj)
305
+ : self(new Data(*obj.self))
306
+ {
307
+ }
308
+
309
+ PointerEvent&
310
+ PointerEvent::operator = (const This& obj)
311
+ {
312
+ if (&obj == this) return *this;
313
+
314
+ Event::operator=(obj);
315
+ *self = *obj.self;
316
+ return *this;
317
+ }
318
+
319
+ PointerEvent::~PointerEvent ()
194
320
  {
195
- return position(i);
321
+ }
322
+
323
+ size_t
324
+ PointerEvent::size () const
325
+ {
326
+ return self->pointers.size();
327
+ }
328
+
329
+ bool
330
+ PointerEvent::empty () const
331
+ {
332
+ return size() == 0;
333
+ }
334
+
335
+ bool
336
+ PointerEvent::is_captured () const
337
+ {
338
+ return self->captured;
339
+ }
340
+
341
+ const Pointer&
342
+ PointerEvent::operator [] (size_t index) const
343
+ {
344
+ if (index >= self->pointers.size())
345
+ index_error(__FILE__, __LINE__);
346
+
347
+ return self->pointers[index];
196
348
  }
197
349
 
198
350
 
data/src/event.h ADDED
@@ -0,0 +1,32 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_EVENT_H__
4
+ #define __REFLEX_SRC_EVENT_H__
5
+
6
+
7
+ #include <functional>
8
+ #include <reflex/event.h>
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ void PointerEvent_add_pointer (PointerEvent* pthis, const Pointer& pointer);
16
+
17
+ void PointerEvent_erase_pointer (PointerEvent* pthis, Pointer::ID id);
18
+
19
+ Pointer& PointerEvent_pointer_at (PointerEvent* pthis, size_t index);
20
+
21
+ void PointerEvent_each_pointer (
22
+ const PointerEvent* pthis, std::function<void(const Pointer&)> fun);
23
+
24
+ void PointerEvent_update_for_child_view (PointerEvent* pthis, const View* view);
25
+
26
+ void PointerEvent_update_for_capturing_view (PointerEvent* pthis, const View* view);
27
+
28
+
29
+ }// Reflex
30
+
31
+
32
+ #endif//EOH
data/src/ios/event.h CHANGED
@@ -4,18 +4,30 @@
4
4
  #define __REFLEX_SRC_IOS_EVENT_H__
5
5
 
6
6
 
7
+ #include <list>
7
8
  #import <UIKit/UIEvent.h>
8
- #include <reflex/event.h>
9
+ #include "../event.h"
9
10
 
10
11
 
11
12
  namespace Reflex
12
13
  {
13
14
 
14
15
 
15
- struct NativePointerEvent : public PointerEvent
16
+ typedef std::list<Pointer> PrevPointerList;
17
+
18
+
19
+ class NativePointerEvent : public PointerEvent
16
20
  {
17
21
 
18
- NativePointerEvent (NSSet* touches, UIEvent* event, UIView* view, Type type);
22
+ public:
23
+
24
+ NativePointerEvent (
25
+ NSSet* touches, UIEvent* event, UIView* view,
26
+ Pointer::ID* pointer_id);
27
+
28
+ NativePointerEvent (
29
+ NSSet* touches, UIEvent* event, UIView* view,
30
+ PrevPointerList* prev_pointers);
19
31
 
20
32
  };// NativePointerEvent
21
33
 
data/src/ios/event.mm CHANGED
@@ -3,30 +3,145 @@
3
3
 
4
4
 
5
5
  #include <assert.h>
6
+ #include <algorithm>
7
+ #include "../pointer.h"
6
8
 
7
9
 
8
10
  namespace Reflex
9
11
  {
10
12
 
11
13
 
12
- static CGPoint
13
- correct_point (UIView* view, UITouch* touch)
14
+ static uint
15
+ get_type (UITouch* touch)
14
16
  {
15
- assert(view && touch);
16
- return [touch locationInView: view];
17
+ assert(touch);
18
+
19
+ NSInteger type = 0;
20
+ if (@available(iOS 9.0, *)) type = touch.type;
21
+
22
+ switch (type)
23
+ {
24
+ case UITouchTypeDirect: return Pointer::TOUCH;
25
+ case UITouchTypePencil: return Pointer::PEN;
26
+ default: return Pointer::TYPE_NONE;
27
+ }
28
+ }
29
+
30
+ static Pointer::Action
31
+ get_action (UITouch* touch)
32
+ {
33
+ assert(touch);
34
+
35
+ switch (touch.phase)
36
+ {
37
+ case UITouchPhaseBegan: return Pointer::DOWN;
38
+ case UITouchPhaseEnded: return Pointer::UP;
39
+ case UITouchPhaseMoved: return Pointer::MOVE;
40
+ case UITouchPhaseStationary: return Pointer::STAY;
41
+ case UITouchPhaseCancelled: return Pointer::CANCEL;
42
+ //case UITouchPhaseRegionEntered: return Pointer::MOVE;
43
+ //case UITouchPhaseRegionExited: return Pointer::MOVE;
44
+ //case UITouchPhaseRegionMoved: return Pointer::MOVE;
45
+ default: return Pointer::ACTION_NONE;
46
+ }
47
+ }
48
+
49
+ static Point
50
+ to_point (const CGPoint& point)
51
+ {
52
+ return Point(point.x, point.y);
53
+ }
54
+
55
+ static uint
56
+ get_modifiers (const UIEvent* event)
57
+ {
58
+ assert(event);
59
+
60
+ NSInteger flags = 0;
61
+ if (@available(iOS 13.4, *)) flags = event.modifierFlags;
62
+
63
+ return
64
+ (flags & UIKeyModifierAlphaShift) ? MOD_CAPS : 0 |
65
+ (flags & UIKeyModifierShift) ? MOD_SHIFT : 0 |
66
+ (flags & UIKeyModifierControl) ? MOD_CONTROL : 0 |
67
+ (flags & UIKeyModifierAlternate) ? MOD_ALT : 0 |
68
+ (flags & UIKeyModifierCommand) ? MOD_COMMAND : 0 |
69
+ (flags & UIKeyModifierNumericPad) ? MOD_NUMPAD : 0;
70
+ }
71
+
72
+ static void
73
+ attach_prev_pointer (
74
+ Pointer* pointer, PrevPointerList* prev_pointers, const Point& prev_position)
75
+ {
76
+ assert(pointer && prev_pointers);
77
+
78
+ auto it = std::find_if(
79
+ prev_pointers->begin(), prev_pointers->end(),
80
+ [&](const Reflex::Pointer& p) {return p.position() == prev_position;});
81
+
82
+ if (it != prev_pointers->end())
83
+ {
84
+ Reflex::Pointer_set_prev(pointer, &*it);
85
+ prev_pointers->erase(it);
86
+ }
87
+ else if (prev_pointers->size() == 1)
88
+ {
89
+ Reflex::Pointer_set_prev(pointer, &prev_pointers->front());
90
+ prev_pointers->clear();
91
+ }
92
+ else
93
+ Reflex::Pointer_set_prev(pointer, NULL);
94
+
95
+ if (pointer->prev())
96
+ Reflex::Pointer_set_id(pointer, pointer->prev()->id());
17
97
  }
18
98
 
99
+ static Pointer
100
+ create_pointer (
101
+ UITouch* touch, UIEvent* event, UIView* view, double time,
102
+ Pointer::ID pointer_id, PrevPointerList* prev_pointers)
103
+ {
104
+ Reflex::Pointer::Action action = get_action(touch);
105
+ Reflex::Pointer pointer(
106
+ pointer_id,
107
+ get_type(touch),
108
+ action,
109
+ to_point([touch locationInView: view]),
110
+ get_modifiers(event),
111
+ (uint) touch.tapCount,
112
+ action == Pointer::MOVE,
113
+ time);
114
+
115
+ if (prev_pointers)
116
+ {
117
+ attach_prev_pointer(
118
+ &pointer, prev_pointers,
119
+ to_point([touch previousLocationInView: view]));
120
+ }
121
+
122
+ return pointer;
123
+ }
124
+
125
+ NativePointerEvent::NativePointerEvent (
126
+ NSSet* touches, UIEvent* event, UIView* view,
127
+ Pointer::ID* pointer_id)
128
+ {
129
+ for (UITouch* touch in touches)
130
+ {
131
+ PointerEvent_add_pointer(
132
+ this, create_pointer(touch, event, view, time(), ++*pointer_id, NULL));
133
+ }
134
+ }
19
135
 
20
136
  NativePointerEvent::NativePointerEvent (
21
- NSSet* touches, UIEvent* e, UIView* view, Type type)
22
- : PointerEvent(type, POINTER_TOUCH, (coord) 0, (coord) 0, 0, 1, type == MOVE)
137
+ NSSet* touches, UIEvent* event, UIView* view,
138
+ PrevPointerList* prev_pointers)
23
139
  {
24
- int index = 0;
25
- for (UITouch* touch in touches) {
26
- CGPoint p = correct_point(view, touch);
27
- positions[index++].reset(p.x, p.y);
140
+ for (UITouch* touch in touches)
141
+ {
142
+ PointerEvent_add_pointer(
143
+ this, create_pointer(touch, event, view, time(), 0, prev_pointers));
28
144
  }
29
- size = index;
30
145
  }
31
146
 
32
147