reflexion 0.1.34 → 0.1.36

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/frame_event.cpp +27 -2
  3. data/.doc/ext/reflex/view.cpp +25 -0
  4. data/.github/workflows/utils.rb +2 -1
  5. data/ChangeLog.md +15 -0
  6. data/Rakefile +1 -1
  7. data/VERSION +1 -1
  8. data/ext/reflex/extconf.rb +0 -3
  9. data/ext/reflex/frame_event.cpp +33 -5
  10. data/ext/reflex/view.cpp +28 -0
  11. data/include/reflex/event.h +10 -2
  12. data/include/reflex/ruby/view.h +9 -0
  13. data/include/reflex/view.h +12 -4
  14. data/lib/reflex/application.rb +2 -3
  15. data/lib/reflex/autoinit.rb +0 -3
  16. data/lib/reflex/bitmap.rb +0 -3
  17. data/lib/reflex/bounds.rb +0 -3
  18. data/lib/reflex/button.rb +0 -3
  19. data/lib/reflex/camera.rb +0 -3
  20. data/lib/reflex/capture_event.rb +0 -3
  21. data/lib/reflex/color.rb +0 -3
  22. data/lib/reflex/color_space.rb +0 -3
  23. data/lib/reflex/contact_event.rb +0 -3
  24. data/lib/reflex/draw_event.rb +0 -3
  25. data/lib/reflex/ellipse_shape.rb +0 -3
  26. data/lib/reflex/ext.rb +0 -3
  27. data/lib/reflex/extension.rb +0 -3
  28. data/lib/reflex/filter.rb +0 -3
  29. data/lib/reflex/fixture.rb +0 -3
  30. data/lib/reflex/focus_event.rb +0 -3
  31. data/lib/reflex/font.rb +0 -3
  32. data/lib/reflex/frame_event.rb +2 -4
  33. data/lib/reflex/helper.rb +0 -3
  34. data/lib/reflex/image.rb +0 -3
  35. data/lib/reflex/image_view.rb +0 -3
  36. data/lib/reflex/key_event.rb +0 -3
  37. data/lib/reflex/line_shape.rb +0 -3
  38. data/lib/reflex/list_view.rb +0 -3
  39. data/lib/reflex/matrix.rb +0 -3
  40. data/lib/reflex/model.rb +0 -3
  41. data/lib/reflex/model_owner.rb +0 -3
  42. data/lib/reflex/model_view.rb +0 -3
  43. data/lib/reflex/painter.rb +0 -3
  44. data/lib/reflex/point.rb +0 -3
  45. data/lib/reflex/pointer.rb +0 -3
  46. data/lib/reflex/pointer_event.rb +0 -3
  47. data/lib/reflex/polygon.rb +0 -3
  48. data/lib/reflex/polygon_shape.rb +0 -3
  49. data/lib/reflex/polyline.rb +0 -3
  50. data/lib/reflex/rect_shape.rb +0 -3
  51. data/lib/reflex/reflex.rb +0 -3
  52. data/lib/reflex/scroll_event.rb +0 -3
  53. data/lib/reflex/selector.rb +0 -3
  54. data/lib/reflex/shader.rb +0 -3
  55. data/lib/reflex/shape.rb +0 -3
  56. data/lib/reflex/style.rb +0 -3
  57. data/lib/reflex/style_length.rb +0 -3
  58. data/lib/reflex/text_view.rb +0 -3
  59. data/lib/reflex/timer.rb +0 -3
  60. data/lib/reflex/timer_event.rb +0 -3
  61. data/lib/reflex/update_event.rb +0 -3
  62. data/lib/reflex/view.rb +10 -4
  63. data/lib/reflex/wheel_event.rb +0 -3
  64. data/lib/reflex/window.rb +2 -3
  65. data/lib/reflex.rb +0 -3
  66. data/lib/reflexion/include.rb +0 -3
  67. data/lib/reflexion.rb +0 -3
  68. data/reflex.gemspec +5 -5
  69. data/samples/app.rb +0 -3
  70. data/samples/bats.rb +0 -3
  71. data/samples/camera.rb +0 -3
  72. data/samples/checker.rb +0 -3
  73. data/samples/fans.rb +0 -3
  74. data/samples/fps.rb +0 -3
  75. data/samples/grid.rb +0 -3
  76. data/samples/hello.rb +0 -3
  77. data/samples/image.rb +0 -3
  78. data/samples/key.rb +0 -3
  79. data/samples/layout.rb +0 -3
  80. data/samples/model.rb +0 -3
  81. data/samples/physics.rb +0 -3
  82. data/samples/reflexion/breakout.rb +0 -3
  83. data/samples/reflexion/hello.rb +0 -3
  84. data/samples/reflexion/jump_action.rb +0 -3
  85. data/samples/reflexion/noise.rb +0 -3
  86. data/samples/reflexion/paint.rb +0 -3
  87. data/samples/reflexion/physics.rb +0 -3
  88. data/samples/reflexion/pulse.rb +0 -3
  89. data/samples/repl.rb +0 -3
  90. data/samples/shader.rb +0 -3
  91. data/samples/shapes.rb +0 -3
  92. data/samples/text.rb +0 -3
  93. data/samples/tree.rb +0 -3
  94. data/samples/views.rb +0 -3
  95. data/samples/visuals.rb +0 -3
  96. data/src/body.cpp +14 -0
  97. data/src/body.h +4 -0
  98. data/src/event.cpp +54 -32
  99. data/src/osx/native_window.mm +1 -1
  100. data/src/view.cpp +136 -61
  101. data/src/window.cpp +4 -2
  102. data/test/helper.rb +0 -3
  103. data/test/test_application.rb +4 -3
  104. data/test/test_capture_event.rb +0 -3
  105. data/test/test_contact_event.rb +0 -3
  106. data/test/test_draw_event.rb +0 -3
  107. data/test/test_event.rb +1 -4
  108. data/test/test_focus_event.rb +0 -3
  109. data/test/test_frame_event.rb +22 -7
  110. data/test/test_has_frame.rb +0 -3
  111. data/test/test_key_event.rb +0 -3
  112. data/test/test_model.rb +0 -3
  113. data/test/test_model_owner.rb +0 -3
  114. data/test/test_pointer.rb +0 -3
  115. data/test/test_pointer_event.rb +0 -3
  116. data/test/test_reflex_init.rb +0 -3
  117. data/test/test_scroll_event.rb +0 -3
  118. data/test/test_selector.rb +0 -3
  119. data/test/test_shape.rb +0 -3
  120. data/test/test_style.rb +0 -3
  121. data/test/test_style_length.rb +0 -3
  122. data/test/test_timer_event.rb +0 -3
  123. data/test/test_update_event.rb +0 -3
  124. data/test/test_view.rb +37 -3
  125. data/test/test_wheel_event.rb +0 -3
  126. data/test/test_window.rb +4 -3
  127. metadata +10 -11
  128. data/task/box2d.rake +0 -46
data/src/event.cpp CHANGED
@@ -26,10 +26,10 @@ namespace Reflex
26
26
  {
27
27
  }
28
28
 
29
- void block ()
29
+ void block (bool parent)
30
30
  {
31
31
  blocked = true;
32
- if (parent) parent->block();
32
+ if (parent && this->parent) this->parent->block(true);
33
33
  }
34
34
 
35
35
  };// Event::Data
@@ -50,9 +50,9 @@ namespace Reflex
50
50
  }
51
51
 
52
52
  void
53
- Event::block ()
53
+ Event::block (bool parent)
54
54
  {
55
- self->block();
55
+ self->block(parent);
56
56
  }
57
57
 
58
58
  bool
@@ -221,13 +221,17 @@ namespace Reflex
221
221
 
222
222
  coord dx, dy, dw, dh;
223
223
 
224
+ float zoom, dzoom;
225
+
224
226
  float angle, dangle;
225
227
 
226
228
  Data (
227
229
  const Bounds& frame = 0,
228
230
  coord dx = 0, coord dy = 0, coord dw = 0, coord dh = 0,
231
+ float zoom = 0, float dzoom = 0,
229
232
  float angle = 0, float dangle = 0)
230
- : frame(frame), dx(dx), dy(dy), dw(dw), dh(dh), angle(angle), dangle(dangle)
233
+ : frame(frame), dx(dx), dy(dy), dw(dw), dh(dh),
234
+ zoom(zoom), dzoom(dzoom), angle(angle), dangle(dangle)
231
235
  {
232
236
  }
233
237
 
@@ -240,18 +244,19 @@ namespace Reflex
240
244
 
241
245
  FrameEvent::FrameEvent (
242
246
  const Bounds& frame, coord dx, coord dy, coord dwidth, coord dheight,
243
- float angle, float dangle)
244
- : self(new Data(frame, dx, dy, dwidth, dheight, angle, dangle))
247
+ float zoom, float dzoom, float angle, float dangle)
248
+ : self(new Data(frame, dx, dy, dwidth, dheight, zoom, dzoom, angle, dangle))
245
249
  {
246
250
  }
247
251
 
248
252
  FrameEvent::FrameEvent (
249
253
  const Bounds& frame, const Bounds& prev_frame,
250
- float angle, float prev_angle)
254
+ float zoom, float prev_zoom, float angle, float prev_angle)
251
255
  : self(new Data(
252
256
  frame,
253
257
  frame.x - prev_frame.x, frame.y - prev_frame.y,
254
258
  frame.w - prev_frame.w, frame.h - prev_frame.h,
259
+ zoom, zoom - prev_zoom,
255
260
  angle, angle - prev_angle))
256
261
  {
257
262
  }
@@ -297,6 +302,18 @@ namespace Reflex
297
302
  return self->dh;
298
303
  }
299
304
 
305
+ float
306
+ FrameEvent::zoom () const
307
+ {
308
+ return self->zoom;
309
+ }
310
+
311
+ float
312
+ FrameEvent::dzoom () const
313
+ {
314
+ return self->dzoom;
315
+ }
316
+
300
317
  float
301
318
  FrameEvent::angle () const
302
319
  {
@@ -321,6 +338,12 @@ namespace Reflex
321
338
  return self->dw != 0 || self->dh != 0;
322
339
  }
323
340
 
341
+ bool
342
+ FrameEvent::is_zoom () const
343
+ {
344
+ return self->dzoom != 0;
345
+ }
346
+
324
347
  bool
325
348
  FrameEvent::is_rotate () const
326
349
  {
@@ -611,29 +634,6 @@ namespace Reflex
611
634
  pthis->self->captured = captured;
612
635
  }
613
636
 
614
- static void
615
- filter_and_offset_pointer_positions (PointerEvent* event, const Bounds& frame)
616
- {
617
- assert(event);
618
-
619
- const Point& offset = frame.position();
620
-
621
- std::vector<Pointer> pointers;
622
- for (const auto& pointer : event->self->pointers)
623
- {
624
- if (!frame.is_include(pointer.position()))
625
- continue;
626
-
627
- pointers.emplace_back(pointer);
628
- Pointer_update_positions(&pointers.back(), [&](Point* pos)
629
- {
630
- *pos -= offset;
631
- });
632
- }
633
-
634
- event->self->pointers = pointers;
635
- }
636
-
637
637
  static void
638
638
  scroll_and_zoom_pointer_positions (
639
639
  PointerEvent* event, const Point& scroll, float zoom)
@@ -662,7 +662,26 @@ namespace Reflex
662
662
  if (!pthis || !view)
663
663
  argument_error(__FILE__, __LINE__);
664
664
 
665
- filter_and_offset_pointer_positions(pthis, view->frame());
665
+ const Bounds& frame = view->frame();
666
+ const Point& offset = frame.position();
667
+ Bounds bounds = frame.dup().move_to(0, 0);
668
+ float angle = view->angle();
669
+
670
+ std::vector<Pointer> pointers;
671
+ for (const auto& pointer : pthis->self->pointers)
672
+ {
673
+ pointers.emplace_back(pointer);
674
+ Pointer_update_positions(&pointers.back(), [&](Point* pos)
675
+ {
676
+ *pos -= offset;
677
+ pos->rotate(-angle);
678
+ });
679
+
680
+ if (!bounds.is_include(pointers.back().position()))
681
+ pointers.pop_back();
682
+ }
683
+ pthis->self->pointers = pointers;
684
+
666
685
  scroll_and_zoom_pointer_positions(pthis, view->scroll(), view->zoom());
667
686
  }
668
687
 
@@ -672,11 +691,14 @@ namespace Reflex
672
691
  if (!pthis || !view)
673
692
  argument_error(__FILE__, __LINE__);
674
693
 
694
+ float angle = view->angle();
695
+
675
696
  for (auto& pointer : pthis->self->pointers)
676
697
  {
677
698
  Pointer_update_positions(&pointer, [=](Point* pos)
678
699
  {
679
700
  *pos = view->from_window(*pos);
701
+ pos->rotate(-angle);
680
702
  });
681
703
  }
682
704
 
@@ -288,7 +288,7 @@ update_pixel_density (Reflex::Window* window)
288
288
 
289
289
  if (dpos != 0 || dsize != 0)
290
290
  {
291
- Reflex::FrameEvent e(b, dpos.x, dpos.y, dsize.x, dsize.y, 0, 0);
291
+ Reflex::FrameEvent e(b, dpos.x, dpos.y, dsize.x, dsize.y);
292
292
  if (dpos != 0) win->on_move(&e);
293
293
  if (dsize != 0)
294
294
  {
data/src/view.cpp CHANGED
@@ -4,6 +4,7 @@
4
4
  #include <assert.h>
5
5
  #include <memory>
6
6
  #include <algorithm>
7
+ #include <rays/matrix.h>
7
8
  #include "reflex/timer.h"
8
9
  #include "reflex/filter.h"
9
10
  #include "reflex/exception.h"
@@ -25,6 +26,8 @@ namespace Reflex
25
26
 
26
27
  static const char* WALL_NAME = "__WALL__";
27
28
 
29
+ static const Point ZERO = 0;
30
+
28
31
 
29
32
  struct View::Data
30
33
  {
@@ -52,19 +55,23 @@ namespace Reflex
52
55
 
53
56
  };// Flag
54
57
 
55
- Window* window;
58
+ Window* window = NULL;
56
59
 
57
- View* parent;
60
+ View* parent = NULL;
58
61
 
59
62
  Bounds frame;
60
63
 
61
- float zoom, angle;
64
+ float zoom = 1;
65
+
66
+ float angle = 0;
67
+
68
+ ushort capture = CAPTURE_NONE;
62
69
 
63
- ushort capture;
70
+ short hide_count = 0;
64
71
 
65
- short hide_count;
72
+ uint flags = FLAG_CLIP | FLAG_RESIZE_TO_FIT | REDRAW | UPDATE_LAYOUT | UPDATE_STYLE;
66
73
 
67
- uint flags;
74
+ std::unique_ptr<Point> ppivot;
68
75
 
69
76
  std::unique_ptr<Point> pscroll;
70
77
 
@@ -92,15 +99,10 @@ namespace Reflex
92
99
 
93
100
  std::unique_ptr<ChildList> pchildren;
94
101
 
95
- Data ()
96
- : window(NULL), parent(NULL),
97
- zoom(1), angle(0), capture(CAPTURE_NONE), hide_count(0),
98
- flags(FLAG_CLIP | FLAG_RESIZE_TO_FIT | REDRAW | UPDATE_LAYOUT | UPDATE_STYLE)
99
- {
100
- }
101
-
102
- ~Data ()
102
+ Point& pivot ()
103
103
  {
104
+ if (!ppivot) ppivot.reset(new Point);
105
+ return *ppivot;
104
106
  }
105
107
 
106
108
  Point& scroll ()
@@ -204,7 +206,40 @@ namespace Reflex
204
206
  {
205
207
  if (!pbody) return;
206
208
 
207
- pbody->set_transform(frame.x, frame.y, angle);
209
+ auto* pivot = ppivot.get();
210
+ if (pivot && (pivot->x != 0 || pivot->y != 0) && angle != 0)
211
+ {
212
+ Matrix m;
213
+ get_view2body_matrix(&m);
214
+ pbody->set_transform(m * Point(0), angle);
215
+ }
216
+ else
217
+ pbody->set_transform(frame.x, frame.y, angle);
218
+ }
219
+
220
+ void
221
+ get_view2body_matrix (Matrix* m)
222
+ {
223
+ assert(m && *m == 1 && ppivot && *ppivot != 0);
224
+
225
+ Point pivot = *ppivot * frame.size();
226
+ m->translate(frame.position() + pivot)
227
+ .rotate(angle)
228
+ .translate(-pivot);
229
+ }
230
+
231
+ void
232
+ get_body2view_matrix (Matrix* m)
233
+ {
234
+ assert(m && *m == 1 && ppivot && *ppivot != 0 && pbody);
235
+
236
+ Point pivot = *ppivot * frame.size();
237
+ float angle = pbody->angle();
238
+ m->translate(pbody->position())
239
+ .rotate(angle)
240
+ .translate( pivot)
241
+ .rotate(-angle)
242
+ .translate(-pivot);
208
243
  }
209
244
 
210
245
  void update_body_and_shapes ()
@@ -654,37 +689,41 @@ namespace Reflex
654
689
 
655
690
  static void
656
691
  update_view_frame (
657
- View* view, const Bounds& frame, float angle, bool update_body)
692
+ View* view, const Bounds& frame, float zoom, float angle,
693
+ bool update_body = true)
658
694
  {
659
695
  assert(view);
660
696
  View::Data* self = view->self.get();
661
697
 
662
- if (frame == self->frame && angle == self->angle)
698
+ if (frame == self->frame && zoom == self->zoom && angle == self->angle)
663
699
  return;
664
700
 
665
- FrameEvent event(frame, self->frame, angle, self->angle);
701
+ FrameEvent event(frame, self->frame, zoom, self->zoom, angle, self->angle);
666
702
  self->frame = frame;
703
+ self->zoom = zoom;
667
704
  self->angle = angle;
668
705
 
669
- bool move = event.is_move();
670
- bool resize = event.is_resize();
671
- bool rotate = event.is_rotate();
706
+ bool moved = event.is_move();
707
+ bool resized = event.is_resize();
708
+ bool zoomed = event.is_zoom();
709
+ bool rotated = event.is_rotate();
672
710
 
673
- if (move) view->on_move(&event);
674
- if (resize) view->on_resize(&event);
675
- if (rotate) view->on_rotate(&event);
711
+ if (moved) view->on_move(&event);
712
+ if (resized) view->on_resize(&event);
713
+ if (zoomed) view->on_zoom(&event);
714
+ if (rotated) view->on_rotate(&event);
676
715
 
677
- if (resize)
716
+ if (resized)
678
717
  {
679
718
  view->self->resize_shapes(&event);
680
719
  apply_style_to_children_have_variable_lengths(view);
681
720
  update_view_layout(view, true);
682
721
  }
683
722
 
684
- if (update_body && (move || rotate) && self->pbody)
723
+ if (update_body && (moved || rotated) && self->pbody)
685
724
  self->update_body_frame();
686
725
 
687
- if ((move || resize) && self->parent)
726
+ if ((moved || resized) && self->parent)
688
727
  self->parent->self->add_flag(View::Data::FIT_TO_CONTENT);
689
728
 
690
729
  view->redraw();
@@ -696,7 +735,7 @@ namespace Reflex
696
735
  if (!view)
697
736
  argument_error(__FILE__, __LINE__);
698
737
 
699
- update_view_frame(view, frame, view->self->angle, true);
738
+ update_view_frame(view, frame, view->zoom(), view->angle());
700
739
  }
701
740
 
702
741
  const Style&
@@ -802,13 +841,24 @@ namespace Reflex
802
841
  update_view_body (View* view)
803
842
  {
804
843
  assert(view);
844
+ View::Data* self = view->self.get();
805
845
 
806
- Body* body = view->self->pbody.get();
846
+ Body* body = self->pbody.get();
807
847
  if (!body) return;
808
848
 
809
849
  Bounds frame = view->frame();
810
- frame.move_to(body->position());
811
- update_view_frame(view, frame, body->angle(), false);
850
+
851
+ auto* pivot = self->ppivot.get();
852
+ if (pivot && (pivot->x != 0 || pivot->y != 0) && self->angle != 0)
853
+ {
854
+ Matrix m;
855
+ self->get_body2view_matrix(&m);
856
+ frame.set_position(m * Point(0));
857
+ }
858
+ else
859
+ frame.set_position(body->position());
860
+
861
+ update_view_frame(view, frame, view->zoom(), body->angle(), false);
812
862
  }
813
863
 
814
864
  static void
@@ -1088,7 +1138,7 @@ namespace Reflex
1088
1138
 
1089
1139
  if (event->is_blocked()) return;
1090
1140
 
1091
- View::ChildList* pchildren = view->self->pchildren.get();
1141
+ View::ChildList* pchildren = self->pchildren.get();
1092
1142
  if (pchildren)
1093
1143
  {
1094
1144
  for (auto& pchild : *pchildren)
@@ -1098,7 +1148,7 @@ namespace Reflex
1098
1148
  }
1099
1149
  }
1100
1150
 
1101
- World* child_world = view->self->pchild_world.get();
1151
+ World* child_world = self->pchild_world.get();
1102
1152
  if (child_world)
1103
1153
  {
1104
1154
  p->push_state();
@@ -1182,7 +1232,7 @@ namespace Reflex
1182
1232
  Point pos = bounds.position();
1183
1233
  Bounds clip2 = bounds.dup().move_by(offset) & clip;
1184
1234
 
1185
- bounds.move_to(0, 0, bounds.z);
1235
+ bounds.set_position(0, 0, bounds.z);
1186
1236
  if (self->pscroll)
1187
1237
  {
1188
1238
  bounds.move_by(-*self->pscroll);
@@ -1193,9 +1243,13 @@ namespace Reflex
1193
1243
  p->push_matrix();
1194
1244
  p->translate(pos);
1195
1245
 
1196
- float angle = self->angle;
1197
- if (angle != 0)
1198
- p->rotate(angle);
1246
+ if (self->angle != 0)
1247
+ {
1248
+ const Point* pivot = self->ppivot.get();
1249
+ if (pivot) p->translate( pivot->x * bounds.width, pivot->y * bounds.height);
1250
+ p->rotate(self->angle);
1251
+ if (pivot) p->translate(-pivot->x * bounds.width, -pivot->y * bounds.height);
1252
+ }
1199
1253
 
1200
1254
  float zoom = self->zoom;
1201
1255
  if (zoom != 1 && zoom > 0)
@@ -1290,6 +1344,9 @@ namespace Reflex
1290
1344
  {
1291
1345
  assert(view && event);
1292
1346
 
1347
+ if (view->self->pbody)
1348
+ view->self->pbody->awake();
1349
+
1293
1350
  view->on_pointer(event);
1294
1351
 
1295
1352
  switch ((*event)[0].action())
@@ -2045,10 +2102,28 @@ namespace Reflex
2045
2102
  self->add_flag(View::Data::FIT_TO_CONTENT);
2046
2103
  }
2047
2104
 
2105
+ void
2106
+ View::set_zoom (float zoom)
2107
+ {
2108
+ if (zoom == self->zoom) return;
2109
+
2110
+ if (zoom == 0)
2111
+ argument_error(__FILE__, __LINE__);
2112
+
2113
+ update_view_frame(this, self->frame, zoom, self->angle);
2114
+ redraw();
2115
+ }
2116
+
2117
+ float
2118
+ View::zoom () const
2119
+ {
2120
+ return self->zoom;
2121
+ }
2122
+
2048
2123
  void
2049
2124
  View::set_angle (float degree)
2050
2125
  {
2051
- update_view_frame(this, self->frame, degree, true);
2126
+ update_view_frame(this, self->frame, self->zoom, degree);
2052
2127
  }
2053
2128
 
2054
2129
  float
@@ -2057,7 +2132,23 @@ namespace Reflex
2057
2132
  return self->angle;
2058
2133
  }
2059
2134
 
2060
- static const Point ZERO_SCROLL;
2135
+ void
2136
+ View::set_pivot (float x, float y, float z)
2137
+ {
2138
+ self->pivot().reset(x, y, z);
2139
+ }
2140
+
2141
+ void
2142
+ View::set_pivot (const Point& pivot)
2143
+ {
2144
+ set_pivot(pivot.x, pivot.y, pivot.z);
2145
+ }
2146
+
2147
+ const Point&
2148
+ View::pivot () const
2149
+ {
2150
+ return self->ppivot ? self->pivot() : ZERO;
2151
+ }
2061
2152
 
2062
2153
  void
2063
2154
  View::scroll_to (coord x, coord y, coord z)
@@ -2097,28 +2188,7 @@ namespace Reflex
2097
2188
  const Point&
2098
2189
  View::scroll () const
2099
2190
  {
2100
- if (self->pscroll)
2101
- return self->scroll();
2102
- else
2103
- return ZERO_SCROLL;
2104
- }
2105
-
2106
- void
2107
- View::set_zoom (float zoom)
2108
- {
2109
- if (zoom == self->zoom) return;
2110
-
2111
- if (zoom == 0)
2112
- argument_error(__FILE__, __LINE__);
2113
-
2114
- self->zoom = zoom;
2115
- redraw();
2116
- }
2117
-
2118
- float
2119
- View::zoom () const
2120
- {
2121
- return self->zoom;
2191
+ return self->pscroll ? self->scroll() : ZERO;
2122
2192
  }
2123
2193
 
2124
2194
  void
@@ -2508,6 +2578,11 @@ namespace Reflex
2508
2578
  {
2509
2579
  }
2510
2580
 
2581
+ void
2582
+ View::on_zoom (FrameEvent* e)
2583
+ {
2584
+ }
2585
+
2511
2586
  void
2512
2587
  View::on_rotate (FrameEvent* e)
2513
2588
  {
data/src/window.cpp CHANGED
@@ -176,7 +176,7 @@ namespace Reflex
176
176
 
177
177
  for (auto& [view, targets] : window->self->captures)
178
178
  {
179
- if (!is_capturing(view.get(), targets, View::CAPTURE_KEY))
179
+ if (!view->window() || !is_capturing(view.get(), targets, View::CAPTURE_KEY))
180
180
  continue;
181
181
 
182
182
  KeyEvent e = event->dup();
@@ -256,7 +256,7 @@ namespace Reflex
256
256
 
257
257
  for (auto& [view, targets] : window->self->captures)
258
258
  {
259
- if (targets.empty()) continue;
259
+ if (!view->window() || targets.empty()) continue;
260
260
 
261
261
  PointerEvent event;
262
262
  PointerEvent_set_captured(&event, true);
@@ -300,6 +300,8 @@ namespace Reflex
300
300
 
301
301
  for (auto& view : views_capturing_all)
302
302
  {
303
+ if (!view->window()) continue;
304
+
303
305
  PointerEvent e = event.dup();
304
306
  PointerEvent_update_for_capturing_view(&e, view);
305
307
  View_call_pointer_event(const_cast<View*>(view.get()), &e);
data/test/helper.rb CHANGED
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  %w[../xot ../rucy ../rays .]
5
2
  .map {|s| File.expand_path "../#{s}/lib", __dir__}
6
3
  .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -14,4 +11,8 @@ class TestApplication < Test::Unit::TestCase
14
11
  assert_equal 'AppName', @@app.name
15
12
  end
16
13
 
14
+ def test_inspect()
15
+ assert_match %r|#<Reflex::Application:0x\w{16}>|, @@app.inspect
16
+ end
17
+
17
18
  end# TestApplication
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
data/test/test_event.rb CHANGED
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -27,7 +24,7 @@ class TestEvent < Test::Unit::TestCase
27
24
  assert_true e.blocked?
28
25
  end
29
26
 
30
- def test_block_propagation()
27
+ def _test_block_propagation()
31
28
  e1 = event
32
29
  e2 = e1.dup
33
30
  e3 = e2.dup
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -15,19 +12,31 @@ class TestFrameEvent < Test::Unit::TestCase
15
12
  end
16
13
 
17
14
  def test_initialize()
18
- e = event bounds(1, 2, 3, 4, 5, 6), 7, 8, 9, 10, 11, 12
15
+ e = event bounds(1, 2, 3, 4, 5, 6), 7, 8, 9, 10, 11, 12, 13, 14
19
16
  assert_equal bounds(1, 2, 3, 4, 5, 6), e.frame
20
17
  assert_equal 7, e.dx
21
18
  assert_equal 8, e.dy
22
19
  assert_equal 9, e.dw
23
20
  assert_equal 10, e.dh
24
- assert_equal 11, e.angle
25
- assert_equal 12, e.dangle
21
+ assert_equal 11, e.zoom
22
+ assert_equal 12, e.dzoom
23
+ assert_equal 13, e.angle
24
+ assert_equal 14, e.dangle
26
25
  end
27
26
 
28
27
  def test_dup()
29
- e1 = event bounds(1, 2, 3, 4, 5, 6), 7, 8, 9, 10, 11, 12
28
+ e1 = event bounds(1, 2, 3, 4, 5, 6), 7, 8, 9, 10, 11, 12, 13, 14
30
29
  e2 = e1.dup
30
+ assert_equal bounds(1, 2, 3, 4, 5, 6), e2.frame
31
+ assert_equal 7, e2.dx
32
+ assert_equal 8, e2.dy
33
+ assert_equal 9, e2.dw
34
+ assert_equal 10, e2.dh
35
+ assert_equal 11, e2.zoom
36
+ assert_equal 12, e2.dzoom
37
+ assert_equal 13, e2.angle
38
+ assert_equal 14, e2.dangle
39
+
31
40
  e1.block
32
41
  e3 = e1.dup
33
42
  assert_true e1.blocked?
@@ -35,4 +44,10 @@ class TestFrameEvent < Test::Unit::TestCase
35
44
  assert_true e3.blocked?
36
45
  end
37
46
 
47
+ def test_inspect()
48
+ assert_equal(
49
+ "#<Reflex::FrameEvent x:1(7) y:2(8) w:4(9) h:5(10) zoom:11(12) angle:13(14)>",
50
+ event(bounds(1, 2, 3, 4, 5, 6), 7, 8, 9, 10, 11, 12, 13, 14).inspect)
51
+ end
52
+
38
53
  end# TestFrameEvent
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
data/test/test_model.rb CHANGED
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
-
4
1
  require_relative 'helper'
5
2
 
6
3