From 908cb7e56fec4bb1ce48e7adcc1e43bba55c55a1 Mon Sep 17 00:00:00 2001 From: Jeonghyun Yun Date: Tue, 14 Jun 2011 08:36:03 +0000 Subject: [PATCH] From: Jeonghyun Yun Subject: [E-devel] [Patch] elm_gengrid reorder mode moving effect added Dear All. I made a patch for elm_gengrid moving effect on reorder mode. You can see reorder moving effect when you reorder item. Please review this patch. ... I like! in svn! :) SVN revision: 60301 --- legacy/elementary/src/lib/elm_gengrid.c | 91 +++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/legacy/elementary/src/lib/elm_gengrid.c b/legacy/elementary/src/lib/elm_gengrid.c index 3fa78a73d9..d20588a34a 100644 --- a/legacy/elementary/src/lib/elm_gengrid.c +++ b/legacy/elementary/src/lib/elm_gengrid.c @@ -145,6 +145,7 @@ typedef struct _Pan Pan; #define PRELOAD 1 +#define REORDER_EFFECT_TIME 0.5 struct _Elm_Gengrid_Item { @@ -153,6 +154,7 @@ Evas_Object *spacer; const Elm_Gengrid_Item_Class *gic; Ecore_Timer *long_timer; + Ecore_Animator *item_moving_effect_timer; Widget_Data *wd; Eina_List *labels, *icons, *states, *icon_objs; struct @@ -161,9 +163,10 @@ const void *data; } func; - Evas_Coord x, y, dx, dy; - int relcount; - int walking; + Evas_Coord x, y, dx, dy, ox, oy, tx, ty, rx, ry; + unsigned int moving_effect_start_time; + int relcount; + int walking; struct { @@ -184,6 +187,7 @@ Eina_Bool disabled : 1; Eina_Bool selected : 1; Eina_Bool hilighted : 1; + Eina_Bool moving : 1; }; struct _Widget_Data @@ -197,7 +201,7 @@ struct _Widget_Data Elm_Gengrid_Item *last_selected_item, *reorder_item; double align_x, align_y; - Evas_Coord pan_x, pan_y; + Evas_Coord pan_x, pan_y, old_pan_x, old_pan_y; Evas_Coord item_width, item_height; /* Each item size */ Evas_Coord minw, minh; /* Total obj size */ Evas_Coord reorder_item_x, reorder_item_y; @@ -217,6 +221,7 @@ struct _Widget_Data Eina_Bool v_bounce : 1; Eina_Bool reorder_mode : 1; Eina_Bool reorder_item_changed : 1; + Eina_Bool move_effect_enabled : 1; }; #define ELM_GENGRID_ITEM_FROM_INLIST(item) \ @@ -1168,6 +1173,45 @@ _item_unrealize(Elm_Gengrid_Item *item) item->want_unrealize = EINA_FALSE; } +static Eina_Bool +_reorder_item_moving_effect_timer_cb(void *data) +{ + Elm_Gengrid_Item *item = data; + double time, t; + Evas_Coord dx, dy; + + time = REORDER_EFFECT_TIME; + t = ((0.0 > (t = ecore_loop_time_get()-item->moving_effect_start_time)) ? 0.0 : t); + dx = ((item->tx - item->ox) / 10) * _elm_config->scale; + dy = ((item->ty - item->oy) / 10) * _elm_config->scale; + + if (t <= time) + { + item->rx += (1 * sin((t / time) * (M_PI / 2)) * dx); + item->ry += (1 * sin((t / time) * (M_PI / 2)) * dy); + } + else + { + item->rx += dx; + item->ry += dy; + } + + if ((((dx > 0) && (item->rx >= item->tx)) || ((dx <= 0) && (item->rx <= item->tx))) && + (((dy > 0) && (item->ry >= item->ty)) || ((dy <= 0) && (item->ry <= item->ty)))) + { + evas_object_move(item->base.view, item->tx, item->ty); + evas_object_resize(item->base.view, item->wd->item_width, item->wd->item_height); + item->moving = EINA_FALSE; + item->item_moving_effect_timer = NULL; + return ECORE_CALLBACK_CANCEL; + } + + evas_object_move(item->base.view, item->rx, item->ry); + evas_object_resize(item->base.view, item->wd->item_width, item->wd->item_height); + + return ECORE_CALLBACK_RENEW; +} + static void _item_place(Elm_Gengrid_Item *item, Evas_Coord cx, @@ -1253,6 +1297,13 @@ _item_place(Elm_Gengrid_Item *item, evas_object_smart_callback_call(item->wd->self, SIG_REALIZED, item); if ((item->wd->reorder_mode) && (item->wd->reorder_item)) { + if (item->moving) return; + + if (!item->wd->move_effect_enabled) + { + item->ox = x; + item->oy = y; + } if (item->wd->reorder_item == item) { evas_object_move(item->base.view, @@ -1263,6 +1314,26 @@ _item_place(Elm_Gengrid_Item *item, } else { + if (item->wd->move_effect_enabled) + { + if ((item->ox != x) || (item->oy != y)) + { + if (((item->wd->old_pan_x == item->wd->pan_x) && (item->wd->old_pan_y == item->wd->pan_y)) || + ((item->wd->old_pan_x != item->wd->pan_x) && !(item->ox - item->wd->pan_x + item->wd->old_pan_x == x)) || + ((item->wd->old_pan_y != item->wd->pan_y) && !(item->oy - item->wd->pan_y + item->wd->old_pan_y == y))) + { + item->tx = x; + item->ty = y; + item->rx = item->ox; + item->ry = item->oy; + item->moving = EINA_TRUE; + item->moving_effect_start_time = ecore_loop_time_get(); + item->item_moving_effect_timer = ecore_animator_add(_reorder_item_moving_effect_timer_cb, item); + return; + } + } + } + if (ELM_RECTS_INTERSECT(item->wd->reorder_item_x, item->wd->reorder_item_y, item->wd->item_width, item->wd->item_height, x+(item->wd->item_width/2), y+(item->wd->item_height/2), @@ -1293,7 +1364,7 @@ _item_place(Elm_Gengrid_Item *item, EINA_INLIST_GET(item)); item->wd->reorder_item_changed = EINA_TRUE; - + item->wd->move_effect_enabled = EINA_TRUE; if (item->wd->calc_job) ecore_job_del(item->wd->calc_job); item->wd->calc_job = ecore_job_add(_calc_job, item->wd); @@ -1571,6 +1642,16 @@ _pan_calculate(Evas_Object *obj) if (!cx) cy++; } } + + if ((sd->wd->reorder_mode) && (sd->wd->reorder_item)) + { + if (!sd->wd->reorder_item_changed) + { + sd->wd->old_pan_x = sd->wd->pan_x; + sd->wd->old_pan_y = sd->wd->pan_y; + } + sd->wd->move_effect_enabled = EINA_FALSE; + } evas_object_smart_callback_call(sd->wd->self, SIG_CHANGED, NULL); }