+++ /dev/null
-/*\r
- * SLP\r
- * Copyright (c) 2009 Samsung Electronics, Inc.\r
- * All rights reserved.\r
- *\r
- * This software is a confidential and proprietary information\r
- * of Samsung Electronics, Inc. ("Confidential Information"). You\r
- * shall not disclose such Confidential Information and shall use\r
- * it only in accordance with the terms of the license agreement\r
- * you entered into with Samsung Electronics.\r
- */\r
-\r
-\r
-/**\r
- * @defgroup Diskcontroller Diskcontroller\r
- * @ingroup Elementary\r
- *\r
- * This is a Diskcontroller. It can contain label and icon objects.\r
- */\r
-\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-#include <Elementary.h>\r
-#include "elm_priv.h"\r
-\r
-#ifndef EAPI\r
-#define EAPI __attribute__ ((visibility("default")))\r
-#endif\r
-\r
-#define MAX_ARGS 512\r
-#define SCROLLED_DISTANCE 215\r
-#define STANDARD_W 480\r
-#define SIDE_STRING_LENGTH 3\r
-#define SIDE_POINT 50\r
-\r
-#define _EDJ(x) (Evas_Object *)elm_layout_edje_get(x)\r
-\r
-// internal data structure of diskcontroller object\r
-typedef struct _Widget_Data Widget_Data;\r
-\r
-struct _Widget_Data\r
-{\r
- Evas_Object *object;\r
- Evas_Object *parent;\r
- Evas_Object *edje;\r
- Evas_Object *scroller;\r
- Evas_Object *main_box;\r
- Evas_Object *left_blank;\r
- Evas_Object *right_blank;\r
-\r
- Elm_Diskcontroller_Item *selected_item;\r
- Elm_Diskcontroller_Item *first;\r
- Elm_Diskcontroller_Item *second;\r
- Elm_Diskcontroller_Item *s_last;\r
- Elm_Diskcontroller_Item *last;\r
-\r
- Eina_List *items;\r
- Eina_List *r_items;\r
-\r
- Evas_Coord x, y, w, h;\r
-\r
- Ecore_Idler *i;\r
- int item_num;\r
- int round;\r
- int stop;\r
- double time;\r
-\r
-\r
- Ecore_Idler *idler;\r
- Ecore_Idler *check_idler;\r
- Eina_Bool flag;\r
- Eina_Bool init;\r
-\r
- Ecore_Event_Handler *move_event;\r
- Ecore_Event_Handler *up_event;\r
-};\r
-\r
-struct _Elm_Diskcontroller_Item\r
-{\r
- Evas_Object *obj;\r
- Evas_Object *base;\r
- Evas_Object *icon;\r
- const char *label;\r
- void (*func)(void *data, Evas_Object *obj, void *event_info);\r
- const void *data;\r
-};\r
-\r
-static void _del_hook(Evas_Object *obj);\r
-static void _theme_hook(Evas_Object *obj);\r
-static void _sizing_eval(Evas_Object *obj);\r
-static void _sub_del(void *data, Evas_Object *obj, void *event_info);\r
-\r
-static void _diskcontroller_object_move(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
-static void _diskcontroller_object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
-static void _diskcontroller_object_show(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
-static void _diskcontroller_object_hide(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
-\r
-static void\r
-_del_hook(Evas_Object *obj)\r
-{\r
- Widget_Data *wd = elm_widget_data_get(obj);\r
- Elm_Diskcontroller_Item *item;\r
-\r
- if (!wd) return;\r
-\r
- if (wd->main_box) {\r
- evas_object_del(wd->main_box);\r
- wd->main_box = NULL;\r
- }\r
-\r
- if (wd->scroller) {\r
- evas_object_del(wd->scroller);\r
- wd->scroller = NULL;\r
- }\r
-\r
- if (wd->edje) {\r
- evas_object_del(wd->edje);\r
- wd->edje = NULL;\r
- }\r
-\r
- EINA_LIST_FREE(wd->items, item){\r
- eina_stringshare_del(item->label);\r
- if(item->icon) evas_object_del(item->icon);\r
- if(item->base) evas_object_del(item->base);\r
- free(item);\r
- item = NULL;\r
- }\r
-\r
- free(wd);\r
- wd = NULL;\r
-}\r
-\r
-static void\r
-_theme_hook(Evas_Object *obj)\r
-{\r
- Eina_List *l;\r
- Elm_Diskcontroller_Item *it;\r
- Widget_Data *wd = elm_widget_data_get(obj);\r
- if (!wd) return;\r
-\r
- _elm_theme_object_set(obj, wd->edje, "diskcontroller", "bg", elm_widget_style_get(obj));\r
-\r
- if(wd->round){\r
- EINA_LIST_FOREACH(wd->r_items, l, it) {\r
- elm_layout_theme_set(it->base, "diskcontroller", "item", "default");\r
- }\r
- }else{\r
- EINA_LIST_FOREACH(wd->items, l, it) {\r
- elm_layout_theme_set(it->base, "diskcontroller", "item", "default");\r
- }\r
- }\r
-\r
-}\r
-\r
-static void\r
-_sub_del(void *data, Evas_Object *obj, void *event_info)\r
-{\r
- Widget_Data *wd = elm_widget_data_get(obj);\r
- //Evas_Object *sub = event_info;\r
- if (!wd) return;\r
- /*\r
- if (sub == wd->icon)\r
- {\r
- edje_object_signal_emit(wd->btn, "elm,state,icon,hidden", "elm");\r
- evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS,\r
- _changed_size_hints, obj);\r
- wd->icon = NULL;\r
- edje_object_message_signal_process(wd->btn);\r
- _sizing_eval(obj);\r
- }\r
- */\r
-}\r
-\r
-static void\r
-_sizing_eval(Evas_Object *obj)\r
-{\r
- Widget_Data *wd = elm_widget_data_get(obj);\r
-\r
- if (!wd) return;\r
-\r
- DBG("[%s]\n", __func__);\r
-\r
- _diskcontroller_object_move(obj, NULL, obj, NULL);\r
- _diskcontroller_object_resize(obj, NULL, obj, NULL);\r
-}\r
-\r
-static void select_item(Elm_Diskcontroller_Item *it)\r
-{\r
- if(it == NULL) return;\r
-\r
- Widget_Data *wd = elm_widget_data_get(it->obj);\r
- wd->selected_item = it;\r
-\r
- if(it->func) it->func((void *)(it->data), it->obj, it);\r
- evas_object_smart_callback_call(it->obj, "stop", it);\r
-}\r
-\r
-static void string_signal_emit(Elm_Diskcontroller_Item *it)\r
-{\r
- char buf[MAX_ARGS];\r
-\r
- if(strlen(it->label) > 14){\r
- if(strlen(it->label) < 18){\r
- edje_object_signal_emit(_EDJ(it->base), "elm,state,center_small", "elm");\r
- }else{\r
- strncpy(buf, it->label, 40);\r
- buf[40] = '\0';\r
- edje_object_part_text_set(_EDJ(it->base), "elm.text", buf);\r
- edje_object_signal_emit(_EDJ(it->base), "elm,state,center_small", "elm");\r
- }\r
- }else{\r
- edje_object_signal_emit(_EDJ(it->base), "elm,state,center", "elm");\r
- }\r
-}\r
-\r
-static int check_letter(const char *str, int length)\r
-{\r
- int code = str[length];\r
-\r
- if(code == '\0') return length; // null string\r
- else if(isalnum(code)) return length; // alphabet or number\r
- else if ((33<=code && code<47) || (58<=code && code<64) || (91<=code && code<96) || (123<=code && code<126)) return length; // special letter\r
-\r
- return length-1;\r
-}\r
-\r
-static Eina_Bool check_string(void *data)\r
-{\r
- Eina_List *l;\r
- Elm_Diskcontroller_Item *it;\r
- Evas_Coord x, y, w, h;\r
- int mid, step, length, diff, side;\r
- char buf[MAX_ARGS];\r
- Widget_Data *wd = (Widget_Data *)data;\r
- Eina_List *list;\r
-\r
- if(wd->w <= 0) return EXIT_FAILURE;\r
- if(!wd->init) return EXIT_FAILURE;\r
-\r
- if(!wd->round) list = wd->items;\r
- else list = wd->r_items;\r
- \r
- EINA_LIST_FOREACH(list, l, it) {\r
- evas_object_geometry_get(it->base, &x, &y, &w, &h);\r
- mid = (int)(x + w/2);\r
- if(mid <= -SCROLLED_DISTANCE || mid >= wd->w+SCROLLED_DISTANCE) continue;\r
-\r
- side = MIN(SIDE_STRING_LENGTH, strlen(it->label));\r
-\r
- step = strlen(it->label)-side+1;\r
- if(mid <= wd->x + wd->w/2){\r
- diff = (wd->x + wd->w/2) - mid;\r
- }else{\r
- diff = mid - (wd->x + wd->w/2);\r
- }\r
-\r
- length = strlen(it->label) - (int)(diff/(int)(wd->w*SCROLLED_DISTANCE/STANDARD_W/step));\r
- if(mid - wd->x <= wd->w*SIDE_POINT/STANDARD_W || mid - wd->x >= wd->w-wd->w*SIDE_POINT/STANDARD_W){\r
- edje_object_signal_emit(_EDJ(it->base), "elm,state,side", "elm");\r
- }else{\r
- string_signal_emit(it);\r
- }\r
- length = MAX(length, side);\r
- length = check_letter(it->label, length);\r
- strncpy(buf, it->label, length);\r
- buf[length] = '\0';\r
- edje_object_part_text_set(_EDJ(it->base), "elm.text", buf);\r
- }\r
-\r
- if(wd->check_idler) ecore_idler_del(wd->check_idler);\r
- wd->check_idler = NULL;\r
-\r
- return EXIT_SUCCESS;\r
-}\r
-\r
-static void scroller_move_cb(void *data, Evas_Object *obj, void *event_info)\r
-{\r
- Evas_Coord x, y, w, h;\r
- Widget_Data *wd = (Widget_Data *)data;\r
- \r
- check_string(wd);\r
-\r
- if(wd->round) {\r
- elm_scroller_region_get(wd->scroller, &x, &y, &w, &h);\r
-\r
- if(x > 100000 || x < -100000){\r
- elm_scroller_region_show(wd->scroller, 0, y, w, h);\r
- return;\r
- }\r
- if(x > wd->w*SCROLLED_DISTANCE/STANDARD_W*(wd->item_num+1)){\r
- elm_scroller_region_show(wd->scroller, x-wd->w*SCROLLED_DISTANCE/STANDARD_W*wd->item_num, y, w, h);\r
- }else if(x < wd->w*SCROLLED_DISTANCE/STANDARD_W*(1)){\r
- elm_scroller_region_show(wd->scroller, x+wd->w*SCROLLED_DISTANCE/STANDARD_W*wd->item_num, y, w, h);\r
- }\r
- }\r
-\r
- wd->stop = 0;\r
-}\r
-\r
-static void scroller_stop_cb(void *data, Evas_Object *obj, void *event_info)\r
-{\r
- Widget_Data *wd = (Widget_Data *)data;\r
- Eina_List *l;\r
- Elm_Diskcontroller_Item *it;\r
- Evas_Coord x,y,w,h;\r
- Eina_List *list;\r
-\r
- if(!wd->round) list = wd->items;\r
- else list = wd->r_items;\r
-\r
- if(wd->idler != NULL) return;\r
-\r
- EINA_LIST_FOREACH(list, l, it) {\r
- evas_object_geometry_get(it->base, &x, &y, &w, &h);\r
- if(abs((int)(wd->w/2 - (int)(x + w/2))) < 10) break;\r
- }\r
-\r
- if(it == NULL) return;\r
-\r
- select_item(it);\r
-\r
- wd->stop = 1;\r
-}\r
-\r
-static Eina_Bool move_scroller(void *data)\r
-{\r
- Widget_Data *wd = (Widget_Data *)data;\r
- Eina_List *l;\r
- Elm_Diskcontroller_Item *dit;\r
- Evas_Coord x, y, w, h; \r
- int i;\r
-\r
- if(wd->round) i = 1;\r
- else i = 0;\r
-\r
- EINA_LIST_FOREACH(wd->items, l, dit){\r
- if(wd->selected_item == dit) break;\r
- i++;\r
- }\r
-\r
- if(dit == NULL) {\r
- wd->selected_item = (Elm_Diskcontroller_Item *)eina_list_nth(wd->items, 0);\r
- return EXIT_FAILURE;\r
- }\r
-\r
- elm_scroller_region_get(wd->scroller, &x, &y, &w, &h);\r
- elm_scroller_region_show(wd->scroller, wd->w*SCROLLED_DISTANCE/STANDARD_W*i+1, y, w, h);\r
- elm_scroller_region_get(wd->scroller, &x, &y, &w, &h);\r
-\r
- select_item(dit);\r
-\r
- if(wd->idler){\r
- ecore_idler_del(wd->idler);\r
- wd->idler = NULL;\r
- }\r
-\r
- wd->init = EINA_TRUE;\r
-\r
- check_string(wd);\r
-\r
- return EXIT_SUCCESS;\r
-}\r
-\r
-static Elm_Diskcontroller_Item *item_new(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)\r
-{\r
- Elm_Diskcontroller_Item *it;\r
- Widget_Data *wd;\r
-\r
- if(obj == NULL) return NULL;\r
- wd = elm_widget_data_get(obj);\r
- if(wd == NULL) return NULL;\r
-\r
- it = ELM_NEW(Elm_Diskcontroller_Item);\r
- if(it == NULL) return NULL;\r
-\r
- it->obj = obj;\r
- it->label = eina_stringshare_add(label);\r
- it->icon = icon;\r
- it->func = func;\r
- it->data = data;\r
- it->base = elm_layout_add(wd->edje);\r
- if(it->base == NULL) return NULL;\r
- elm_layout_theme_set(it->base, "diskcontroller", "item", "default");\r
- evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
- evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
- evas_object_show(it->base);\r
- elm_widget_sub_object_add(obj, it->base);\r
-\r
- if (it->label){\r
- //string_signal_emit(it);\r
- edje_object_part_text_set(_EDJ(it->base), "elm.text", it->label);\r
- }\r
-\r
- if (it->icon){\r
-// int ms = 0;\r
-\r
-// ms = ((double)wd->icon_size * _elm_config->scale);\r
- evas_object_size_hint_min_set(it->icon, 24, 24);\r
- evas_object_size_hint_max_set(it->icon, 40, 40);\r
- edje_object_part_swallow(_EDJ(it->base), "elm.swallow.icon", it->icon);\r
- evas_object_show(it->icon);\r
- elm_widget_sub_object_add(obj, it->icon);\r
- }\r
-\r
- if (it->label && it->icon){\r
- edje_object_signal_emit(_EDJ(it->base), "elm,state,icon_text", "elm");\r
- }\r
-\r
- return it;\r
-}\r
-\r
-static void dummy_item_del(void *data)\r
-{\r
- Widget_Data *wd = (Widget_Data *)data;\r
-\r
- if(wd->last){\r
- elm_box_unpack(wd->main_box, wd->last->base);\r
- wd->r_items = eina_list_remove(wd->r_items, wd->last);\r
- evas_object_del(wd->last->base);\r
- free(wd->last);\r
- wd->last = NULL;\r
- }\r
- if(wd->s_last){\r
- elm_box_unpack(wd->main_box, wd->s_last->base);\r
- wd->r_items = eina_list_remove(wd->r_items, wd->s_last);\r
- evas_object_del(wd->s_last->base);\r
- free(wd->s_last);\r
- wd->s_last = NULL;\r
- }\r
- if(wd->second){\r
- elm_box_unpack(wd->main_box, wd->second->base);\r
- wd->r_items = eina_list_remove(wd->r_items, wd->second);\r
- evas_object_del(wd->second->base);\r
- free(wd->second);\r
- wd->second = NULL;\r
- }\r
- if(wd->first){\r
- elm_box_unpack(wd->main_box, wd->first->base);\r
- wd->r_items = eina_list_remove(wd->r_items, wd->first);\r
- evas_object_del(wd->first->base);\r
- free(wd->first);\r
- wd->first = NULL;\r
- }\r
-}\r
-\r
-static void dummy_item_add(void *data)\r
-{\r
- Widget_Data *wd = (Widget_Data *)data;\r
- Elm_Diskcontroller_Item *dit;\r
- Elm_Diskcontroller_Item *it;\r
-\r
- dit = it = eina_list_nth(wd->items, 0);\r
- if(it != NULL){\r
- wd->first = item_new(it->obj, it->icon, it->label, it->func, it->data);\r
- wd->r_items = eina_list_append(wd->r_items, wd->first);\r
- }\r
- it = eina_list_nth(wd->items, 1);\r
- if(it != NULL){\r
- wd->second = item_new(it->obj, it->icon, it->label, it->func, it->data);\r
- wd->r_items = eina_list_append(wd->r_items, wd->second);\r
- }else{\r
- wd->second = item_new(dit->obj, dit->icon, dit->label, dit->func, dit->data);\r
- wd->r_items = eina_list_append(wd->r_items, wd->second);\r
- }\r
- it = eina_list_nth(wd->items, wd->item_num-1);\r
- if(it != NULL && wd->last == NULL){\r
- wd->last = item_new(it->obj, it->icon, it->label, it->func, it->data);\r
- wd->r_items = eina_list_prepend(wd->r_items, wd->last);\r
- }else{\r
- wd->last = item_new(dit->obj, dit->icon, dit->label, dit->func, dit->data);\r
- wd->r_items = eina_list_prepend(wd->r_items, wd->last);\r
- }\r
- it = eina_list_nth(wd->items, wd->item_num-2);\r
- if(it != NULL && wd->s_last == NULL){\r
- wd->s_last = item_new(it->obj, it->icon, it->label, it->func, it->data);\r
- wd->r_items = eina_list_prepend(wd->r_items, wd->s_last);\r
- }else{\r
- wd->s_last = item_new(dit->obj, dit->icon, dit->label, dit->func, dit->data);\r
- wd->r_items = eina_list_prepend(wd->r_items, wd->s_last);\r
- }\r
-}\r
-\r
-/**\r
- * Add a new diskcontroller object\r
- *\r
- * @param parent The parent object\r
- * @return The new object or NULL if it cannot be created\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI Evas_Object *elm_diskcontroller_add(Evas_Object *parent)\r
-{\r
- Evas_Object *obj = NULL;\r
- Widget_Data *wd = NULL;\r
- Evas_Coord x, y, w, h;\r
- Evas *e;\r
-\r
- wd = ELM_NEW(Widget_Data);\r
- e = evas_object_evas_get(parent);\r
- if (e == NULL) return NULL;\r
- obj = elm_widget_add(e);\r
- if(obj == NULL) return NULL;\r
- elm_widget_type_set(obj, "diskcontroller");\r
- elm_widget_sub_object_add(parent, obj);\r
- elm_widget_data_set(obj, wd);\r
- elm_widget_del_hook_set(obj, _del_hook);\r
- elm_widget_theme_hook_set(obj, _theme_hook);\r
-\r
- // initialization\r
- wd->parent = parent;\r
- evas_object_geometry_get(parent, &x, &y, &w, &h);\r
- wd->object = obj;\r
- wd->x = x;\r
- wd->y = y;\r
- wd->w = w;\r
- wd->h = h;\r
- wd->item_num = 0;\r
- wd->round = 0;\r
- wd->stop = 0;\r
- wd->init = EINA_FALSE;\r
-\r
- /* load background edj */\r
- wd->edje = edje_object_add(e);\r
- _elm_theme_object_set(obj, wd->edje, "diskcontroller", "bg", "default");\r
- if(wd->edje == NULL) {\r
- printf("Cannot load bg edj\n");\r
- return NULL;\r
- }\r
-\r
- evas_object_show(wd->edje);\r
-\r
- evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE, _diskcontroller_object_resize, obj);\r
- evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _diskcontroller_object_move, obj);\r
- evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _diskcontroller_object_show, obj);\r
- evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _diskcontroller_object_hide, obj);\r
-\r
- wd->scroller = elm_scroller_add(wd->edje);\r
- elm_scroller_policy_set(wd->scroller, ELM_SMART_SCROLLER_POLICY_OFF, ELM_SMART_SCROLLER_POLICY_OFF);\r
- elm_scroller_bounce_set(wd->scroller, 1, 0);\r
- elm_scroller_page_size_set(wd->scroller, (int)(wd->w*SCROLLED_DISTANCE/STANDARD_W), 0);\r
- edje_object_part_swallow(wd->edje, "elm.scroller", wd->scroller);\r
-\r
- evas_object_smart_callback_add(wd->scroller, "scroll", scroller_move_cb, wd);\r
- evas_object_smart_callback_add(wd->scroller, "scroll,anim,stop", scroller_stop_cb, wd);\r
-\r
- wd->main_box = elm_box_add(wd->edje);\r
- elm_box_horizontal_set(wd->main_box, 1);\r
- elm_box_homogenous_set(wd->main_box, 2);\r
- evas_object_show(wd->main_box);\r
- evas_object_size_hint_weight_set(wd->main_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
- evas_object_size_hint_align_set(wd->main_box, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
-\r
- wd->left_blank = elm_layout_add(wd->edje);\r
- if(wd->left_blank == NULL) return NULL;\r
- elm_layout_theme_set(wd->left_blank, "diskcontroller", "item", "default");\r
- evas_object_size_hint_weight_set(wd->left_blank, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
- evas_object_size_hint_align_set(wd->left_blank, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
- evas_object_show(wd->left_blank);\r
- elm_box_pack_end(wd->main_box, wd->left_blank);\r
- elm_widget_sub_object_add(obj, wd->left_blank);\r
-\r
- wd->right_blank = elm_layout_add(wd->edje);\r
- if(wd->right_blank == NULL) return NULL;\r
- elm_layout_theme_set(wd->right_blank, "diskcontroller", "item", "default");\r
- evas_object_size_hint_weight_set(wd->right_blank, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
- evas_object_size_hint_align_set(wd->right_blank, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
- evas_object_show(wd->right_blank);\r
- elm_box_pack_end(wd->main_box, wd->right_blank);\r
- elm_widget_sub_object_add(obj, wd->right_blank);\r
-\r
- elm_scroller_content_set(wd->scroller, wd->main_box);\r
-\r
- //FIXME\r
- // evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);\r
-\r
-\r
- elm_widget_resize_object_set(obj, wd->edje);\r
- evas_object_smart_member_add(wd->scroller, obj);\r
- evas_object_smart_member_add(wd->main_box, obj);\r
-\r
- _sizing_eval(obj);\r
- return obj;\r
-}\r
-\r
-/**\r
- * Set round mode\r
- *\r
- * @param it The item of diskcontroller\r
- * @param if or not set round mode\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI void elm_diskcontroller_round_set(Evas_Object *obj, Eina_Bool round)\r
-{\r
- Widget_Data *wd;\r
-\r
- if(obj == NULL) return;\r
- wd = elm_widget_data_get(obj);\r
- if(wd == NULL) return;\r
-\r
- if(wd->round == round) return;\r
- wd->round = round;\r
-\r
-\r
- if(wd->r_items) eina_list_free(wd->r_items);\r
- wd->r_items = eina_list_clone(wd->items);\r
-\r
- if(wd->round) {\r
- elm_box_unpack(wd->main_box, wd->left_blank);\r
- evas_object_hide(wd->left_blank);\r
- elm_box_unpack(wd->main_box, wd->right_blank);\r
- evas_object_hide(wd->right_blank);\r
-\r
- if(wd->items == NULL) return;\r
-\r
- dummy_item_add(wd);\r
- dummy_item_del(wd);\r
-\r
- //composite another list\r
- if(wd->first->base) elm_box_pack_end(wd->main_box, wd->first->base);\r
- if(wd->second->base) elm_box_pack_end(wd->main_box, wd->second->base);\r
- if(wd->last->base) elm_box_pack_start(wd->main_box, wd->last->base);\r
- if(wd->s_last->base) elm_box_pack_start(wd->main_box, wd->s_last->base);\r
-\r
- } else {\r
- elm_box_unpack(wd->main_box, wd->first->base);\r
- evas_object_hide(wd->first->base);\r
- elm_box_unpack(wd->main_box, wd->second->base);\r
- evas_object_hide(wd->second->base);\r
- elm_box_unpack(wd->main_box, wd->last->base);\r
- evas_object_hide(wd->last->base);\r
- elm_box_unpack(wd->main_box, wd->s_last->base);\r
- evas_object_hide(wd->s_last->base);\r
-\r
-\r
- elm_box_pack_start(wd->main_box, wd->left_blank);\r
- elm_box_pack_end(wd->main_box, wd->right_blank);\r
- }\r
-\r
- _sizing_eval(obj);\r
-}\r
-\r
-\r
-/**\r
- * @fn int elm_diskcontroller_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data, Evas_Object *obj, void event_info), const void *data)\r
- * @ingroup TW3_diskcontroller_group\r
- * @brief Add text item\r
- * @param[in] obj The diskcontroller object\r
- * @param[in] icon The icon of item\r
- * @param[in] label The label of item\r
- * @param[in] func Callback function of item\r
- * @param[in] data The data of callback function\r
- * @return 0 (SUCCESS) or -1 (FAIL)\r
- */\r
-EAPI Elm_Diskcontroller_Item *elm_diskcontroller_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)\r
-{\r
- Elm_Diskcontroller_Item *it;\r
- Widget_Data *wd;\r
-\r
- if(obj == NULL) return NULL;\r
- wd = elm_widget_data_get(obj);\r
- if(wd == NULL) return NULL;\r
-\r
- it = item_new(obj, icon, label, func, data);\r
-\r
- wd->items = eina_list_append(wd->items, it);\r
-\r
- wd->item_num++;\r
-\r
- if(wd->round){\r
- dummy_item_del(wd);\r
- wd->r_items = eina_list_append(wd->r_items, it);\r
- dummy_item_add(wd);\r
-\r
- if(wd->last) elm_box_pack_start(wd->main_box, wd->last->base);\r
- if(wd->s_last) elm_box_pack_start(wd->main_box, wd->s_last->base);\r
- elm_box_pack_end(wd->main_box, it->base);\r
- if(wd->first) elm_box_pack_end(wd->main_box, wd->first->base);\r
- if(wd->second) elm_box_pack_end(wd->main_box, wd->second->base);\r
- }else{\r
- elm_box_unpack(wd->main_box, wd->right_blank);\r
- elm_box_pack_end(wd->main_box, it->base);\r
- elm_box_pack_end(wd->main_box, wd->right_blank);\r
- }\r
-\r
- wd->selected_item = it;\r
- if(wd->idler == NULL) wd->idler = ecore_idler_add(move_scroller, wd);\r
-\r
- _sizing_eval(obj);\r
-\r
- return it;\r
-}\r
-\r
-/**\r
- * Delete the item\r
- *\r
- * @param it The item of diskcontroller\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI void elm_diskcontroller_item_del(Elm_Diskcontroller_Item *it)\r
-{\r
- Widget_Data *wd;\r
- Elm_Diskcontroller_Item *dit;\r
- Evas_Object *obj;\r
- \r
- if(it == NULL) return;\r
- if(it->obj == NULL) return;\r
- obj = it->obj;\r
- wd = elm_widget_data_get(it->obj);\r
- if(wd == NULL) return;\r
-\r
- elm_box_unpack(wd->main_box, it->base);\r
-\r
- if(wd->round){\r
- wd->r_items = eina_list_remove(wd->r_items, it);\r
- }\r
- wd->items = eina_list_remove(wd->items, it);\r
-\r
- if(wd->selected_item == it){\r
- dit = (Elm_Diskcontroller_Item *)eina_list_nth(wd->items, 0);\r
- if(dit != it){\r
- wd->selected_item = dit;\r
- }else{\r
- wd->selected_item = (Elm_Diskcontroller_Item *)eina_list_nth(wd->items, 1);\r
- }\r
- }\r
-\r
- if(it->base) evas_object_del(it->base);\r
- if(it->icon) evas_object_del(it->icon);\r
- if(it) free(it);\r
- it = NULL;\r
-\r
- wd->item_num -= 1;\r
-\r
- if(wd->round){\r
- if(wd->item_num == 0){\r
- evas_object_hide(wd->first->base);\r
- evas_object_hide(wd->second->base);\r
- evas_object_hide(wd->last->base);\r
- evas_object_hide(wd->s_last->base);\r
- }else{\r
- dit = eina_list_nth(wd->items, 0);\r
- if(dit){\r
- wd->first->label = eina_stringshare_add(dit->label);\r
- edje_object_part_text_set(_EDJ(wd->first->base), "elm.text", wd->first->label);\r
- }\r
- dit = eina_list_nth(wd->items, 1);\r
- if(dit){\r
- wd->second->label = eina_stringshare_add(dit->label);\r
- edje_object_part_text_set(_EDJ(wd->second->base), "elm.text", wd->second->label);\r
- }\r
- dit = eina_list_nth(wd->items, eina_list_count(wd->items)-1);\r
- if(dit){\r
- wd->last->label = eina_stringshare_add(dit->label);\r
- edje_object_part_text_set(_EDJ(wd->last->base), "elm.text", wd->last->label);\r
- }\r
- dit = eina_list_nth(wd->items, eina_list_count(wd->items)-2);\r
- if(dit){\r
- wd->s_last->label = eina_stringshare_add(dit->label);\r
- edje_object_part_text_set(_EDJ(wd->s_last->base), "elm.text", wd->s_last->label);\r
- }\r
- }\r
- }\r
-\r
- wd->check_idler = ecore_idler_add(check_string, wd);\r
-\r
- _sizing_eval(obj);\r
-}\r
-\r
-/**\r
- * Get the label of item\r
- *\r
- * @param it The item of diskcontroller\r
- * @return The label of item\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI const char *elm_diskcontroller_item_label_get(Elm_Diskcontroller_Item *it)\r
-{\r
- return it->label;\r
-}\r
-\r
-\r
-/**\r
- * Set the label of item\r
- *\r
- * @param it The item of diskcontroller\r
- * @return The label of item\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI void elm_diskcontroller_item_label_set(Elm_Diskcontroller_Item *it, const char *label)\r
-{\r
- it->label = eina_stringshare_add(label);\r
- edje_object_part_text_set(_EDJ(it->base), "elm.text", it->label);\r
-}\r
-\r
-/**\r
- * Set the item visible\r
- *\r
- * @param it The item of diskcontroller\r
- *\r
- * @ingroup Diskcontroller\r
- */\r
-EAPI void elm_diskcontroller_item_focus_set(Elm_Diskcontroller_Item *it)\r
-{\r
- Widget_Data *wd;\r
-\r
- if(it->obj == NULL) return;\r
- wd = elm_widget_data_get(it->obj);\r
- if(wd == NULL) return;\r
-\r
- wd->selected_item = it;\r
-\r
- if(wd->idler == NULL) ecore_idler_add(move_scroller, wd);\r
-}\r
-\r
-\r
-///////////////////////////////////////////////////////////////////\r
-//\r
-// Smart Object basic function\r
-//\r
-////////////////////////////////////////////////////////////////////\r
-\r
-static void _diskcontroller_object_move(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
-{\r
- DBG("%s", __func__);\r
-\r
- Widget_Data *wd;\r
- Evas_Coord x, y;\r
-\r
- if(!data) return;\r
- wd = elm_widget_data_get((Evas_Object *)data);\r
- if(!wd) return;\r
-\r
- evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);\r
-\r
- wd->x = x;\r
- wd->y = y;\r
-\r
- evas_object_move(wd->edje, x, y);\r
-}\r
-\r
-\r
-static void _diskcontroller_object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
-{\r
- Widget_Data *wd;\r
- Evas_Coord w, h;\r
-\r
- if(!data) return;\r
- wd = elm_widget_data_get((Evas_Object *)data);\r
- if(!wd) return;\r
-\r
- evas_object_geometry_get(wd->edje, NULL, NULL, &w, &h);\r
-\r
- wd->w = w;\r
- wd->h = h;\r
-\r
- evas_object_resize(wd->edje, w, h);\r
- if(wd->round){\r
- evas_object_size_hint_min_set(wd->main_box, w*SCROLLED_DISTANCE*(wd->item_num+4)/STANDARD_W, h-1);\r
- }else{\r
- evas_object_size_hint_min_set(wd->main_box, w*SCROLLED_DISTANCE*(wd->item_num+2)/STANDARD_W, h-1);\r
- }\r
- elm_scroller_page_size_set(wd->scroller, (int)(wd->w*SCROLLED_DISTANCE/STANDARD_W), 0);\r
-\r
- if(wd->idler == NULL) {\r
- wd->idler = ecore_idler_add(move_scroller, wd);\r
- }\r
-}\r
-\r
-\r
-static void _diskcontroller_object_show(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
-{\r
- DBG("%s", __func__);\r
-\r
- Widget_Data *wd;\r
-\r
- if(!data) return;\r
- wd = elm_widget_data_get((Evas_Object *)data);\r
- if(!wd) return;\r
-\r
- evas_object_show(wd->edje);\r
-}\r
-\r
-\r
-\r
-static void _diskcontroller_object_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
-{\r
- DBG("%s", __func__);\r
-\r
- Widget_Data *wd;\r
-\r
- if(!data) return;\r
- wd = elm_widget_data_get((Evas_Object *)data);\r
- if(!wd) return;\r
-\r
- evas_object_hide(wd->edje);\r
-}\r
-\r