1 #include <Elementary.h>
7 #define PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING "p_is_sc"
8 #define PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST "pdkec"
14 void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data);
17 typedef struct _event_cb event_cb_s;
21 int scroller_is_scrolling(Evas_Object *scroller)
23 retv_if(!scroller, 0);
24 return (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING);
29 static void __scroller_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
31 Evas_Object *scroller = obj;
35 evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, NULL);
40 static void __anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
42 _D("start the scroller(%p) animation", scroller);
43 evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, (void *) 1);
48 static void __anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
50 _D("stop the scroller(%p) animation", scroller);
55 static void __drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
57 _D("start to drag the scroller(%p)", scroller);
58 evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, (void *) 1);
63 static void __drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
65 _D("stop to drag the scroller(%p)", scroller);
70 Evas_Object *scroller_create(Evas_Object *parent)
72 Evas_Object *box = NULL;
73 Evas_Object *scroller = NULL;
75 retv_if(!parent, NULL);
77 scroller = elm_scroller_add(parent);
78 retv_if(!scroller, NULL);
80 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
81 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
82 elm_scroller_page_scroll_limit_set(scroller, 0, 0);
83 elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_FALSE);
84 elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
86 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
87 evas_object_size_hint_align_set(scroller, 0.0, EVAS_HINT_EXPAND);
88 evas_object_size_hint_min_set(scroller, 0, 0);
90 elm_object_style_set(scroller, "effect");
91 evas_object_show(scroller);
92 elm_object_scroll_lock_y_set(scroller, EINA_FALSE);
94 evas_object_smart_callback_add(scroller, "scroll,anim,start", __anim_start_cb, NULL);
95 evas_object_smart_callback_add(scroller, "scroll,anim,stop", __anim_stop_cb, NULL);
96 evas_object_smart_callback_add(scroller, "scroll,drag,start", __drag_start_cb, NULL);
97 evas_object_smart_callback_add(scroller, "scroll,drag,stop", __drag_stop_cb, NULL);
98 evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, __scroller_mouse_down_cb, NULL);
100 box = elm_box_add(scroller);
101 goto_if(!box, ERROR);
103 elm_box_horizontal_set(box, EINA_FALSE);
104 elm_box_homogeneous_set(box, EINA_FALSE);
105 elm_box_align_set(box, 0.0, 0.0);
106 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
107 evas_object_show(box);
109 elm_object_content_set(scroller, box);
115 evas_object_del(scroller);
123 void scroller_destroy(Evas_Object *scroller)
125 Evas_Object *box = NULL;
129 box = elm_object_content_unset(scroller);
131 evas_object_del(box);
134 evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING);
135 evas_object_del(scroller);
140 void scroller_append_item(Evas_Object *scroller, Evas_Object *item)
142 Evas_Object *box = NULL;
144 box = elm_object_content_get(scroller);
147 elm_box_pack_end(box, item);
152 void scroller_remove_item(Evas_Object *scroller, Evas_Object *item)
154 Evas_Object *box = NULL;
155 Evas_Object *tmp = NULL;
156 Eina_List *list = NULL;
158 int is_item_exist = 0;
160 box = elm_object_content_get(scroller);
163 list = elm_box_children_get(box);
164 EINA_LIST_FREE(list, tmp) {
171 if (!is_item_exist) {
172 _D("No item to remove");
176 elm_box_unpack(box, item);
181 void scroller_clear_item(Evas_Object *scroller)
183 Evas_Object *box = NULL;
184 Evas_Object *item = NULL;
185 Eina_List *list = NULL;
189 box = elm_object_content_get(scroller);
192 list = elm_box_children_get(box);
195 EINA_LIST_FREE(list, item) {
196 evas_object_del(item);
202 int scroller_count_item(Evas_Object *scroller)
204 Evas_Object *box = NULL;
205 Eina_List *list = NULL;
208 retv_if(!scroller, 0);
210 box = elm_object_content_get(scroller);
213 list = elm_box_children_get(box);
217 count = eina_list_count(list);
218 eina_list_free(list);
225 void scroller_bring_in_item(Evas_Object *scroller, Evas_Object *item)
227 Evas_Object *box = NULL;
228 Evas_Object *tmp = NULL;
229 Eina_List *list = NULL;
236 box = elm_object_content_get(scroller);
239 list = elm_box_children_get(box);
242 EINA_LIST_FREE(list, tmp) {
245 evas_object_geometry_get(item, NULL, &y, NULL, NULL);
251 elm_scroller_region_bring_in(scroller, 0, y, 0, 0);
257 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)
259 Eina_List *event_cb_list = NULL;
260 event_cb_s *event_cb_info = NULL;
262 retv_if(!scroller, APPL_ERROR_INVALID_PARAMETER);
263 retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, APPL_ERROR_INVALID_PARAMETER);
264 retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, APPL_ERROR_INVALID_PARAMETER);
265 retv_if(!event_cb, APPL_ERROR_INVALID_PARAMETER);
267 event_cb_info = calloc(1, sizeof(event_cb_s));
268 retv_if(!event_cb_info, APPL_ERROR_OUT_OF_MEMORY);
270 event_cb_info->event_type = event_type;
271 event_cb_info->event_cb = event_cb;
272 event_cb_info->user_data = user_data;
274 event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
275 event_cb_list = eina_list_append(event_cb_list, event_cb_info);
276 evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
278 return APPL_ERROR_NONE;
283 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))
285 Eina_List *event_cb_list = NULL;
286 const Eina_List *l = NULL;
287 const Eina_List *ln = NULL;
288 event_cb_s *event_cb_info = NULL;
290 retv_if(!scroller, APPL_ERROR_INVALID_PARAMETER);
291 retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, APPL_ERROR_INVALID_PARAMETER);
292 retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, APPL_ERROR_INVALID_PARAMETER);
293 retv_if(!event_cb, APPL_ERROR_INVALID_PARAMETER);
295 event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
296 retv_if(!event_cb_list, APPL_ERROR_FAIL);
298 EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) {
299 if (event_cb_info->event_type == event_type
300 && event_cb_info->event_cb == event_cb) {
301 event_cb_list = eina_list_remove(event_cb_list, event_cb_info);
306 evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
308 return APPL_ERROR_NONE;