Basic routine : type -> select
[apps/native/sample/adventure.git] / src / scroller.c
1 #include <Elementary.h>
2
3 #include "util.h"
4 #include "log.h"
5 #include "scroller.h"
6
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"
10
11
12
13 struct _event_cb {
14         int event_type;
15         void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data);
16         void *user_data;
17 };
18 typedef struct _event_cb event_cb_s;
19
20
21
22 int scroller_is_scrolling(Evas_Object *scroller)
23 {
24         retv_if(!scroller, 0);
25         return (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING);
26 }
27
28
29
30 static void __anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
31 {
32         _D("start the scroller(%p) animation", scroller);
33         evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, (void *) 1);
34 }
35
36
37
38 static void __anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
39 {
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);
43 }
44
45
46
47 static void __drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
48 {
49         _D("start to drag the scroller(%p)", scroller);
50         evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START, (void *) 1);
51 }
52
53
54
55 static void __drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
56 {
57         _D("stop to drag the scroller(%p)", scroller);
58 }
59
60
61
62 static void __scroll_cb(void *data, Evas_Object *scroller, void *event_info)
63 {
64         int y = 0;
65
66         ret_if(!scroller);
67
68         if (!evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START))
69                 return;
70
71         elm_scroller_region_get(scroller, NULL, &y, NULL, NULL);
72 }
73
74
75
76 Evas_Object *scroller_create(Evas_Object *parent)
77 {
78         Evas_Object *box = NULL;
79         Evas_Object *scroller = NULL;
80
81         retv_if(!parent, NULL);
82
83         scroller = elm_scroller_add(parent);
84         retv_if(!scroller, NULL);
85
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);
91
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);
95
96         elm_object_style_set(scroller, "effect");
97         evas_object_show(scroller);
98         elm_object_scroll_lock_y_set(scroller, EINA_FALSE);
99
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);
105
106         box = elm_box_add(scroller);
107         goto_if(!box, ERROR);
108
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);
114
115         elm_object_content_set(scroller, box);
116
117         return scroller;
118
119 ERROR:
120         if (scroller) {
121                 evas_object_del(scroller);
122         }
123
124         return NULL;
125 }
126
127
128
129 void scroller_destroy(Evas_Object *scroller)
130 {
131         Evas_Object *box = NULL;
132
133         ret_if(!scroller);
134
135         box = elm_object_content_unset(scroller);
136         if (box) {
137                 evas_object_del(box);
138         }
139
140         evas_object_del(scroller);
141 }
142
143
144
145 void scroller_append_item(Evas_Object *scroller, Evas_Object *item)
146 {
147         Evas_Object *box = NULL;
148
149         box = elm_object_content_get(scroller);
150         ret_if(!box);
151
152         elm_box_pack_end(box, item);
153 }
154
155
156
157 void scroller_remove_item(Evas_Object *scroller, Evas_Object *item)
158 {
159         Evas_Object *box = NULL;
160         Evas_Object *tmp = NULL;
161         Eina_List *list = NULL;
162
163         int is_item_exist = 0;
164
165         box = elm_object_content_get(scroller);
166         ret_if(!box);
167
168         list = elm_box_children_get(box);
169         EINA_LIST_FREE(list, tmp) {
170                 continue_if(!tmp);
171                 if (item == tmp) {
172                         is_item_exist = 1;
173                 }
174         }
175
176         if (!is_item_exist) {
177                 _D("No item to remove");
178                 return;
179         }
180
181         elm_box_unpack(box, item);
182 }
183
184
185
186 void scroller_bring_in_item(Evas_Object *scroller, Evas_Object *item)
187 {
188         Evas_Object *box = NULL;
189         Evas_Object *tmp = NULL;
190         Eina_List *list = NULL;
191         int y = 0;
192         int exist = 0;
193
194         ret_if(!scroller);
195         ret_if(!item);
196
197         box = elm_object_content_get(scroller);
198         ret_if(!box);
199
200         list = elm_box_children_get(box);
201         ret_if(!list);
202
203         EINA_LIST_FREE(list, tmp) {
204                 continue_if(!tmp);
205                 if (item == tmp) {
206                         evas_object_geometry_get(item, NULL, &y, NULL, NULL);
207                         exist = 1;
208                 }
209         }
210
211         if (exist) {
212                 elm_scroller_region_bring_in(scroller, 0, y, 0, 0);
213         }
214 }
215
216
217
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)
219 {
220         Eina_List *event_cb_list = NULL;
221         event_cb_s *event_cb_info = NULL;
222
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);
227
228         event_cb_info = calloc(1, sizeof(event_cb_s));
229         retv_if(!event_cb_info, APPL_ERROR_OUT_OF_MEMORY);
230
231         event_cb_info->event_type = event_type;
232         event_cb_info->event_cb = event_cb;
233         event_cb_info->user_data = user_data;
234
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);
238
239         return APPL_ERROR_NONE;
240 }
241
242
243
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))
245 {
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;
250
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);
255
256         event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
257         retv_if(!event_cb_list, APPL_ERROR_FAIL);
258
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);
263                         break;
264                 }
265         }
266
267         evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
268
269         return APPL_ERROR_NONE;
270 }