reflexion 0.1.20 → 0.1.24

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/capture_event.cpp +6 -5
  3. data/.doc/ext/reflex/contact_event.cpp +18 -16
  4. data/.doc/ext/reflex/draw_event.cpp +10 -8
  5. data/.doc/ext/reflex/event.cpp +10 -10
  6. data/.doc/ext/reflex/focus_event.cpp +18 -17
  7. data/.doc/ext/reflex/frame_event.cpp +17 -17
  8. data/.doc/ext/reflex/key_event.cpp +227 -28
  9. data/.doc/ext/reflex/native.cpp +2 -0
  10. data/.doc/ext/reflex/pointer.cpp +158 -0
  11. data/.doc/ext/reflex/pointer_event.cpp +32 -91
  12. data/.doc/ext/reflex/scroll_event.cpp +14 -17
  13. data/.doc/ext/reflex/selector.cpp +8 -0
  14. data/.doc/ext/reflex/timer.cpp +9 -1
  15. data/.doc/ext/reflex/timer_event.cpp +4 -13
  16. data/.doc/ext/reflex/update_event.cpp +6 -5
  17. data/.doc/ext/reflex/view.cpp +57 -0
  18. data/.doc/ext/reflex/wheel_event.cpp +39 -22
  19. data/.doc/ext/reflex/window.cpp +41 -0
  20. data/VERSION +1 -1
  21. data/ext/reflex/capture_event.cpp +6 -5
  22. data/ext/reflex/contact_event.cpp +18 -16
  23. data/ext/reflex/draw_event.cpp +9 -7
  24. data/ext/reflex/event.cpp +11 -11
  25. data/ext/reflex/focus_event.cpp +18 -17
  26. data/ext/reflex/frame_event.cpp +16 -16
  27. data/ext/reflex/key_event.cpp +228 -28
  28. data/ext/reflex/native.cpp +2 -0
  29. data/ext/reflex/pointer.cpp +170 -0
  30. data/ext/reflex/pointer_event.cpp +31 -96
  31. data/ext/reflex/scroll_event.cpp +15 -18
  32. data/ext/reflex/selector.cpp +9 -0
  33. data/ext/reflex/timer.cpp +15 -6
  34. data/ext/reflex/timer_event.cpp +9 -19
  35. data/ext/reflex/update_event.cpp +6 -5
  36. data/ext/reflex/view.cpp +67 -3
  37. data/ext/reflex/wheel_event.cpp +40 -21
  38. data/ext/reflex/window.cpp +49 -3
  39. data/include/reflex/defs.h +140 -106
  40. data/include/reflex/event.h +232 -124
  41. data/include/reflex/pointer.h +107 -0
  42. data/include/reflex/ruby/pointer.h +41 -0
  43. data/include/reflex/ruby/view.h +9 -0
  44. data/include/reflex/ruby/window.h +9 -0
  45. data/include/reflex/selector.h +1 -1
  46. data/include/reflex/shape.h +2 -2
  47. data/include/reflex/view.h +6 -4
  48. data/include/reflex/window.h +14 -8
  49. data/lib/reflex/application.rb +3 -3
  50. data/lib/reflex/autoinit.rb +1 -1
  51. data/lib/reflex/button.rb +7 -7
  52. data/lib/reflex/capture_event.rb +7 -7
  53. data/lib/reflex/contact_event.rb +10 -10
  54. data/lib/reflex/draw_event.rb +2 -2
  55. data/lib/reflex/ellipse_shape.rb +2 -2
  56. data/lib/reflex/focus_event.rb +11 -11
  57. data/lib/reflex/frame_event.rb +5 -5
  58. data/lib/reflex/helper.rb +20 -20
  59. data/lib/reflex/image_view.rb +2 -2
  60. data/lib/reflex/key_event.rb +12 -12
  61. data/lib/reflex/model.rb +22 -22
  62. data/lib/reflex/model_owner.rb +7 -7
  63. data/lib/reflex/model_view.rb +1 -1
  64. data/lib/reflex/module.rb +5 -5
  65. data/lib/reflex/pointer.rb +107 -0
  66. data/lib/reflex/pointer_event.rb +16 -54
  67. data/lib/reflex/polygon_shape.rb +2 -2
  68. data/lib/reflex/reflex.rb +3 -3
  69. data/lib/reflex/scroll_event.rb +1 -1
  70. data/lib/reflex/selector.rb +4 -4
  71. data/lib/reflex/shape.rb +13 -13
  72. data/lib/reflex/style.rb +11 -11
  73. data/lib/reflex/style_length.rb +1 -1
  74. data/lib/reflex/text_view.rb +2 -2
  75. data/lib/reflex/timer.rb +2 -2
  76. data/lib/reflex/timer_event.rb +3 -2
  77. data/lib/reflex/update_event.rb +1 -1
  78. data/lib/reflex/view.rb +32 -32
  79. data/lib/reflex/wheel_event.rb +2 -10
  80. data/lib/reflex/window.rb +8 -7
  81. data/lib/reflex.rb +1 -0
  82. data/lib/reflexion.rb +17 -17
  83. data/reflex.gemspec +5 -5
  84. data/samples/reflexion/noise.rb +1 -1
  85. data/samples/tree.rb +1 -1
  86. data/src/event.cpp +792 -86
  87. data/src/event.h +47 -0
  88. data/src/image_view.cpp +2 -2
  89. data/src/ios/event.h +15 -3
  90. data/src/ios/event.mm +126 -11
  91. data/src/ios/view_controller.mm +51 -23
  92. data/src/ios/window.mm +18 -0
  93. data/src/osx/event.h +15 -4
  94. data/src/osx/event.mm +214 -24
  95. data/src/osx/native_window.mm +85 -18
  96. data/src/osx/window.mm +22 -0
  97. data/src/pointer.cpp +203 -0
  98. data/src/pointer.h +26 -0
  99. data/src/selector.cpp +1 -1
  100. data/src/shape.cpp +11 -13
  101. data/src/shape.h +1 -1
  102. data/src/view.cpp +205 -118
  103. data/src/view.h +5 -10
  104. data/src/window.cpp +346 -104
  105. data/src/window.h +28 -3
  106. data/src/world.cpp +6 -4
  107. data/test/helper.rb +3 -3
  108. data/test/test_application.rb +1 -1
  109. data/test/test_capture_event.rb +22 -6
  110. data/test/test_contact_event.rb +40 -0
  111. data/test/test_draw_event.rb +35 -0
  112. data/test/test_event.rb +33 -5
  113. data/test/test_focus_event.rb +34 -0
  114. data/test/test_frame_event.rb +38 -0
  115. data/test/test_has_frame.rb +11 -11
  116. data/test/test_key_event.rb +33 -0
  117. data/test/test_pointer.rb +149 -0
  118. data/test/test_pointer_event.rb +70 -104
  119. data/test/test_reflex.rb +1 -1
  120. data/test/test_scroll_event.rb +39 -0
  121. data/test/test_selector.rb +15 -8
  122. data/test/test_shape.rb +8 -8
  123. data/test/test_style.rb +13 -13
  124. data/test/test_style_length.rb +5 -5
  125. data/test/test_timer_event.rb +38 -0
  126. data/test/test_update_event.rb +29 -0
  127. data/test/test_view.rb +57 -30
  128. data/test/test_wheel_event.rb +40 -0
  129. data/test/test_window.rb +45 -26
  130. metadata +64 -35
data/src/view.cpp CHANGED
@@ -9,6 +9,7 @@
9
9
  #include "reflex/exception.h"
10
10
  #include "reflex/debug.h"
11
11
  #include "window.h"
12
+ #include "event.h"
12
13
  #include "selector.h"
13
14
  #include "timer.h"
14
15
  #include "style.h"
@@ -877,7 +878,7 @@ namespace Reflex
877
878
  result->clear();
878
879
 
879
880
  Selector* sel = view->self->pselector.get();
880
- if (!sel || sel->is_empty())
881
+ if (!sel || sel->empty())
881
882
  return false;
882
883
 
883
884
  get_styles_for_selector(result, view, *sel);
@@ -947,7 +948,7 @@ namespace Reflex
947
948
 
948
949
  View::Data* self = view->self.get();
949
950
 
950
- fire_timers(view, event.now);
951
+ fire_timers(view, event.now());
951
952
 
952
953
  View::ChildList* pchildren = self->pchildren.get();
953
954
  if (pchildren)
@@ -957,9 +958,9 @@ namespace Reflex
957
958
  }
958
959
 
959
960
  update_view_shapes(view);
960
- update_child_world(view, event.dt);
961
+ update_child_world(view, event.dt());
961
962
 
962
- UpdateEvent e = event;
963
+ UpdateEvent e = event.dup();
963
964
  view->on_update(&e);
964
965
 
965
966
  update_views_for_selectors(view);
@@ -1023,7 +1024,10 @@ namespace Reflex
1023
1024
  static void
1024
1025
  draw_default_shape (View* view, DrawEvent* event)
1025
1026
  {
1026
- assert(view && event && event->painter);
1027
+ assert(view && event);
1028
+
1029
+ Painter* painter = event->painter();
1030
+ assert(painter);
1027
1031
 
1028
1032
  const Style& style = View_get_style(view);
1029
1033
  const Color& back_fill = style.background_fill();
@@ -1032,26 +1036,26 @@ namespace Reflex
1032
1036
  Shape* shape = view->shape(false);
1033
1037
  if (shape)
1034
1038
  {
1035
- setup_painter(event->painter, back_fill, back_stroke);
1039
+ setup_painter(painter, back_fill, back_stroke);
1036
1040
  shape->on_draw(event);
1037
1041
  }
1038
1042
  else if (back_fill || back_stroke)
1039
1043
  {
1040
- setup_painter(event->painter, back_fill, back_stroke);
1041
- event->painter->rect(event->bounds);
1044
+ setup_painter(painter, back_fill, back_stroke);
1045
+ painter->rect(event->bounds());
1042
1046
  }
1043
1047
  }
1044
1048
 
1045
1049
  static void
1046
1050
  draw_content (View* view, DrawEvent* event)
1047
1051
  {
1048
- assert(view && event && event->painter);
1052
+ assert(view && event && event->painter());
1049
1053
 
1050
1054
  draw_default_shape(view, event);
1051
1055
 
1052
1056
  const Style& style = View_get_style(view);
1053
1057
  setup_painter(
1054
- event->painter, style.foreground_fill(), style.foreground_stroke());
1058
+ event->painter(), style.foreground_fill(), style.foreground_stroke());
1055
1059
 
1056
1060
  View::ShapeList* pshapes = view->self->pshapes.get();
1057
1061
  if (pshapes && !pshapes->empty())
@@ -1067,10 +1071,10 @@ namespace Reflex
1067
1071
  draw_view (
1068
1072
  View* view, DrawEvent* event, const Point& offset, const Bounds& clip)
1069
1073
  {
1070
- assert(view && event && event->painter);
1074
+ assert(view && event && event->painter());
1071
1075
  View::Data* self = view->self.get();
1072
1076
 
1073
- Painter* p = event->painter;
1077
+ Painter* p = event->painter();
1074
1078
  p->push_state();
1075
1079
 
1076
1080
  if (self->has_flag(View::FLAG_CLIP) && !self->pbody)
@@ -1087,8 +1091,8 @@ namespace Reflex
1087
1091
  {
1088
1092
  for (auto& pchild : *pchildren)
1089
1093
  {
1090
- if (event->bounds & pchild->self->frame)
1091
- View_draw_tree(pchild.get(), *event, offset, clip);
1094
+ if (event->bounds() & pchild->self->frame)
1095
+ View_draw_tree(pchild.get(), event, offset, clip);
1092
1096
  }
1093
1097
  }
1094
1098
 
@@ -1104,23 +1108,24 @@ namespace Reflex
1104
1108
  static void
1105
1109
  draw_view_to_cache (View* view, DrawEvent* event)
1106
1110
  {
1107
- assert(view && event && event->painter && view->self->pcache_image);
1111
+ assert(view && event && event->painter() && view->self->pcache_image);
1108
1112
 
1109
- Painter* view_painter = event->painter;
1113
+ Painter* view_painter = event->painter();
1110
1114
  Painter cache_painter = view->self->pcache_image->painter();
1111
- event->painter = &cache_painter;
1115
+
1116
+ DrawEvent_set_painter(event, &cache_painter);
1112
1117
 
1113
1118
  cache_painter.begin();
1114
- draw_view(view, event, 0, event->bounds);
1119
+ draw_view(view, event, 0, event->bounds());
1115
1120
  cache_painter.end();
1116
1121
 
1117
- event->painter = view_painter;
1122
+ DrawEvent_set_painter(event, view_painter);
1118
1123
  }
1119
1124
 
1120
1125
  static bool
1121
1126
  draw_view_with_cache (View* view, DrawEvent* event, bool redraw)
1122
1127
  {
1123
- assert(view && event && event->painter);
1128
+ assert(view && event && event->painter());
1124
1129
  View::Data* self = view->self.get();
1125
1130
 
1126
1131
  if (!use_cache(view))
@@ -1129,7 +1134,7 @@ namespace Reflex
1129
1134
  return false;
1130
1135
  }
1131
1136
 
1132
- Painter* painter = event->painter;
1137
+ Painter* painter = event->painter();
1133
1138
 
1134
1139
  if (reset_cache_image(view, *painter) || redraw)
1135
1140
  {
@@ -1147,7 +1152,7 @@ namespace Reflex
1147
1152
  if (self->pfilter && *self->pfilter)
1148
1153
  self->pfilter->apply(painter, *self->pcache_image);
1149
1154
  else
1150
- painter->image(*self->pcache_image, event->bounds);
1155
+ painter->image(*self->pcache_image, event->bounds());
1151
1156
 
1152
1157
  painter->pop_state();
1153
1158
 
@@ -1156,7 +1161,7 @@ namespace Reflex
1156
1161
 
1157
1162
  void
1158
1163
  View_draw_tree (
1159
- View* view, const DrawEvent& event, const Point& offset, const Bounds& clip)
1164
+ View* view, DrawEvent* event, const Point& offset, const Bounds& clip)
1160
1165
  {
1161
1166
  if (!view)
1162
1167
  argument_error(__FILE__, __LINE__);
@@ -1165,26 +1170,24 @@ namespace Reflex
1165
1170
 
1166
1171
  bool redraw = self->check_and_remove_flag(View::Data::REDRAW);
1167
1172
 
1168
- if (event.is_blocked() || view->hidden())
1173
+ if (view->hidden() || event->is_blocked())
1169
1174
  return;
1170
1175
 
1171
1176
  if (self->frame.width <= 0 || self->frame.height <= 0)
1172
1177
  return;
1173
1178
 
1174
- Point pos = self->frame.position();
1175
- Bounds clip2 = self->frame.dup().move_by(offset) & clip;
1176
- DrawEvent e = event;
1177
- e.view = view;
1178
- e.bounds = self->frame;
1179
- e.bounds.move_to(0, 0, e.bounds.z);
1179
+ Bounds bounds = self->frame;
1180
+ Point pos = bounds.position();
1181
+ Bounds clip2 = bounds.dup().move_by(offset) & clip;
1180
1182
 
1183
+ bounds.move_to(0, 0, bounds.z);
1181
1184
  if (self->pscroll)
1182
1185
  {
1183
- pos .move_by( *self->pscroll);
1184
- e.bounds.move_by(-*self->pscroll);
1186
+ bounds.move_by(-*self->pscroll);
1187
+ pos .move_by( *self->pscroll);
1185
1188
  }
1186
1189
 
1187
- Painter* p = event.painter;
1190
+ Painter* p = event->painter();
1188
1191
  p->push_matrix();
1189
1192
  p->translate(pos);
1190
1193
 
@@ -1196,9 +1199,15 @@ namespace Reflex
1196
1199
  if (zoom != 1 && zoom > 0)
1197
1200
  p->scale(zoom, zoom);
1198
1201
 
1199
- pos += offset;
1202
+ DrawEvent e = event->dup();
1203
+ DrawEvent_set_view(&e, view);
1204
+ DrawEvent_set_bounds(&e, bounds);
1205
+
1200
1206
  if (!draw_view_with_cache(view, &e, redraw))
1207
+ {
1208
+ pos += offset;
1201
1209
  draw_view(view, &e, pos, clip2);
1210
+ }
1202
1211
 
1203
1212
  p->pop_matrix();
1204
1213
  }
@@ -1211,7 +1220,7 @@ namespace Reflex
1211
1220
 
1212
1221
  View::Data* self = view->self.get();
1213
1222
 
1214
- if (selector.is_empty())
1223
+ if (selector.empty())
1215
1224
  self->add_flag(View::Data::UPDATE_STYLE);
1216
1225
  else
1217
1226
  self->selectors_for_update().insert(selector);
@@ -1226,123 +1235,167 @@ namespace Reflex
1226
1235
  view->self->add_flag(View::Data::UPDATE_SHAPES);
1227
1236
  }
1228
1237
 
1229
- template <typename FUN, typename EVENT>
1238
+ void
1239
+ View_call_key_event (View* view, KeyEvent* event)
1240
+ {
1241
+ if (!view || !event)
1242
+ argument_error(__FILE__, __LINE__);
1243
+
1244
+ if (view->hidden()) return;
1245
+
1246
+ KeyEvent e = event->dup();
1247
+ view->on_key(&e);
1248
+
1249
+ switch (e.action())
1250
+ {
1251
+ case KeyEvent::DOWN: view->on_key_down(&e); break;
1252
+ case KeyEvent::UP: view->on_key_up(&e); break;
1253
+ default: break;
1254
+ }
1255
+ }
1256
+
1230
1257
  static void
1231
- call_children (View* parent, FUN fun, const EVENT& e)
1258
+ call_children (View* parent, std::function<bool(View*)> fun)
1232
1259
  {
1233
1260
  assert(parent);
1234
1261
 
1235
- View::ChildList* pchildren = parent->self->pchildren.get();
1236
- if (pchildren)
1262
+ auto* pchildren = parent->self->pchildren.get();
1263
+ if (!pchildren) return;
1264
+
1265
+ auto end = pchildren->rend();
1266
+ for (auto it = pchildren->rbegin(); it != end; ++it)
1237
1267
  {
1238
- for (auto& pchild : *pchildren)
1239
- fun(pchild.get(), e);
1268
+ if (!fun(it->get()))
1269
+ break;
1240
1270
  }
1241
1271
  }
1242
1272
 
1243
- void
1244
- View_call_key_event (View* view, const KeyEvent& event)
1273
+ static void
1274
+ call_pointer_events_for_each_child (View* parent, PointerEvent* event)
1245
1275
  {
1246
- if (!view)
1247
- argument_error(__FILE__, __LINE__);
1276
+ assert(parent && event);
1277
+
1278
+ call_children(parent, [&](View* child) {
1279
+ PointerEvent e = event->dup();
1280
+ PointerEvent_update_for_child_view(&e, child);
1281
+ View_call_pointer_event(child, &e);
1282
+ return !e.is_blocked();
1283
+ });
1284
+ }
1248
1285
 
1249
- bool capturing = view->capture() & View::CAPTURE_KEY;
1250
- if (capturing != event.capture) return;
1286
+ static void
1287
+ call_pointer_events (View* view, PointerEvent* event)
1288
+ {
1289
+ assert(view && event);
1251
1290
 
1252
- KeyEvent e = event;
1253
- view->on_key(&e);
1291
+ view->on_pointer(event);
1254
1292
 
1255
- switch (e.type)
1293
+ switch ((*event)[0].action())
1256
1294
  {
1257
- case KeyEvent::DOWN: view->on_key_down(&e); break;
1258
- case KeyEvent::UP: view->on_key_up(&e); break;
1259
- case KeyEvent::NONE: break;
1295
+ case Pointer::DOWN: view->on_pointer_down(event); break;
1296
+ case Pointer::UP: view->on_pointer_up(event); break;
1297
+ case Pointer::MOVE: view->on_pointer_move(event); break;
1298
+ case Pointer::CANCEL: view->on_pointer_cancel(event); break;
1299
+ default: break;
1260
1300
  }
1261
1301
  }
1262
1302
 
1263
1303
  static void
1264
- filter_pointer_event (
1265
- PointerEvent* to, const PointerEvent& from, const Bounds& frame)
1304
+ register_captures (View* view, const PointerEvent& event)
1266
1305
  {
1267
- assert(to);
1268
-
1269
- const Point& offset = frame.position();
1306
+ assert(view);
1270
1307
 
1271
- to->size = 0;
1272
- for (size_t i = 0; i < from.size; ++i) {
1273
- const Point& pos = from.position(i);
1274
- if (!frame.is_include(pos))
1275
- continue;
1308
+ Window* win = view->window();
1309
+ if (!win)
1310
+ invalid_state_error(__FILE__, __LINE__);
1276
1311
 
1277
- to->positions[i] = pos - offset;
1278
- ++to->size;
1279
- }
1312
+ PointerEvent_each_pointer(&event, [&](const auto& pointer)
1313
+ {
1314
+ if (pointer.action() == Pointer::DOWN)
1315
+ Window_register_capture(win, view, pointer.id());
1316
+ });
1280
1317
  }
1281
1318
 
1282
- void
1283
- View_call_pointer_event (View* view, const PointerEvent& event)
1319
+ static void
1320
+ unregister_captures (View* view, const PointerEvent& event)
1284
1321
  {
1285
- if (!view)
1286
- argument_error(__FILE__, __LINE__);
1322
+ assert(view);
1287
1323
 
1288
- bool capturing = view->capture() & View::CAPTURE_POINTER;
1289
- if (capturing != event.capture) return;
1324
+ Window* win = view->window();
1325
+ if (!win)
1326
+ invalid_state_error(__FILE__, __LINE__);
1290
1327
 
1291
- const Bounds& frame = view->frame();
1328
+ PointerEvent_each_pointer(&event, [&](const auto& pointer)
1329
+ {
1330
+ auto action = pointer.action();
1331
+ if (action == Pointer::UP || action == Pointer::CANCEL)
1332
+ Window_unregister_capture(win, view, pointer.id());
1333
+ });
1334
+ }
1292
1335
 
1293
- PointerEvent e = event;
1294
- filter_pointer_event(&e, event, frame);
1336
+ void
1337
+ View_call_pointer_event (View* view, PointerEvent* event)
1338
+ {
1339
+ if (!view || !event)
1340
+ argument_error(__FILE__, __LINE__);
1295
1341
 
1296
- if (!capturing && e.size == 0)
1342
+ if (view->hidden() || event->empty())
1297
1343
  return;
1298
1344
 
1299
- view->on_pointer(&e);
1345
+ PointerEvent e = event->dup();
1300
1346
 
1301
- switch (e.type)
1347
+ if (!e.is_captured())
1348
+ call_pointer_events_for_each_child(view, &e);
1349
+
1350
+ if (!e.is_blocked())
1302
1351
  {
1303
- case PointerEvent::DOWN: view->on_pointer_down(&e); break;
1304
- case PointerEvent::UP: view->on_pointer_up(&e); break;
1305
- case PointerEvent::MOVE: view->on_pointer_move(&e); break;
1306
- case PointerEvent::NONE: break;
1352
+ register_captures(view, e);
1353
+ call_pointer_events(view, &e);
1307
1354
  }
1308
1355
 
1309
- if (!event.capture)
1310
- call_children(view, View_call_pointer_event, e);
1356
+ unregister_captures(view, e);
1311
1357
  }
1312
1358
 
1313
1359
  void
1314
- View_call_wheel_event (View* view, const WheelEvent& event)
1360
+ View_call_wheel_event (View* view, WheelEvent* event)
1315
1361
  {
1316
- if (!view)
1362
+ if (!view || !event)
1317
1363
  argument_error(__FILE__, __LINE__);
1318
1364
 
1365
+ if (view->hidden()) return;
1366
+
1319
1367
  const Bounds& frame = view->frame();
1320
1368
 
1321
- if (!frame.is_include(event.x, event.y, event.z))
1369
+ if (!frame.is_include(event->position()))
1322
1370
  return;
1323
1371
 
1324
- WheelEvent e = event;
1325
- e.position() -= frame.position();
1372
+ WheelEvent e = event->dup();
1373
+ WheelEvent_set_position(&e, e.position() - frame.position());
1326
1374
 
1327
- view->on_wheel(&e);
1375
+ call_children(view, [&](View* child) {
1376
+ View_call_wheel_event(child, &e);
1377
+ return !e.is_blocked();
1378
+ });
1379
+
1380
+ if (e.is_blocked()) return;
1328
1381
 
1329
- call_children(view, View_call_wheel_event, e);
1382
+ view->on_wheel(&e);
1330
1383
  }
1331
1384
 
1332
1385
  void
1333
- View_call_contact_event (View* view, const ContactEvent& event)
1386
+ View_call_contact_event (View* view, ContactEvent* event)
1334
1387
  {
1335
- if (!view)
1388
+ if (!view || !event)
1336
1389
  argument_error(__FILE__, __LINE__);
1337
1390
 
1338
- ContactEvent e = event;
1391
+ ContactEvent e = event->dup();
1339
1392
  view->on_contact(&e);
1340
1393
 
1341
- switch (e.type)
1394
+ switch (e.action())
1342
1395
  {
1343
1396
  case ContactEvent::BEGIN: view->on_contact_begin(&e); break;
1344
1397
  case ContactEvent::END: view->on_contact_end(&e); break;
1345
- case ContactEvent::NONE: break;
1398
+ default: break;
1346
1399
  }
1347
1400
  }
1348
1401
 
@@ -1462,22 +1515,29 @@ namespace Reflex
1462
1515
  Point
1463
1516
  View::from_parent (const Point& point) const
1464
1517
  {
1465
- not_implemented_error(__FILE__, __LINE__);
1466
- return 0;
1518
+ if (!parent())
1519
+ invalid_state_error(__FILE__, __LINE__);
1520
+
1521
+ return point - frame().position();
1467
1522
  }
1468
1523
 
1469
1524
  Point
1470
1525
  View::to_parent (const Point& point) const
1471
1526
  {
1472
- not_implemented_error(__FILE__, __LINE__);
1473
- return 0;
1527
+ if (!parent())
1528
+ invalid_state_error(__FILE__, __LINE__);
1529
+
1530
+ return point + frame().position();
1474
1531
  }
1475
1532
 
1476
1533
  Point
1477
1534
  View::from_window (const Point& point) const
1478
1535
  {
1536
+ if (!window())
1537
+ invalid_state_error(__FILE__, __LINE__);
1538
+
1479
1539
  Point p = point;
1480
- for (const View* v = parent(); v; v = v->parent())
1540
+ for (const View* v = this; v; v = v->parent())
1481
1541
  p -= v->frame().position();
1482
1542
  return p;
1483
1543
  }
@@ -1485,22 +1545,33 @@ namespace Reflex
1485
1545
  Point
1486
1546
  View::to_window (const Point& point) const
1487
1547
  {
1488
- not_implemented_error(__FILE__, __LINE__);
1489
- return 0;
1548
+ if (!window())
1549
+ invalid_state_error(__FILE__, __LINE__);
1550
+
1551
+ Point p = point;
1552
+ for (const View* v = this; v; v = v->parent())
1553
+ p += v->frame().position();
1554
+ return p;
1490
1555
  }
1491
1556
 
1492
1557
  Point
1493
1558
  View::from_screen (const Point& point) const
1494
1559
  {
1495
- not_implemented_error(__FILE__, __LINE__);
1496
- return 0;
1560
+ const Window* w = window();
1561
+ if (!w)
1562
+ invalid_state_error(__FILE__, __LINE__);
1563
+
1564
+ return w->from_screen(from_window(point));
1497
1565
  }
1498
1566
 
1499
1567
  Point
1500
1568
  View::to_screen (const Point& point) const
1501
1569
  {
1502
- not_implemented_error(__FILE__, __LINE__);
1503
- return 0;
1570
+ const Window* w = window();
1571
+ if (!w)
1572
+ invalid_state_error(__FILE__, __LINE__);
1573
+
1574
+ return w->to_screen(to_window(point));
1504
1575
  }
1505
1576
 
1506
1577
  static void
@@ -1682,7 +1753,7 @@ namespace Reflex
1682
1753
  Style*
1683
1754
  View::get_style (const Selector& selector, bool create)
1684
1755
  {
1685
- if (selector.is_empty())
1756
+ if (selector.empty())
1686
1757
  return style(create);
1687
1758
 
1688
1759
  StyleList* pstyles = self->pstyles.get();
@@ -1989,18 +2060,23 @@ namespace Reflex
1989
2060
  void
1990
2061
  View::scroll_to (coord x, coord y, coord z)
1991
2062
  {
1992
- Point old = self->scroll();
1993
- self->scroll().reset(x, y, z);
1994
- ScrollEvent e(x, y, z, x - old.x, y - old.y, z - old.z);
1995
- on_scroll(&e);
1996
-
1997
- redraw();
2063
+ scroll_to(Point(x, y, z));
1998
2064
  }
1999
2065
 
2000
2066
  void
2001
2067
  View::scroll_to (const Point& scroll)
2002
2068
  {
2003
- scroll_to(scroll.x, scroll.y, scroll.z);
2069
+ if (scroll == this->scroll()) return;
2070
+
2071
+ Point old = self->scroll();
2072
+ self->scroll() = scroll;
2073
+
2074
+ ScrollEvent e(
2075
+ scroll.x, scroll.y, scroll.z,
2076
+ scroll.x - old.x, scroll.y - old.y, scroll.z - old.z);
2077
+ on_scroll(&e);
2078
+
2079
+ redraw();
2004
2080
  }
2005
2081
 
2006
2082
  void
@@ -2028,6 +2104,11 @@ namespace Reflex
2028
2104
  void
2029
2105
  View::set_zoom (float zoom)
2030
2106
  {
2107
+ if (zoom == self->zoom) return;
2108
+
2109
+ if (zoom == 0)
2110
+ argument_error(__FILE__, __LINE__);
2111
+
2031
2112
  self->zoom = zoom;
2032
2113
  redraw();
2033
2114
  }
@@ -2041,7 +2122,8 @@ namespace Reflex
2041
2122
  void
2042
2123
  View::set_capture (uint types)
2043
2124
  {
2044
- if (types == self->capture) return;
2125
+ Window* w = window();
2126
+ if (!w || types == self->capture) return;
2045
2127
 
2046
2128
  uint old = self->capture;
2047
2129
  self->capture = types;
@@ -2050,9 +2132,9 @@ namespace Reflex
2050
2132
  bool capture = types != CAPTURE_NONE;
2051
2133
 
2052
2134
  if (capture && !registered)
2053
- View_register_capture(this);
2135
+ Window_register_capture(w, this);
2054
2136
  else if (!capture && registered)
2055
- View_unregister_capture(this);
2137
+ Window_unregister_capture(w, this);
2056
2138
 
2057
2139
  CaptureEvent e(~old & types, old & ~types);
2058
2140
  on_capture(&e);
@@ -2508,6 +2590,11 @@ namespace Reflex
2508
2590
  {
2509
2591
  }
2510
2592
 
2593
+ void
2594
+ View::on_pointer_cancel (PointerEvent* e)
2595
+ {
2596
+ }
2597
+
2511
2598
  void
2512
2599
  View::on_wheel (WheelEvent* e)
2513
2600
  {
data/src/view.h CHANGED
@@ -30,24 +30,19 @@ namespace Reflex
30
30
  void View_update_tree (View* view, const UpdateEvent& event);
31
31
 
32
32
  void View_draw_tree (
33
- View* view, const DrawEvent& event,
34
- const Point& offset, const Bounds& clip);
33
+ View* view, DrawEvent* event, const Point& offset, const Bounds& clip);
35
34
 
36
35
  void View_update_styles (View* view, const Selector& selector);
37
36
 
38
37
  void View_update_shapes (View* view);
39
38
 
40
- void View_register_capture (View* view);
39
+ void View_call_key_event (View* view, KeyEvent* event);
41
40
 
42
- void View_unregister_capture (View* view);
41
+ void View_call_pointer_event (View* view, PointerEvent* event);
43
42
 
44
- void View_call_key_event (View* view, const KeyEvent& event);
43
+ void View_call_wheel_event (View* view, WheelEvent* event);
45
44
 
46
- void View_call_pointer_event (View* view, const PointerEvent& event);
47
-
48
- void View_call_wheel_event (View* view, const WheelEvent& event);
49
-
50
- void View_call_contact_event (View* view, const ContactEvent& event);
45
+ void View_call_contact_event (View* view, ContactEvent* event);
51
46
 
52
47
 
53
48
  }// Reflex