reflexion 0.1.21 → 0.1.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) 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 +24 -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 +30 -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 +10 -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 +6 -6
  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 +50 -22
  92. data/src/ios/window.mm +1 -1
  93. data/src/osx/event.h +15 -4
  94. data/src/osx/event.mm +214 -24
  95. data/src/osx/native_window.mm +84 -17
  96. data/src/pointer.cpp +203 -0
  97. data/src/pointer.h +26 -0
  98. data/src/selector.cpp +1 -1
  99. data/src/shape.cpp +11 -13
  100. data/src/shape.h +1 -1
  101. data/src/view.cpp +205 -118
  102. data/src/view.h +5 -10
  103. data/src/window.cpp +334 -104
  104. data/src/window.h +22 -3
  105. data/src/world.cpp +6 -4
  106. data/test/helper.rb +3 -3
  107. data/test/test_application.rb +1 -1
  108. data/test/test_capture_event.rb +22 -6
  109. data/test/test_contact_event.rb +40 -0
  110. data/test/test_draw_event.rb +35 -0
  111. data/test/test_event.rb +33 -5
  112. data/test/test_focus_event.rb +34 -0
  113. data/test/test_frame_event.rb +38 -0
  114. data/test/test_has_frame.rb +11 -11
  115. data/test/test_key_event.rb +33 -0
  116. data/test/test_pointer.rb +149 -0
  117. data/test/test_pointer_event.rb +70 -104
  118. data/test/test_reflex.rb +1 -1
  119. data/test/test_scroll_event.rb +39 -0
  120. data/test/test_selector.rb +15 -8
  121. data/test/test_shape.rb +8 -8
  122. data/test/test_style.rb +13 -13
  123. data/test/test_style_length.rb +5 -5
  124. data/test/test_timer_event.rb +38 -0
  125. data/test/test_update_event.rb +29 -0
  126. data/test/test_view.rb +57 -30
  127. data/test/test_wheel_event.rb +40 -0
  128. data/test/test_window.rb +29 -27
  129. 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