[elm_stackedicon] improve performance
authorHyunsil Park <hyunsil.park@samsung.com>
Tue, 7 Sep 2010 17:00:26 +0000 (02:00 +0900)
committerHyunsil Park <hyunsil.park@samsung.com>
Tue, 7 Sep 2010 17:00:26 +0000 (02:00 +0900)
src/lib/elm_stackedicon.c

index d99b63a..879d485 100755 (executable)
@@ -15,6 +15,8 @@
 #define ELM_MAX(v1, v2)        (((v1) > (v2)) ? (v1) : (v2))\r
 #define ROT_RIGHT                      (5)\r
 #define ROT_LEFT                       (-5)\r
+#define SHOW_ITEM_NUM          3                       \r
+\r
 \r
 struct _Stackedicon_Item {\r
        Evas_Object *parent;\r
@@ -43,6 +45,7 @@ struct _Widget_Data {
        Evas_Coord x, y, w, h;\r
        Eina_Bool on_expanded : 1;\r
        Eina_Bool visible: 1;\r
+       Eina_Bool move_start: 1;\r
 };\r
 \r
 static const char *widtype = NULL;\r
@@ -57,8 +60,8 @@ static void _icon_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
 static void _icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
 static void _icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
 static void _icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
-static void _icon_move_to_zero(void *data);\r
-static int _icon_move_to_zero_cb(void *data);\r
+static void _icon_move_to_zero(Evas_Object *obj);\r
+static int _icon_move_to_zero_cb(Evas_Object *obj);\r
 static void _icon_move_map(void *data, int flag, int interval_x, int interval_y);\r
 static void _icon_map_pos(void *data, Evas_Coord x, Evas_Coord y);\r
 static void _del_image(void *data);\r
@@ -72,6 +75,8 @@ static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _show_cb(void *data, Evas * e, Evas_Object * obj, void *event_info);\r
 static void _hide_cb(void *data, Evas * e, Evas_Object * obj, void *event_info);\r
 static void _event_init(Evas_Object *obj);\r
+static void _hide_hidden_image(Evas_Object *obj);\r
+\r
 \r
 \r
 \r
@@ -195,6 +200,15 @@ static void _icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *eve
        it->mdx = ev->output.x;\r
        it->mdy = ev->output.y;\r
 \r
+       _it = NULL;\r
+       EINA_LIST_REVERSE_FOREACH(wd->list, l, _it) {\r
+               if(_it != NULL){\r
+                       if(_it->exist == EINA_FALSE) _add_image(it->parent, _it);\r
+                       evas_object_move(_it->ly, wd->x + wd->w/2 - _it->mw/2, wd->y + wd->h/2 - _it->mh/2);    \r
+                       //if(wd->visible) evas_object_show(_it->ly);\r
+               }\r
+       }\r
+\r
        EINA_LIST_REVERSE_FOREACH(wd->list, l, _it) {\r
                if(_it != NULL){\r
                        if(_it->exist == EINA_TRUE){    \r
@@ -202,6 +216,8 @@ static void _icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *eve
                        }\r
                }\r
        }\r
+\r
+       wd->move_start = TRUE;\r
 }\r
 \r
 static void _icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
@@ -212,6 +228,11 @@ static void _icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *eve
        Evas_Event_Mouse_Move *ev = event_info;\r
        if(!wd || !ev->buttons) return;\r
        \r
+       if(wd->move_start == TRUE){\r
+               _show_all_image(it->parent);\r
+               wd->move_start = FALSE;\r
+       }\r
+       \r
        if(it->on_hold == EINA_TRUE){\r
                it->mmx = ev->cur.output.x;\r
                it->mmy = ev->cur.output.y;\r
@@ -239,8 +260,9 @@ static void _icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event
                wd->interval_y = 0;\r
                \r
                _icon_move_map(wd, 0, wd->x, wd->y);            \r
+               evas_object_smart_callback_call(it->parent, "expanded", NULL);  \r
+               _hide_hidden_image(it->parent);\r
 \r
-               evas_object_smart_callback_call(it->parent, "expanded", NULL);          \r
        }else{          \r
                wd->on_expanded= EINA_FALSE;    \r
                it->on_hold = EINA_FALSE;       \r
@@ -254,7 +276,7 @@ static void _icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event
                        wd->animator = NULL;\r
                }\r
                wd->time = _current_time_get();\r
-               wd->animator= ecore_animator_add(_icon_move_to_zero_cb, wd);    \r
+               wd->animator= ecore_animator_add(_icon_move_to_zero_cb, it->parent);    \r
        }       \r
 }\r
 \r
@@ -266,9 +288,9 @@ static unsigned int _current_time_get(void)
        return ((timev.tv_sec * 1000) + ((timev.tv_usec) / 1000));\r
 }\r
 \r
-static void _icon_move_to_zero(void *data)\r
+static void _icon_move_to_zero(Evas_Object *obj)\r
 {\r
-       Widget_Data *wd = (Widget_Data *)data;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
        double t;\r
        int x, y;\r
        if(!wd) return;\r
@@ -289,14 +311,15 @@ static void _icon_move_to_zero(void *data)
                wd->interval_x = 0;\r
                wd->interval_y = 0;             \r
                _icon_move_map(wd, 0, wd->x, wd->y);\r
+               _hide_hidden_image(obj);\r
        }else{  \r
                _icon_move_map(wd, 0, wd->x + wd->interval_x - x, wd->y + wd->interval_y - y);\r
        }\r
 }\r
 \r
-static int _icon_move_to_zero_cb(void *data)\r
+static int _icon_move_to_zero_cb(Evas_Object *obj)\r
 {      \r
-       _icon_move_to_zero(data);\r
+       _icon_move_to_zero(obj);\r
        \r
        return EXIT_FAILURE;\r
 }\r
@@ -433,10 +456,12 @@ static void _update_stackedicon(Evas_Object *obj)
        if (!wd || ((wd->w == 1) && (wd->h == 1))) return;\r
 \r
        EINA_LIST_REVERSE_FOREACH(wd->list, l, it) {\r
+               if(it->index >= SHOW_ITEM_NUM){\r
+                       if(it->ly) evas_object_hide(it->ly);\r
+                       continue;\r
+               }\r
                if(it != NULL){\r
-                       if(it->exist == EINA_FALSE){    \r
-                               _add_image(obj, it);\r
-                       }\r
+                       if(it->exist == EINA_FALSE) _add_image(obj, it);\r
                        evas_object_move(it->ly, wd->x + wd->w/2 - it->mw/2, wd->y + wd->h/2 - it->mh/2);       \r
                        if(wd->visible) evas_object_show(it->ly);\r
                }\r
@@ -481,6 +506,33 @@ static void _hide_all_image(Evas_Object *obj)
        }\r
 }\r
 \r
+static void _hide_hidden_image(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       Eina_List *l;\r
+       Elm_Stackedicon_Item *it = NULL;\r
+       if (!wd) return;\r
+                       \r
+       EINA_LIST_REVERSE_FOREACH(wd->list, l, it) {\r
+               if(it->index >= SHOW_ITEM_NUM){\r
+                       if(it->ly) evas_object_hide(it->ly);\r
+               }\r
+       }\r
+}\r
+\r
+static void\r
+_parent_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(data);\r
+       Evas_Coord w, h;        \r
+       if (!wd) return;\r
+\r
+       evas_object_geometry_get(obj, NULL, NULL, &w, &h);      \r
+       if(wd->clip) evas_object_resize(wd->clip, w, h);\r
+       \r
+       //_update_stackedicon(data);\r
+}\r
+\r
 static void\r
 _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
 {\r
@@ -544,6 +596,10 @@ _event_init(Evas_Object *obj)
        Widget_Data *wd = elm_widget_data_get(obj);\r
        if (!wd) return;\r
 \r
+       Evas_Object *parent = elm_widget_parent_get(obj);\r
+       if(parent)\r
+               evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _parent_resize_cb, obj);\r
+       \r
        evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
        evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move_cb, obj); \r
        evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _show_cb, obj);\r
@@ -614,10 +670,12 @@ EAPI Elm_Stackedicon_Item *elm_stackedicon_item_append(Evas_Object *obj, const c
        it->parent = obj;\r
        it->ly = NULL;\r
        it->ic = NULL;\r
+       it->pad = NULL;\r
        it->index = eina_list_count(wd->list);\r
        it->exist = EINA_FALSE; \r
        wd->list = eina_list_append(wd->list, it);\r
 \r
+       if(it->index < SHOW_ITEM_NUM)\r
        _update_stackedicon(obj);\r
 \r
        return it;\r
@@ -645,10 +703,12 @@ EAPI Elm_Stackedicon_Item *elm_stackedicon_item_prepend(Evas_Object *obj, const
        it->parent = obj;\r
        it->ly = NULL;\r
        it->ic = NULL;\r
+       it->pad = NULL;\r
        it->index = eina_list_count(wd->list);\r
        it->exist = EINA_FALSE; \r
        wd->list = eina_list_prepend(wd->list, it);\r
 \r
+       if(it->index < SHOW_ITEM_NUM)\r
        _update_stackedicon(obj);\r
 \r
        return it;\r