1 #include <Elementary.h>
7 #define PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING "p_is_sc"
8 #define PRIVATE_DATA_KEY_SCROLLER_DRAG_START "p_dg_st"
9 #define PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST "pdkec"
15 void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data);
18 typedef struct _event_cb event_cb_s;
22 int scroller_is_scrolling(Evas_Object *scroller)
24 retv_if(!scroller, 0);
25 return (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING);
30 static void __anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
32 _D("start the scroller(%p) animation", scroller);
33 evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, (void *) 1);
38 static void __anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
40 _D("stop the scroller(%p) animation", scroller);
41 evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING);
42 evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START);
47 static void __drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
49 _D("start to drag the scroller(%p)", scroller);
50 evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START, (void *) 1);
55 static void __drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
57 _D("stop to drag the scroller(%p)", scroller);
62 static void __scroll_cb(void *data, Evas_Object *scroller, void *event_info)
68 if (!evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START))
71 elm_scroller_region_get(scroller, NULL, &y, NULL, NULL);
76 Evas_Object *scroller_create(Evas_Object *parent)
78 Evas_Object *box = NULL;
79 Evas_Object *scroller = NULL;
81 retv_if(!parent, NULL);
83 scroller = elm_scroller_add(parent);
84 retv_if(!scroller, NULL);
86 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
87 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
88 elm_scroller_page_scroll_limit_set(scroller, 0, 0);
89 elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_FALSE);
90 elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
92 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
93 evas_object_size_hint_align_set(scroller, 0.0, EVAS_HINT_EXPAND);
94 evas_object_size_hint_min_set(scroller, 0, 0);
96 elm_object_style_set(scroller, "effect");
97 evas_object_show(scroller);
98 elm_object_scroll_lock_y_set(scroller, EINA_FALSE);
100 evas_object_smart_callback_add(scroller, "scroll,anim,start", __anim_start_cb, NULL);
101 evas_object_smart_callback_add(scroller, "scroll,anim,stop", __anim_stop_cb, NULL);
102 evas_object_smart_callback_add(scroller, "scroll,drag,start", __drag_start_cb, NULL);
103 evas_object_smart_callback_add(scroller, "scroll,drag,stop", __drag_stop_cb, NULL);
104 evas_object_smart_callback_add(scroller, "scroll", __scroll_cb, NULL);
106 box = elm_box_add(scroller);
107 goto_if(!box, ERROR);
109 elm_box_horizontal_set(box, EINA_FALSE);
110 elm_box_homogeneous_set(box, EINA_FALSE);
111 elm_box_align_set(box, 0.0, 0.0);
112 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
113 evas_object_show(box);
115 elm_object_content_set(scroller, box);
121 evas_object_del(scroller);
129 void scroller_destroy(Evas_Object *scroller)
131 Evas_Object *box = NULL;
135 box = elm_object_content_unset(scroller);
137 evas_object_del(box);
140 evas_object_del(scroller);
145 void scroller_append_item(Evas_Object *scroller, Evas_Object *item)
147 Evas_Object *box = NULL;
149 box = elm_object_content_get(scroller);
152 elm_box_pack_end(box, item);
157 void scroller_remove_item(Evas_Object *scroller, Evas_Object *item)
159 Evas_Object *box = NULL;
160 Evas_Object *tmp = NULL;
161 Eina_List *list = NULL;
163 int is_item_exist = 0;
165 box = elm_object_content_get(scroller);
168 list = elm_box_children_get(box);
169 EINA_LIST_FREE(list, tmp) {
176 if (!is_item_exist) {
177 _D("No item to remove");
181 elm_box_unpack(box, item);
186 void scroller_bring_in_item(Evas_Object *scroller, Evas_Object *item)
188 Evas_Object *box = NULL;
189 Evas_Object *tmp = NULL;
190 Eina_List *list = NULL;
197 box = elm_object_content_get(scroller);
200 list = elm_box_children_get(box);
203 EINA_LIST_FREE(list, tmp) {
206 evas_object_geometry_get(item, NULL, &y, NULL, NULL);
212 elm_scroller_region_bring_in(scroller, 0, y, 0, 0);
218 int scroller_register_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data), void *user_data)
220 Eina_List *event_cb_list = NULL;
221 event_cb_s *event_cb_info = NULL;
223 retv_if(!scroller, APPL_ERROR_INVALID_PARAMETER);
224 retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, APPL_ERROR_INVALID_PARAMETER);
225 retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, APPL_ERROR_INVALID_PARAMETER);
226 retv_if(!event_cb, APPL_ERROR_INVALID_PARAMETER);
228 event_cb_info = calloc(1, sizeof(event_cb_s));
229 retv_if(!event_cb_info, APPL_ERROR_OUT_OF_MEMORY);
231 event_cb_info->event_type = event_type;
232 event_cb_info->event_cb = event_cb;
233 event_cb_info->user_data = user_data;
235 event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
236 event_cb_list = eina_list_append(event_cb_list, event_cb_info);
237 evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
239 return APPL_ERROR_NONE;
244 int scroller_unregister_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data))
246 Eina_List *event_cb_list = NULL;
247 const Eina_List *l = NULL;
248 const Eina_List *ln = NULL;
249 event_cb_s *event_cb_info = NULL;
251 retv_if(!scroller, APPL_ERROR_INVALID_PARAMETER);
252 retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, APPL_ERROR_INVALID_PARAMETER);
253 retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, APPL_ERROR_INVALID_PARAMETER);
254 retv_if(!event_cb, APPL_ERROR_INVALID_PARAMETER);
256 event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
257 retv_if(!event_cb_list, APPL_ERROR_FAIL);
259 EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) {
260 if (event_cb_info->event_type == event_type
261 && event_cb_info->event_cb == event_cb) {
262 event_cb_list = eina_list_remove(event_cb_list, event_cb_info);
267 evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
269 return APPL_ERROR_NONE;