transit: add bezier curve tween mode example
authorChunEon Park <hermet@hermet.pe.kr>
Thu, 18 Dec 2014 05:33:06 +0000 (14:33 +0900)
committerChunEon Park <hermet@hermet.pe.kr>
Thu, 18 Dec 2014 05:33:47 +0000 (14:33 +0900)
src/bin/Makefile.am
src/bin/test.c
src/bin/test_transit_bezier.c [new file with mode: 0644]

index a736b59..fbddf40 100644 (file)
@@ -117,6 +117,7 @@ test_thumb.c \
 test_toolbar.c \
 test_tooltip.c \
 test_transit.c \
+test_transit_bezier.c \
 test_video.c \
 test_weather.c \
 test_web.c \
index 0fd2318..229e3f8 100644 (file)
@@ -35,6 +35,7 @@ void test_transit_flip(void *data, Evas_Object *obj, void *event_info);
 void test_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info);
 void test_transit_resizing(void *data, Evas_Object *obj, void *event_info);
 void test_transit_zoom(void *data, Evas_Object *obj, void *event_info);
+void test_transit_bezier(void *data, Evas_Object *obj, void *event_info);
 void test_fileselector_button(void *data, Evas_Object *obj, void *event_info);
 void test_fileselector_entry(void *data, Evas_Object *obj, void *event_info);
 void test_clock(void *data, Evas_Object *obj, void *event_info);
@@ -596,6 +597,7 @@ add_tests:
             test_transit_resizable_flip);
    ADD_TEST(NULL, "Effects", "Transit Custom", test_transit_custom);
    ADD_TEST(NULL, "Effects", "Transit Chain", test_transit_chain);
+   ADD_TEST(NULL, "Effects", "Transit Bezier", test_transit_bezier);
    ADD_TEST(NULL, "Effects", "Flip", test_flip);
    ADD_TEST(NULL, "Effects", "Flip 2", test_flip2);
    ADD_TEST(NULL, "Effects", "Flip 3", test_flip3);
diff --git a/src/bin/test_transit_bezier.c b/src/bin/test_transit_bezier.c
new file mode 100644 (file)
index 0000000..fe4c6d8
--- /dev/null
@@ -0,0 +1,285 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include <Elementary.h>
+
+#define SEGMENT_MAX 200
+#define WIN_W 400
+#define BTN_SIZE 50
+#define WIN_H (400 + BTN_SIZE)
+#define CTRL_W 15
+#define CTRL_H 15
+
+typedef struct
+{
+   Evas *e;
+   Evas_Object *win;
+   Evas_Object *ctrl_pt1;
+   Evas_Object *ctrl_pt2;
+   Evas_Object *ctrl_pt1_line;
+   Evas_Object *ctrl_pt2_line;
+   Evas_Object *label;
+   Evas_Object *line[SEGMENT_MAX];
+   Eina_Bool ctrl_pt1_down;
+   Eina_Bool ctrl_pt2_down;
+} transit_data;
+
+static void
+v_get(transit_data *td, double *v1, double *v2, double *v3, double *v4)
+{
+   Evas_Coord x, w, y, h;
+
+   //update control points values
+   evas_object_geometry_get(td->ctrl_pt1, &x, &y, &w, &h);
+   *v1 = (double) (x - (w/2)) / WIN_W;
+   *v2 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE);
+
+   evas_object_geometry_get(td->ctrl_pt2, &x, &y, &w, &h);
+   *v3 = (double) (x - (w/2)) / WIN_W;
+   *v4 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE);
+}
+
+static void
+update_curve(transit_data *td)
+{
+   double v[4];
+   int i = 0;
+   double progress;
+   Evas_Coord prev_x = 0, prev_y = (WIN_H - BTN_SIZE);
+   Evas_Coord cur_x, cur_y;
+   double tx, ty;
+   char buf[256];
+
+   v_get(td, &v[0], &v[1], &v[2], &v[3]);
+
+   for (i = 0; i < SEGMENT_MAX; i++)
+     {
+        progress = (((double) i) / (SEGMENT_MAX - 1));
+
+        tx = (pow((1 - progress), 3) * 0) + (3 * progress * pow((1 - progress), 2) * v[0]) + (3 * pow(progress, 2) * (1 - progress) * v[2]) + (pow(progress, 3) * 1);
+        ty = (pow((1 - progress), 3) * 0) + (3 * progress * pow((1 - progress), 2) * v[1]) + (3 * pow(progress, 2) * (1 - progress) * v[3]) + (pow(progress, 3) * 1);
+        if (!td->line[i])
+          {
+             td->line[i] = evas_object_line_add(td->e);
+             evas_object_resize(td->line[i], WIN_W, (WIN_H - BTN_SIZE));
+             evas_object_show(td->line[i]);
+          }
+
+        cur_x = (int)(tx * WIN_W);
+        cur_y = ((WIN_H - BTN_SIZE - 1) - ((int)(ty * (WIN_H - BTN_SIZE))));
+        evas_object_line_xy_set(td->line[i], prev_x, prev_y, cur_x, cur_y);
+        evas_object_anti_alias_set(td->line[i], EINA_TRUE);
+        evas_object_color_set(td->line[i], 255, 50, 50, 255);
+        prev_x = cur_x;
+        prev_y = cur_y;
+     }
+   snprintf(buf, sizeof(buf),
+            "<align=left>Control Points (%0.2f, %0.2f, %0.2f, %0.2f)\n</align>",
+            v[0], v[1], v[2], v[3]);
+   elm_object_text_set(td->label, buf);
+}
+
+static void
+ctrl_pt1_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   transit_data *td = data;
+   Evas_Coord x, y, w, h;
+
+   if (!td->ctrl_pt1_down) return;
+
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+   x = (ev->cur.canvas.x - (w/2));
+   y = (ev->cur.canvas.y - (h/2));
+   if (x < 0) x = 0;
+   if (y < 0) y = 0;
+   if (x > WIN_W) x = WIN_W - (w/2);
+   if (y > WIN_H) y = WIN_H - (h/2);
+   evas_object_move(obj, x, y);
+   evas_object_line_xy_set(td->ctrl_pt1_line,
+                           (x + (w/2)), (y + (h/2)), 0, WIN_W);
+   update_curve(td);
+}
+
+static void
+ctrl_pt2_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   transit_data *td = data;
+   Evas_Coord x, y, w, h;
+
+   if (!td->ctrl_pt2_down) return;
+
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+   x = (ev->cur.canvas.x - (w/2));
+   y = (ev->cur.canvas.y - (h/2));
+   if (x < 0) x = 0;
+   if (y < 0) y = 0;
+   if (x > WIN_W) x = WIN_W - (w/2);
+   if (y > WIN_H) y = WIN_H - (h/2);
+   evas_object_move(obj, x, y);
+   evas_object_line_xy_set(td->ctrl_pt2_line,
+                           (x + (w/2)), (y + (h/2)), WIN_W, 0);
+   update_curve(td);
+}
+
+static void
+ctrl_pt1_mouse_down_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   transit_data *td = data;
+   td->ctrl_pt1_down = EINA_TRUE;
+}
+
+static void
+ctrl_pt1_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
+                     Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   transit_data *td = data;
+   td->ctrl_pt1_down = EINA_FALSE;
+}
+
+static void
+ctrl_pt2_mouse_down_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   transit_data *td = data;
+   td->ctrl_pt2_down = EINA_TRUE;
+}
+
+static void
+ctrl_pt2_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
+                     Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   transit_data *td = data;
+   td->ctrl_pt2_down = EINA_FALSE;
+}
+
+static void
+transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
+{
+   transit_data *td = data;
+   evas_object_show(td->ctrl_pt1);
+   evas_object_show(td->ctrl_pt2);
+   evas_object_show(td->ctrl_pt1_line);
+   evas_object_show(td->ctrl_pt2_line);
+}
+
+static void
+btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   double v[4];
+   transit_data *td = data;
+   v_get(td, &v[0], &v[1], &v[2], &v[3]);
+
+   Elm_Transit *transit = elm_transit_add();
+   elm_transit_object_add(transit, obj);
+   elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
+   elm_transit_tween_mode_factor_n_set(transit, 4, v);
+   elm_transit_effect_translation_add(transit, 0, 0, 350, 0);
+   elm_transit_auto_reverse_set(transit, EINA_TRUE);
+   elm_transit_del_cb_set(transit, transit_del_cb, td);
+   elm_transit_duration_set(transit, 1);
+   elm_transit_go(transit);
+
+   evas_object_hide(td->ctrl_pt1);
+   evas_object_hide(td->ctrl_pt2);
+   evas_object_hide(td->ctrl_pt1_line);
+   evas_object_hide(td->ctrl_pt2_line);
+}
+
+void
+test_transit_bezier(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   static transit_data td;
+   Evas_Object *bg;
+   char buf[PATH_MAX];
+
+   memset(&td, 0x0, sizeof(td));
+
+   //Win
+   td.win = elm_win_add(NULL, "test",  ELM_WIN_BASIC);
+   elm_win_title_set(td.win, "Transit Tween Bezier Curve");
+   elm_win_autodel_set(td.win, EINA_TRUE);
+
+   td.e = evas_object_evas_get(td.win);
+
+   //BG. Fix window size
+   bg = elm_bg_add(td.win);
+   evas_object_size_hint_min_set(bg, WIN_W, WIN_H);
+   elm_win_resize_object_add(td.win, bg);
+   evas_object_show(bg);
+
+   snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
+
+   //Control Point 1 Line
+   td.ctrl_pt1_line = evas_object_line_add(td.e);
+   evas_object_pass_events_set(td.ctrl_pt1_line, EINA_TRUE);
+   evas_object_resize(td.ctrl_pt1_line, WIN_W, WIN_H);
+   evas_object_anti_alias_set(td.ctrl_pt1_line, EINA_TRUE);
+   evas_object_color_set(td.ctrl_pt1_line, 0, 174, 219, 255);
+   evas_object_line_xy_set(td.ctrl_pt1_line, 0, WIN_W,
+                           (100 + (CTRL_W/2)) , (300 + (CTRL_H/2)));
+   evas_object_show(td.ctrl_pt1_line);
+
+   //Control Point 1
+   td.ctrl_pt1 = evas_object_image_filled_add(td.e);
+   evas_object_image_file_set(td.ctrl_pt1, buf, NULL);
+   evas_object_resize(td.ctrl_pt1, CTRL_W, CTRL_H);
+   evas_object_move(td.ctrl_pt1, 100, 300);
+   evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_MOVE,
+                                  ctrl_pt1_mouse_move_cb, &td);
+   evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_DOWN,
+                                  ctrl_pt1_mouse_down_cb, &td);
+   evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_UP,
+                                  ctrl_pt1_mouse_up_cb, &td);
+   evas_object_show(td.ctrl_pt1);
+
+   //Control Point 2 Line
+   td.ctrl_pt2_line = evas_object_line_add(td.e);
+   evas_object_pass_events_set(td.ctrl_pt2_line, EINA_TRUE);
+   evas_object_resize(td.ctrl_pt2_line, WIN_W, WIN_H);
+   evas_object_anti_alias_set(td.ctrl_pt2_line, EINA_TRUE);
+   evas_object_color_set(td.ctrl_pt2_line, 219, 174, 0, 255);
+   evas_object_line_xy_set(td.ctrl_pt2_line, WIN_W, 0,
+                           (300 + (CTRL_W/2)), (100 + (CTRL_H/2)));
+   evas_object_show(td.ctrl_pt2_line);
+
+   //Control Point 2
+   td.ctrl_pt2 = evas_object_image_filled_add(td.e);
+   evas_object_image_file_set(td.ctrl_pt2, buf, NULL);
+   evas_object_resize(td.ctrl_pt2, CTRL_W, CTRL_H);
+   evas_object_move(td.ctrl_pt2, 300, 100);
+   evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_MOVE,
+                                  ctrl_pt2_mouse_move_cb, &td);
+   evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_DOWN,
+                                  ctrl_pt2_mouse_down_cb, &td);
+   evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_UP,
+                                  ctrl_pt2_mouse_up_cb, &td);
+   evas_object_show(td.ctrl_pt2);
+
+   //Label
+   td.label = elm_label_add(td.win);
+   evas_object_resize(td.label, WIN_W, 25);
+   evas_object_pass_events_set(td.label, EINA_TRUE);
+   evas_object_show(td.label);
+
+   //Button
+   Evas_Object *btn = elm_button_add(td.win);
+   elm_object_text_set(btn, "Go");
+   evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, &td);
+   evas_object_resize(btn, BTN_SIZE, BTN_SIZE);
+   evas_object_move(btn, 0, (WIN_H - BTN_SIZE));
+   evas_object_show(btn);
+
+   update_curve(&td);
+
+   evas_object_resize(td.win, WIN_W, WIN_H);
+   evas_object_show(td.win);
+}