reflexion 0.1.23 → 0.1.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/capture_event.cpp +6 -5
- data/.doc/ext/reflex/contact_event.cpp +14 -12
- data/.doc/ext/reflex/draw_event.cpp +10 -8
- data/.doc/ext/reflex/event.cpp +2 -10
- data/.doc/ext/reflex/focus_event.cpp +14 -13
- data/.doc/ext/reflex/frame_event.cpp +17 -17
- data/.doc/ext/reflex/key_event.cpp +20 -19
- data/.doc/ext/reflex/pointer_event.cpp +1 -1
- data/.doc/ext/reflex/scroll_event.cpp +14 -17
- data/.doc/ext/reflex/timer.cpp +9 -1
- data/.doc/ext/reflex/timer_event.cpp +4 -13
- data/.doc/ext/reflex/update_event.cpp +6 -5
- data/.doc/ext/reflex/wheel_event.cpp +39 -22
- data/VERSION +1 -1
- data/ext/reflex/capture_event.cpp +6 -5
- data/ext/reflex/contact_event.cpp +16 -14
- data/ext/reflex/draw_event.cpp +9 -7
- data/ext/reflex/event.cpp +2 -11
- data/ext/reflex/focus_event.cpp +14 -13
- data/ext/reflex/frame_event.cpp +16 -16
- data/ext/reflex/key_event.cpp +20 -19
- data/ext/reflex/pointer_event.cpp +1 -1
- data/ext/reflex/scroll_event.cpp +15 -18
- data/ext/reflex/timer.cpp +15 -6
- data/ext/reflex/timer_event.cpp +9 -19
- data/ext/reflex/update_event.cpp +6 -5
- data/ext/reflex/wheel_event.cpp +40 -21
- data/include/reflex/event.h +224 -115
- data/include/reflex/shape.h +2 -2
- data/include/reflex/window.h +1 -1
- data/lib/reflex/contact_event.rb +7 -7
- data/lib/reflex/focus_event.rb +8 -8
- data/lib/reflex/key_event.rb +8 -8
- data/lib/reflex/pointer.rb +3 -3
- data/lib/reflex/pointer_event.rb +2 -2
- data/lib/reflex/timer_event.rb +2 -1
- data/lib/reflex/wheel_event.rb +1 -9
- data/lib/reflex/window.rb +1 -1
- data/reflex.gemspec +4 -4
- data/src/event.cpp +630 -76
- data/src/event.h +15 -0
- data/src/image_view.cpp +2 -2
- data/src/ios/app_delegate.h +0 -6
- data/src/ios/app_delegate.mm +1 -0
- data/src/ios/application.mm +6 -0
- data/src/ios/view_controller.mm +15 -9
- data/src/ios/window.mm +2 -4
- data/src/osx/event.h +1 -1
- data/src/osx/event.mm +9 -9
- data/src/osx/native_window.mm +23 -5
- data/src/shape.cpp +11 -13
- data/src/shape.h +1 -1
- data/src/view.cpp +137 -89
- data/src/view.h +5 -6
- data/src/window.cpp +28 -26
- data/src/world.cpp +6 -4
- data/test/test_capture_event.rb +16 -0
- data/test/test_contact_event.rb +40 -0
- data/test/test_draw_event.rb +35 -0
- data/test/test_event.rb +20 -6
- data/test/test_focus_event.rb +34 -0
- data/test/test_frame_event.rb +38 -0
- data/test/test_key_event.rb +33 -0
- data/test/test_pointer.rb +14 -14
- data/test/test_pointer_event.rb +1 -1
- data/test/test_scroll_event.rb +39 -0
- data/test/test_timer_event.rb +38 -0
- data/test/test_update_event.rb +29 -0
- data/test/test_wheel_event.rb +40 -0
- metadata +29 -11
data/src/view.cpp
CHANGED
@@ -948,7 +948,7 @@ namespace Reflex
|
|
948
948
|
|
949
949
|
View::Data* self = view->self.get();
|
950
950
|
|
951
|
-
fire_timers(view, event.now);
|
951
|
+
fire_timers(view, event.now());
|
952
952
|
|
953
953
|
View::ChildList* pchildren = self->pchildren.get();
|
954
954
|
if (pchildren)
|
@@ -958,9 +958,9 @@ namespace Reflex
|
|
958
958
|
}
|
959
959
|
|
960
960
|
update_view_shapes(view);
|
961
|
-
update_child_world(view, event.dt);
|
961
|
+
update_child_world(view, event.dt());
|
962
962
|
|
963
|
-
UpdateEvent e = event;
|
963
|
+
UpdateEvent e = event.dup();
|
964
964
|
view->on_update(&e);
|
965
965
|
|
966
966
|
update_views_for_selectors(view);
|
@@ -1024,7 +1024,10 @@ namespace Reflex
|
|
1024
1024
|
static void
|
1025
1025
|
draw_default_shape (View* view, DrawEvent* event)
|
1026
1026
|
{
|
1027
|
-
assert(view && event
|
1027
|
+
assert(view && event);
|
1028
|
+
|
1029
|
+
Painter* painter = event->painter();
|
1030
|
+
assert(painter);
|
1028
1031
|
|
1029
1032
|
const Style& style = View_get_style(view);
|
1030
1033
|
const Color& back_fill = style.background_fill();
|
@@ -1033,26 +1036,26 @@ namespace Reflex
|
|
1033
1036
|
Shape* shape = view->shape(false);
|
1034
1037
|
if (shape)
|
1035
1038
|
{
|
1036
|
-
setup_painter(
|
1039
|
+
setup_painter(painter, back_fill, back_stroke);
|
1037
1040
|
shape->on_draw(event);
|
1038
1041
|
}
|
1039
1042
|
else if (back_fill || back_stroke)
|
1040
1043
|
{
|
1041
|
-
setup_painter(
|
1042
|
-
|
1044
|
+
setup_painter(painter, back_fill, back_stroke);
|
1045
|
+
painter->rect(event->bounds());
|
1043
1046
|
}
|
1044
1047
|
}
|
1045
1048
|
|
1046
1049
|
static void
|
1047
1050
|
draw_content (View* view, DrawEvent* event)
|
1048
1051
|
{
|
1049
|
-
assert(view && event && event->painter);
|
1052
|
+
assert(view && event && event->painter());
|
1050
1053
|
|
1051
1054
|
draw_default_shape(view, event);
|
1052
1055
|
|
1053
1056
|
const Style& style = View_get_style(view);
|
1054
1057
|
setup_painter(
|
1055
|
-
event->painter, style.foreground_fill(), style.foreground_stroke());
|
1058
|
+
event->painter(), style.foreground_fill(), style.foreground_stroke());
|
1056
1059
|
|
1057
1060
|
View::ShapeList* pshapes = view->self->pshapes.get();
|
1058
1061
|
if (pshapes && !pshapes->empty())
|
@@ -1068,10 +1071,10 @@ namespace Reflex
|
|
1068
1071
|
draw_view (
|
1069
1072
|
View* view, DrawEvent* event, const Point& offset, const Bounds& clip)
|
1070
1073
|
{
|
1071
|
-
assert(view && event && event->painter);
|
1074
|
+
assert(view && event && event->painter());
|
1072
1075
|
View::Data* self = view->self.get();
|
1073
1076
|
|
1074
|
-
Painter* p = event->painter;
|
1077
|
+
Painter* p = event->painter();
|
1075
1078
|
p->push_state();
|
1076
1079
|
|
1077
1080
|
if (self->has_flag(View::FLAG_CLIP) && !self->pbody)
|
@@ -1088,8 +1091,8 @@ namespace Reflex
|
|
1088
1091
|
{
|
1089
1092
|
for (auto& pchild : *pchildren)
|
1090
1093
|
{
|
1091
|
-
if (event->bounds & pchild->self->frame)
|
1092
|
-
View_draw_tree(pchild.get(),
|
1094
|
+
if (event->bounds() & pchild->self->frame)
|
1095
|
+
View_draw_tree(pchild.get(), event, offset, clip);
|
1093
1096
|
}
|
1094
1097
|
}
|
1095
1098
|
|
@@ -1105,23 +1108,24 @@ namespace Reflex
|
|
1105
1108
|
static void
|
1106
1109
|
draw_view_to_cache (View* view, DrawEvent* event)
|
1107
1110
|
{
|
1108
|
-
assert(view && event && event->painter && view->self->pcache_image);
|
1111
|
+
assert(view && event && event->painter() && view->self->pcache_image);
|
1109
1112
|
|
1110
|
-
Painter* view_painter = event->painter;
|
1113
|
+
Painter* view_painter = event->painter();
|
1111
1114
|
Painter cache_painter = view->self->pcache_image->painter();
|
1112
|
-
|
1115
|
+
|
1116
|
+
DrawEvent_set_painter(event, &cache_painter);
|
1113
1117
|
|
1114
1118
|
cache_painter.begin();
|
1115
|
-
draw_view(view, event, 0, event->bounds);
|
1119
|
+
draw_view(view, event, 0, event->bounds());
|
1116
1120
|
cache_painter.end();
|
1117
1121
|
|
1118
|
-
event
|
1122
|
+
DrawEvent_set_painter(event, view_painter);
|
1119
1123
|
}
|
1120
1124
|
|
1121
1125
|
static bool
|
1122
1126
|
draw_view_with_cache (View* view, DrawEvent* event, bool redraw)
|
1123
1127
|
{
|
1124
|
-
assert(view && event && event->painter);
|
1128
|
+
assert(view && event && event->painter());
|
1125
1129
|
View::Data* self = view->self.get();
|
1126
1130
|
|
1127
1131
|
if (!use_cache(view))
|
@@ -1130,7 +1134,7 @@ namespace Reflex
|
|
1130
1134
|
return false;
|
1131
1135
|
}
|
1132
1136
|
|
1133
|
-
Painter* painter = event->painter;
|
1137
|
+
Painter* painter = event->painter();
|
1134
1138
|
|
1135
1139
|
if (reset_cache_image(view, *painter) || redraw)
|
1136
1140
|
{
|
@@ -1148,7 +1152,7 @@ namespace Reflex
|
|
1148
1152
|
if (self->pfilter && *self->pfilter)
|
1149
1153
|
self->pfilter->apply(painter, *self->pcache_image);
|
1150
1154
|
else
|
1151
|
-
painter->image(*self->pcache_image, event->bounds);
|
1155
|
+
painter->image(*self->pcache_image, event->bounds());
|
1152
1156
|
|
1153
1157
|
painter->pop_state();
|
1154
1158
|
|
@@ -1157,7 +1161,7 @@ namespace Reflex
|
|
1157
1161
|
|
1158
1162
|
void
|
1159
1163
|
View_draw_tree (
|
1160
|
-
View* view,
|
1164
|
+
View* view, DrawEvent* event, const Point& offset, const Bounds& clip)
|
1161
1165
|
{
|
1162
1166
|
if (!view)
|
1163
1167
|
argument_error(__FILE__, __LINE__);
|
@@ -1166,26 +1170,24 @@ namespace Reflex
|
|
1166
1170
|
|
1167
1171
|
bool redraw = self->check_and_remove_flag(View::Data::REDRAW);
|
1168
1172
|
|
1169
|
-
if (
|
1173
|
+
if (view->hidden() || event->is_blocked())
|
1170
1174
|
return;
|
1171
1175
|
|
1172
1176
|
if (self->frame.width <= 0 || self->frame.height <= 0)
|
1173
1177
|
return;
|
1174
1178
|
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
e.view = view;
|
1179
|
-
e.bounds = self->frame;
|
1180
|
-
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;
|
1181
1182
|
|
1183
|
+
bounds.move_to(0, 0, bounds.z);
|
1182
1184
|
if (self->pscroll)
|
1183
1185
|
{
|
1184
|
-
|
1185
|
-
|
1186
|
+
bounds.move_by(-*self->pscroll);
|
1187
|
+
pos .move_by( *self->pscroll);
|
1186
1188
|
}
|
1187
1189
|
|
1188
|
-
Painter* p = event
|
1190
|
+
Painter* p = event->painter();
|
1189
1191
|
p->push_matrix();
|
1190
1192
|
p->translate(pos);
|
1191
1193
|
|
@@ -1197,9 +1199,15 @@ namespace Reflex
|
|
1197
1199
|
if (zoom != 1 && zoom > 0)
|
1198
1200
|
p->scale(zoom, zoom);
|
1199
1201
|
|
1200
|
-
|
1202
|
+
DrawEvent e = event->dup();
|
1203
|
+
DrawEvent_set_view(&e, view);
|
1204
|
+
DrawEvent_set_bounds(&e, bounds);
|
1205
|
+
|
1201
1206
|
if (!draw_view_with_cache(view, &e, redraw))
|
1207
|
+
{
|
1208
|
+
pos += offset;
|
1202
1209
|
draw_view(view, &e, pos, clip2);
|
1210
|
+
}
|
1203
1211
|
|
1204
1212
|
p->pop_matrix();
|
1205
1213
|
}
|
@@ -1227,127 +1235,167 @@ namespace Reflex
|
|
1227
1235
|
view->self->add_flag(View::Data::UPDATE_SHAPES);
|
1228
1236
|
}
|
1229
1237
|
|
1230
|
-
|
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
|
+
|
1231
1257
|
static void
|
1232
|
-
call_children (View* parent,
|
1258
|
+
call_children (View* parent, std::function<bool(View*)> fun)
|
1233
1259
|
{
|
1234
1260
|
assert(parent);
|
1235
1261
|
|
1236
1262
|
auto* pchildren = parent->self->pchildren.get();
|
1237
1263
|
if (!pchildren) return;
|
1238
1264
|
|
1239
|
-
|
1240
|
-
|
1265
|
+
auto end = pchildren->rend();
|
1266
|
+
for (auto it = pchildren->rbegin(); it != end; ++it)
|
1267
|
+
{
|
1268
|
+
if (!fun(it->get()))
|
1269
|
+
break;
|
1270
|
+
}
|
1241
1271
|
}
|
1242
1272
|
|
1243
|
-
void
|
1244
|
-
|
1273
|
+
static void
|
1274
|
+
call_pointer_events_for_each_child (View* parent, PointerEvent* event)
|
1245
1275
|
{
|
1246
|
-
|
1247
|
-
argument_error(__FILE__, __LINE__);
|
1276
|
+
assert(parent && event);
|
1248
1277
|
|
1249
|
-
|
1250
|
-
|
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
|
+
}
|
1285
|
+
|
1286
|
+
static void
|
1287
|
+
call_pointer_events (View* view, PointerEvent* event)
|
1288
|
+
{
|
1289
|
+
assert(view && event);
|
1290
|
+
|
1291
|
+
view->on_pointer(event);
|
1251
1292
|
|
1252
|
-
switch (
|
1293
|
+
switch ((*event)[0].action())
|
1253
1294
|
{
|
1254
|
-
case
|
1255
|
-
case
|
1256
|
-
case
|
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;
|
1257
1300
|
}
|
1258
1301
|
}
|
1259
1302
|
|
1260
1303
|
static void
|
1261
|
-
|
1304
|
+
register_captures (View* view, const PointerEvent& event)
|
1262
1305
|
{
|
1306
|
+
assert(view);
|
1307
|
+
|
1263
1308
|
Window* win = view->window();
|
1264
1309
|
if (!win)
|
1265
1310
|
invalid_state_error(__FILE__, __LINE__);
|
1266
1311
|
|
1267
|
-
PointerEvent_each_pointer(event, [&](const auto& pointer)
|
1312
|
+
PointerEvent_each_pointer(&event, [&](const auto& pointer)
|
1268
1313
|
{
|
1269
|
-
|
1270
|
-
if (action == Pointer::DOWN)
|
1271
|
-
{
|
1314
|
+
if (pointer.action() == Pointer::DOWN)
|
1272
1315
|
Window_register_capture(win, view, pointer.id());
|
1273
|
-
}
|
1274
|
-
else if (action == Pointer::UP || action == Pointer::CANCEL)
|
1275
|
-
{
|
1276
|
-
Window_unregister_capture(win, view, pointer.id());
|
1277
|
-
}
|
1278
1316
|
});
|
1279
1317
|
}
|
1280
1318
|
|
1281
1319
|
static void
|
1282
|
-
|
1320
|
+
unregister_captures (View* view, const PointerEvent& event)
|
1283
1321
|
{
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1322
|
+
assert(view);
|
1323
|
+
|
1324
|
+
Window* win = view->window();
|
1325
|
+
if (!win)
|
1326
|
+
invalid_state_error(__FILE__, __LINE__);
|
1327
|
+
|
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());
|
1288
1333
|
});
|
1289
1334
|
}
|
1290
1335
|
|
1291
1336
|
void
|
1292
|
-
View_call_pointer_event (View* view,
|
1337
|
+
View_call_pointer_event (View* view, PointerEvent* event)
|
1293
1338
|
{
|
1294
|
-
if (!view)
|
1339
|
+
if (!view || !event)
|
1295
1340
|
argument_error(__FILE__, __LINE__);
|
1296
1341
|
|
1297
|
-
if (event
|
1342
|
+
if (view->hidden() || event->empty())
|
1298
1343
|
return;
|
1299
1344
|
|
1300
|
-
PointerEvent e = event;
|
1301
|
-
view->on_pointer(&e);
|
1345
|
+
PointerEvent e = event->dup();
|
1302
1346
|
|
1303
|
-
|
1347
|
+
if (!e.is_captured())
|
1348
|
+
call_pointer_events_for_each_child(view, &e);
|
1349
|
+
|
1350
|
+
if (!e.is_blocked())
|
1304
1351
|
{
|
1305
|
-
|
1306
|
-
|
1307
|
-
case Pointer::MOVE: view->on_pointer_move(&e); break;
|
1308
|
-
case Pointer::CANCEL: view->on_pointer_cancel(&e); break;
|
1309
|
-
default: break;
|
1352
|
+
register_captures(view, e);
|
1353
|
+
call_pointer_events(view, &e);
|
1310
1354
|
}
|
1311
1355
|
|
1312
|
-
|
1313
|
-
|
1314
|
-
if (!e.is_captured())
|
1315
|
-
call_pointer_event_for_each_child(view, e);
|
1356
|
+
unregister_captures(view, e);
|
1316
1357
|
}
|
1317
1358
|
|
1318
1359
|
void
|
1319
|
-
View_call_wheel_event (View* view,
|
1360
|
+
View_call_wheel_event (View* view, WheelEvent* event)
|
1320
1361
|
{
|
1321
|
-
if (!view)
|
1362
|
+
if (!view || !event)
|
1322
1363
|
argument_error(__FILE__, __LINE__);
|
1323
1364
|
|
1365
|
+
if (view->hidden()) return;
|
1366
|
+
|
1324
1367
|
const Bounds& frame = view->frame();
|
1325
1368
|
|
1326
|
-
if (!frame.is_include(event
|
1369
|
+
if (!frame.is_include(event->position()))
|
1327
1370
|
return;
|
1328
1371
|
|
1329
|
-
WheelEvent e = event;
|
1330
|
-
e.position()
|
1372
|
+
WheelEvent e = event->dup();
|
1373
|
+
WheelEvent_set_position(&e, e.position() - frame.position());
|
1331
1374
|
|
1332
|
-
view
|
1375
|
+
call_children(view, [&](View* child) {
|
1376
|
+
View_call_wheel_event(child, &e);
|
1377
|
+
return !e.is_blocked();
|
1378
|
+
});
|
1333
1379
|
|
1334
|
-
|
1380
|
+
if (e.is_blocked()) return;
|
1381
|
+
|
1382
|
+
view->on_wheel(&e);
|
1335
1383
|
}
|
1336
1384
|
|
1337
1385
|
void
|
1338
|
-
View_call_contact_event (View* view,
|
1386
|
+
View_call_contact_event (View* view, ContactEvent* event)
|
1339
1387
|
{
|
1340
|
-
if (!view)
|
1388
|
+
if (!view || !event)
|
1341
1389
|
argument_error(__FILE__, __LINE__);
|
1342
1390
|
|
1343
|
-
ContactEvent e = event;
|
1391
|
+
ContactEvent e = event->dup();
|
1344
1392
|
view->on_contact(&e);
|
1345
1393
|
|
1346
|
-
switch (e.
|
1394
|
+
switch (e.action())
|
1347
1395
|
{
|
1348
1396
|
case ContactEvent::BEGIN: view->on_contact_begin(&e); break;
|
1349
1397
|
case ContactEvent::END: view->on_contact_end(&e); break;
|
1350
|
-
|
1398
|
+
default: break;
|
1351
1399
|
}
|
1352
1400
|
}
|
1353
1401
|
|
data/src/view.h
CHANGED
@@ -30,20 +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
|
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_call_key_event (View* view,
|
39
|
+
void View_call_key_event (View* view, KeyEvent* event);
|
41
40
|
|
42
|
-
void View_call_pointer_event (View* view,
|
41
|
+
void View_call_pointer_event (View* view, PointerEvent* event);
|
43
42
|
|
44
|
-
void View_call_wheel_event (View* view,
|
43
|
+
void View_call_wheel_event (View* view, WheelEvent* event);
|
45
44
|
|
46
|
-
void View_call_contact_event (View* view,
|
45
|
+
void View_call_contact_event (View* view, ContactEvent* event);
|
47
46
|
|
48
47
|
|
49
48
|
}// Reflex
|
data/src/window.cpp
CHANGED
@@ -31,17 +31,16 @@ namespace Reflex
|
|
31
31
|
|
32
32
|
window->self->focus.reset(view);
|
33
33
|
|
34
|
-
FocusEvent e(FocusEvent::BLUR, view, current);
|
35
|
-
|
36
34
|
if (current)
|
37
35
|
{
|
36
|
+
FocusEvent e(FocusEvent::BLUR, view, current);
|
38
37
|
current->on_focus(&e);
|
39
38
|
current->redraw();
|
40
39
|
}
|
41
40
|
|
42
41
|
if (view)
|
43
42
|
{
|
44
|
-
e
|
43
|
+
FocusEvent e(FocusEvent::FOCUS, view, current);
|
45
44
|
view->on_focus(&e);
|
46
45
|
view->redraw();
|
47
46
|
}
|
@@ -133,8 +132,8 @@ namespace Reflex
|
|
133
132
|
|
134
133
|
Rays::Bounds frame = window->frame();
|
135
134
|
|
136
|
-
event
|
137
|
-
event
|
135
|
+
DrawEvent_set_painter(event, painter);
|
136
|
+
DrawEvent_set_bounds(event, Bounds(0, 0, frame.width, frame.height));
|
138
137
|
|
139
138
|
painter->begin();
|
140
139
|
painter->push_state();
|
@@ -142,7 +141,7 @@ namespace Reflex
|
|
142
141
|
|
143
142
|
window->on_draw(event);
|
144
143
|
if (!event->is_blocked())
|
145
|
-
Reflex::View_draw_tree(window->root(),
|
144
|
+
Reflex::View_draw_tree(window->root(), event, 0, frame.move_to(0));
|
146
145
|
|
147
146
|
painter->pop_state();
|
148
147
|
painter->end();
|
@@ -168,7 +167,7 @@ namespace Reflex
|
|
168
167
|
|
169
168
|
window->on_key(event);
|
170
169
|
|
171
|
-
switch (event->
|
170
|
+
switch (event->action())
|
172
171
|
{
|
173
172
|
case KeyEvent::DOWN: window->on_key_down(event); break;
|
174
173
|
case KeyEvent::UP: window->on_key_up(event); break;
|
@@ -180,13 +179,13 @@ namespace Reflex
|
|
180
179
|
if (!is_capturing(view.get(), targets, View::CAPTURE_KEY))
|
181
180
|
continue;
|
182
181
|
|
183
|
-
KeyEvent e =
|
184
|
-
e
|
185
|
-
View_call_key_event(const_cast<View*>(view.get()), e);
|
182
|
+
KeyEvent e = event->dup();
|
183
|
+
KeyEvent_set_captured(&e, true);
|
184
|
+
View_call_key_event(const_cast<View*>(view.get()), &e);
|
186
185
|
}
|
187
186
|
|
188
187
|
if (window->self->focus)
|
189
|
-
View_call_key_event(window->self->focus.get(),
|
188
|
+
View_call_key_event(window->self->focus.get(), event);
|
190
189
|
|
191
190
|
cleanup_captures(window);
|
192
191
|
}
|
@@ -259,12 +258,13 @@ namespace Reflex
|
|
259
258
|
{
|
260
259
|
if (targets.empty()) continue;
|
261
260
|
|
262
|
-
PointerEvent
|
263
|
-
|
264
|
-
|
261
|
+
PointerEvent event;
|
262
|
+
PointerEvent_set_captured(&event, true);
|
263
|
+
extract_targeted_pointers(&event, extracteds, targets, pointers);
|
264
|
+
if (event.empty()) continue;
|
265
265
|
|
266
|
-
PointerEvent_update_for_capturing_view(&
|
267
|
-
View_call_pointer_event(const_cast<View*>(view.get()),
|
266
|
+
PointerEvent_update_for_capturing_view(&event, view);
|
267
|
+
View_call_pointer_event(const_cast<View*>(view.get()), &event);
|
268
268
|
}
|
269
269
|
}
|
270
270
|
|
@@ -293,15 +293,16 @@ namespace Reflex
|
|
293
293
|
|
294
294
|
if (views_capturing_all.empty()) return;
|
295
295
|
|
296
|
-
PointerEvent event
|
296
|
+
PointerEvent event;
|
297
|
+
PointerEvent_set_captured(&event, true);
|
297
298
|
extract_hovering_pointers(&event, extracteds, pointers);
|
298
299
|
if (event.empty()) return;
|
299
300
|
|
300
301
|
for (auto& view : views_capturing_all)
|
301
302
|
{
|
302
|
-
PointerEvent e = event;
|
303
|
+
PointerEvent e = event.dup();
|
303
304
|
PointerEvent_update_for_capturing_view(&e, view);
|
304
|
-
View_call_pointer_event(const_cast<View*>(view.get()), e);
|
305
|
+
View_call_pointer_event(const_cast<View*>(view.get()), &e);
|
305
306
|
}
|
306
307
|
}
|
307
308
|
|
@@ -375,7 +376,7 @@ namespace Reflex
|
|
375
376
|
if (!event->empty())
|
376
377
|
{
|
377
378
|
PointerEvent_update_for_child_view(event, window->root());
|
378
|
-
View_call_pointer_event(window->root(),
|
379
|
+
View_call_pointer_event(window->root(), event);
|
379
380
|
}
|
380
381
|
|
381
382
|
cleanup_captures(window);
|
@@ -391,7 +392,7 @@ namespace Reflex
|
|
391
392
|
|
392
393
|
window->on_wheel(event);
|
393
394
|
|
394
|
-
View_call_wheel_event(window->root(),
|
395
|
+
View_call_wheel_event(window->root(), event);
|
395
396
|
}
|
396
397
|
|
397
398
|
|
@@ -409,9 +410,7 @@ namespace Reflex
|
|
409
410
|
|
410
411
|
Window::~Window ()
|
411
412
|
{
|
412
|
-
//close();
|
413
|
-
|
414
|
-
View_set_window(self->root.get(), NULL);
|
413
|
+
//close(true);
|
415
414
|
}
|
416
415
|
|
417
416
|
void
|
@@ -447,11 +446,14 @@ namespace Reflex
|
|
447
446
|
}
|
448
447
|
|
449
448
|
void
|
450
|
-
Window::close ()
|
449
|
+
Window::close (bool force)
|
451
450
|
{
|
452
451
|
Event e;
|
453
452
|
on_close(&e);
|
454
|
-
if (e.is_blocked()) return;
|
453
|
+
if (!force && e.is_blocked()) return;
|
454
|
+
|
455
|
+
View_set_window(self->root.get(), NULL);
|
456
|
+
self->root.reset();
|
455
457
|
|
456
458
|
Window_close(this);
|
457
459
|
}
|
data/src/world.cpp
CHANGED
@@ -251,8 +251,9 @@ namespace Reflex
|
|
251
251
|
if (!View_is_active(*s1->owner()) || !View_is_active(*s2->owner()))
|
252
252
|
return;
|
253
253
|
|
254
|
-
|
255
|
-
Shape_call_contact_event(
|
254
|
+
ContactEvent e1(ContactEvent::BEGIN, s2), e2(ContactEvent::BEGIN, s1);
|
255
|
+
Shape_call_contact_event(s1, &e1);
|
256
|
+
Shape_call_contact_event(s2, &e2);
|
256
257
|
}
|
257
258
|
|
258
259
|
void
|
@@ -267,8 +268,9 @@ namespace Reflex
|
|
267
268
|
if (!View_is_active(*s1->owner()) || !View_is_active(*s2->owner()))
|
268
269
|
return;
|
269
270
|
|
270
|
-
|
271
|
-
Shape_call_contact_event(
|
271
|
+
ContactEvent e1(ContactEvent::END, s2), e2(ContactEvent::END, s1);
|
272
|
+
Shape_call_contact_event(s1, &e1);
|
273
|
+
Shape_call_contact_event(s2, &e2);
|
272
274
|
}
|
273
275
|
|
274
276
|
|
data/test/test_capture_event.rb
CHANGED
@@ -12,6 +12,22 @@ class TestCaptureEvent < Test::Unit::TestCase
|
|
12
12
|
})
|
13
13
|
end
|
14
14
|
|
15
|
+
def test_initialize()
|
16
|
+
e = event :key, :pointer
|
17
|
+
assert_equal [:key], e.begin
|
18
|
+
assert_equal [:pointer], e.end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_dup()
|
22
|
+
e1 = event :key, :pointer
|
23
|
+
e2 = e1.dup
|
24
|
+
e1.block
|
25
|
+
e3 = e1.dup
|
26
|
+
assert_true e1.blocked?
|
27
|
+
assert_false e2.blocked?
|
28
|
+
assert_true e3.blocked?
|
29
|
+
end
|
30
|
+
|
15
31
|
def test_begin()
|
16
32
|
c = event [:key, :pointer], []
|
17
33
|
assert_equal [:key, :pointer], c.begin
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helper'
|
5
|
+
|
6
|
+
|
7
|
+
class TestContactEvent < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def event(*args)
|
10
|
+
Reflex::ContactEvent.new(*args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def shape()
|
14
|
+
Reflex::RectShape.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def view(*args)
|
18
|
+
Reflex::View.new(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialize()
|
22
|
+
s, v = shape, view
|
23
|
+
v.shape = s# attach to view
|
24
|
+
e = event Reflex::ContactEvent::BEGIN, s
|
25
|
+
assert_equal :begin, e.action
|
26
|
+
assert_equal s, e.shape
|
27
|
+
assert_equal v, e.view
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_dup()
|
31
|
+
e1 = event Reflex::ContactEvent::BEGIN, shape
|
32
|
+
e2 = e1.dup
|
33
|
+
e1.block
|
34
|
+
e3 = e1.dup
|
35
|
+
assert_true e1.blocked?
|
36
|
+
assert_false e2.blocked?
|
37
|
+
assert_true e3.blocked?
|
38
|
+
end
|
39
|
+
|
40
|
+
end# TestContactEvent
|