diff --git a/legacy/ephysics/data/themes/cubes.edc b/legacy/ephysics/data/themes/cubes.edc index 6c553435f3..3cc2be29bd 100644 --- a/legacy/ephysics/data/themes/cubes.edc +++ b/legacy/ephysics/data/themes/cubes.edc @@ -10,8 +10,9 @@ part { name: "cube"; - mouse_events: 0; type: IMAGE; + mouse_events: 1; + repeat_events: 0; description { state: "default" 0.0; image.normal: "cube-blue.png"; @@ -19,7 +20,6 @@ } } - } group { @@ -29,8 +29,9 @@ part { name: "cube"; - mouse_events: 0; type: IMAGE; + mouse_events: 1; + repeat_events: 0; description { state: "default" 0.0; image.normal: "cube-purple.png"; @@ -38,5 +39,4 @@ } } - } diff --git a/legacy/ephysics/data/themes/frame.edc b/legacy/ephysics/data/themes/frame.edc index 6bbd23cb6e..7148a43508 100644 --- a/legacy/ephysics/data/themes/frame.edc +++ b/legacy/ephysics/data/themes/frame.edc @@ -102,6 +102,28 @@ } } + part { + name: "grab_msg"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 232 224 215 0; + rel1.relative: 0.08 0.96; + rel2.relative: 0.92 1.0; + text { + font: "Sans"; + size: 12; + text: "Drag a body to move it."; + } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + color: 95 56 19 255; + } + } + part { name: "linear_vel"; type: TEXT; @@ -267,6 +289,15 @@ target: "arrows_msg"; } + program { + name: "grab,show"; + source: "ephysics_test"; + signal: "grab,show"; + action: STATE_SET "visible" 0.0; + target: "arrows"; + target: "grab_msg"; + } + program { name: "borders,show"; source: "ephysics_test"; diff --git a/legacy/ephysics/src/bin/Makefile.am b/legacy/ephysics/src/bin/Makefile.am index 8cb344701e..e16755a05b 100644 --- a/legacy/ephysics/src/bin/Makefile.am +++ b/legacy/ephysics/src/bin/Makefile.am @@ -28,6 +28,7 @@ test_constraint.c \ test_delete.c \ test_falling_letters.c \ test_forces.c \ +test_grab.c \ test_growing_balls.c \ test_heavy.c \ test_jumping_balls.c \ diff --git a/legacy/ephysics/src/bin/test.c b/legacy/ephysics/src/bin/test.c index ce1f7f60b7..50720405d8 100644 --- a/legacy/ephysics/src/bin/test.c +++ b/legacy/ephysics/src/bin/test.c @@ -28,6 +28,7 @@ void test_delete(void *data, Evas_Object *obj, void *event_info); void test_falling_letters(void *data, Evas_Object *obj, void *event_info); void test_flag(void *data, Evas_Object *obj, void *event_info); void test_forces(void *data, Evas_Object *obj, void *event_info); +void test_grab(void *data, Evas_Object *obj, void *event_info); void test_growing_balls(void *data, Evas_Object *obj, void *event_info); void test_heavy(void *data, Evas_Object *obj, void *event_info); void test_jumping_balls(void *data, Evas_Object *obj, void *event_info); @@ -56,6 +57,7 @@ static const EPhysics_Test tests[] = { {"Falling Letters", test_falling_letters}, {"Flag - Cloth", test_flag}, {"Forces", test_forces}, + {"Grab", test_grab}, {"Growing Balls", test_growing_balls}, {"Heavy", test_heavy}, {"Jumping Balls", test_jumping_balls}, diff --git a/legacy/ephysics/src/bin/test_grab.c b/legacy/ephysics/src/bin/test_grab.c new file mode 100644 index 0000000000..fae6e772b9 --- /dev/null +++ b/legacy/ephysics/src/bin/test_grab.c @@ -0,0 +1,174 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "ephysics_test.h" + +typedef struct _Dragging_Data +{ + int mouse_status; // 0, up, 1, down + EPhysics_Body *body; + double curr_mass; + struct { + int x; + int y; + } clicked_position; +} Dragging_Data; + +static void +_on_delete(void *data __UNUSED__, EPhysics_Body *body, void *event_info __UNUSED__) +{ + Dragging_Data *dragging = ephysics_body_data_get(body); + free(dragging); +} + +static void +_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Dragging_Data *dragging = ephysics_body_data_get(data); + Evas_Event_Mouse_Down *mdown = event_info; + Evas_Coord x, y; + + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + dragging->mouse_status = 1; + dragging->clicked_position.x = mdown->output.x - x; + dragging->clicked_position.y = mdown->output.y - y; + ephysics_body_mass_get(data); + dragging->curr_mass = ephysics_body_mass_get(data); + ephysics_body_mass_set(data, 0); +} + +static void +_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Dragging_Data *dragging = ephysics_body_data_get(data); + dragging->mouse_status = 0; + ephysics_body_mass_set(data, dragging->curr_mass); + dragging->curr_mass = 0; +} + +static void +_mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Dragging_Data *dragging = ephysics_body_data_get(data); + Evas_Event_Mouse_Move *mmove = event_info; + Evas_Coord x, y, w, h, nx, ny; + + if (!dragging->mouse_status) return; + + nx = mmove->cur.output.x - dragging->clicked_position.x; + ny = mmove->cur.output.y - dragging->clicked_position.y; + + if (nx < 0 || ny < 0) return; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + ephysics_body_move(dragging->body, nx, ny); +} + +static void +_box_add(Test_Data *test_data, Evas_Coord x, Evas_Coord y, const char *file) +{ + Evas_Object *evas, *shadow; + EPhysics_Body *body; + Dragging_Data *dragging; + + shadow = elm_layout_add(test_data->win); + elm_layout_file_set( + shadow, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "shadow-cube"); + evas_object_move(shadow, x, FLOOR_Y); + evas_object_resize(shadow, 70, 3); + evas_object_show(shadow); + test_data->evas_objs = eina_list_append(test_data->evas_objs, shadow); + + evas = elm_image_add(test_data->win); + elm_image_file_set( + evas, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", file); + evas_object_move(evas, x, y - 70); + evas_object_resize(evas, 70, 70); + evas_object_show(evas); + test_data->evas_objs = eina_list_append(test_data->evas_objs, evas); + + body = ephysics_body_box_add(test_data->world); + ephysics_body_evas_object_set(body, evas, EINA_TRUE); + ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_UPDATE, + update_object_cb, shadow); + test_data->bodies = eina_list_append(test_data->bodies, body); + test_data->data = body; + + dragging = calloc(1, sizeof(Dragging_Data)); + dragging->body = body; + ephysics_body_data_set(body, dragging); + + evas_object_event_callback_add(evas, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, + body); + evas_object_event_callback_add(evas, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, + body); + evas_object_event_callback_add(evas, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, + body); + + ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_DEL, _on_delete, + NULL); +} + +static void +_world_populate(Test_Data *test_data) +{ + _box_add(test_data, WIDTH / 3, FLOOR_Y, "blue-cube"); + _box_add(test_data, WIDTH / 3 - 70, FLOOR_Y, "purple-cube"); + _box_add(test_data, WIDTH / 3 + 70, FLOOR_Y, "purple-cube"); + _box_add(test_data, WIDTH / 3 + 140, FLOOR_Y, "blue-cube"); + _box_add(test_data, WIDTH / 3 - 35, FLOOR_Y - 70, "purple-cube"); + _box_add(test_data, WIDTH / 3 + 35, FLOOR_Y - 70, "blue-cube"); + _box_add(test_data, WIDTH / 3 + 105, FLOOR_Y - 70, "purple-cube"); + _box_add(test_data, WIDTH / 3, FLOOR_Y - 140, "blue-cube"); + _box_add(test_data, WIDTH / 3 + 70, FLOOR_Y - 140, "purple-cube"); +} + +static void +_restart(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + Test_Data *test_data = data; + + DBG("Restart pressed"); + test_clean(test_data); + _world_populate(test_data); +} + +void +test_grab(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + EPhysics_Body *boundary; + EPhysics_World *world; + Test_Data *test_data; + + if (!ephysics_init()) + return; + + test_data = test_data_new(); + test_win_add(test_data, "Grab", EINA_TRUE); + + elm_layout_signal_callback_add(test_data->layout, "restart", "test-theme", + _restart, test_data); + elm_object_signal_emit(test_data->layout, "borders,show", "ephysics_test"); + elm_object_signal_emit(test_data->layout, "grab,show", "ephysics_test"); + + world = ephysics_world_new(); + ephysics_world_render_geometry_set(world, 50, 40, WIDTH - 100, FLOOR_Y - 40); + test_data->world = world; + + boundary = ephysics_body_bottom_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.65); + ephysics_body_friction_set(boundary, 4); + + boundary = ephysics_body_right_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.4); + ephysics_body_friction_set(boundary, 3); + + boundary = ephysics_body_left_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.4); + ephysics_body_friction_set(boundary, 3); + + ephysics_body_top_boundary_add(test_data->world); + + _world_populate(test_data); +}