2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "pager_common.h"
21 #include "quickpanel_def.h"
23 static int _init(void *data);
24 static void _init_job_cb(void *data);
25 static int _fini(void *data);
26 static int _resume(void *data);
27 static void _opened(void *data);
28 static void _closed(void *data);
29 static void _refresh(void *data);
30 static inline void _page_mapbuf_enable_set(Evas_Object *box, int is_enable);
32 #define ENABLE_MAPBUF 0
34 typedef enum _qp_pager_state_type {
35 PAGER_STATE_NOT_READY = 0,
37 PAGER_STATE_WILL_SCROLL,
38 PAGER_STATE_SCROLLING,
39 PAGER_STATE_FINISHED_SCROLLING,
40 } qp_pager_state_type;
45 .init_job_cb = _init_job_cb,
54 qp_pager_state_type state;
58 Evas_Object *view_scroller;
59 Evas_Object *view_box;
61 Ecore_Event_Handler *hdl_move;
62 Ecore_Event_Handler *hdl_up;
63 Ecore_Event_Handler *hdl_down;
65 Ecore_Timer *timer_scroll_adj;
67 int scroll_start_from;
69 .state = PAGER_STATE_NOT_READY,
70 .last_page = PAGE_IDX_MAIN,
73 .view_scroller = NULL,
80 .timer_scroll_adj = NULL,
82 .scroll_start_from = -1,
85 static inline void _set_state(qp_pager_state_type state) {
86 if (state == PAGER_STATE_IDLE) {
87 _page_mapbuf_enable_set(s_info.view_box, 0);
88 } else if (state == PAGER_STATE_WILL_SCROLL || state == PAGER_STATE_SCROLLING) {
89 _page_mapbuf_enable_set(s_info.view_box, 1);
94 static inline qp_pager_state_type _get_state(void) {
98 static inline int _last_page_get(void) {
99 return s_info.last_page;
102 static inline void _page_show(int page_index) {
103 elm_scroller_page_show(s_info.view_scroller, page_index, 0);
104 s_info.last_page = page_index;
107 static Eina_Bool _page_adjust_timer_cb(void *data)
111 if (s_info.timer_scroll_adj != NULL) {
112 ecore_timer_del(s_info.timer_scroll_adj);
113 s_info.timer_scroll_adj = NULL;
116 elm_scroller_current_page_get(s_info.view_scroller, &index, NULL);
117 elm_scroller_page_bring_in(s_info.view_scroller, index, 0);
118 s_info.last_page = index;
120 return ECORE_CALLBACK_CANCEL;
123 static inline void _page_adjust(int is_use_timer) {
124 if (s_info.timer_scroll_adj != NULL) {
125 ecore_timer_del(s_info.timer_scroll_adj);
126 s_info.timer_scroll_adj = NULL;
130 s_info.timer_scroll_adj =
131 ecore_timer_add(0.1, _page_adjust_timer_cb, NULL);
133 _page_adjust_timer_cb(NULL);
137 static inline int _current_page_index_get(void) {
140 elm_scroller_current_page_get(s_info.view_scroller, &index, NULL);
145 static inline Evas_Object *_current_page_get(void) {
148 Eina_List *list = NULL;
149 static int last_page = -1;
150 Evas_Object *obj = NULL;
152 elm_scroller_current_page_get(s_info.view_scroller, &index, NULL);
154 if (last_page != index) {
155 DBG("current selected page:%d", index);
159 list = elm_box_children_get(s_info.view_box);
161 list_cnt = eina_list_count(list);
163 if (index < list_cnt) {
164 obj = (Evas_Object *)eina_list_nth(list, index);
166 eina_list_free(list);
173 static void _mapbuf_job_cb(void *data)
175 Eina_List *list = NULL;
178 Evas_Object *box = s_info.view_box;
179 Evas_Object *item = NULL;
180 int is_enable = (int)data;
181 QP_Page_Handler *page_handler = NULL;
182 retif(box == NULL, , "invalid parameter");
184 list = elm_box_children_get(box);
185 retif(list == NULL, , "empty box");
187 SDBG("mapbuf enable:%d", is_enable);
189 EINA_LIST_FOREACH_SAFE(list, l, l_next, item)
191 page_handler = quickpanel_page_handler_get(item);
192 if (page_handler != NULL) {
193 if (page_handler->mapbuf_enable_set != NULL) {
194 if (elm_config_access_get() == EINA_FALSE) {
195 if (is_enable == 1) {
196 page_handler->mapbuf_enable_set(EINA_TRUE);
198 page_handler->mapbuf_enable_set(EINA_FALSE);
201 page_handler->mapbuf_enable_set(EINA_FALSE);
207 eina_list_free(list);
211 static inline void _page_mapbuf_enable_set(Evas_Object *box, int is_enable) {
213 ecore_job_add(_mapbuf_job_cb, (void *)is_enable);
217 static inline void _page_resize(Evas_Object *box, int width, int height, const char *signal) {
218 Eina_List *list = NULL;
221 Evas_Object *item = NULL;
222 QP_Page_Handler *page_handler = NULL;
223 retif(box == NULL, , "invalid parameter");
225 list = elm_box_children_get(box);
226 retif(list == NULL, , "empty box");
228 EINA_LIST_FOREACH_SAFE(list, l, l_next, item)
230 page_handler = quickpanel_page_handler_get(item);
232 if (page_handler != NULL) {
233 if (page_handler->content_resize != NULL) {
234 page_handler->content_resize(width, height, signal);
239 eina_list_free(list);
242 static inline void _page_rotation(void *data) {
243 struct appdata *ad = (struct appdata *)data;
244 retif(ad == NULL, , "Invalid parameter!");
246 if (ad->angle == 90 || ad->angle == 270)
248 _page_resize(s_info.view_box, ad->win_height, ad->win_width - ELM_SCALE_SIZE((QP_DATE_H + QP_HANDLE_H)), "landscape");
252 _page_resize(s_info.view_box, ad->win_width, ad->win_height - ELM_SCALE_SIZE((QP_DATE_H + QP_HANDLE_H)), "portrait");
256 static Eina_Bool _up_cb(void *data, int type, void *event) {
257 Evas_Object *page = _current_page_get();
258 QP_Page_Handler *page_handler = NULL;
259 retif(page == NULL, EINA_FALSE, "Invalid parameter!");
261 if (_get_state() == PAGER_STATE_WILL_SCROLL) {
262 _set_state(PAGER_STATE_SCROLLING);
266 page_handler = quickpanel_page_handler_get(page);
267 retif(page_handler == NULL, EINA_FALSE, "no page handler found");
269 if (page_handler->up_cb != NULL) {
270 page_handler->up_cb(event, NULL);
273 if (_get_state() == PAGER_STATE_SCROLLING) {
280 static Eina_Bool _down_cb(void *data, int type, void *event) {
281 Evas_Object *page = _current_page_get();
282 QP_Page_Handler *page_handler = NULL;
283 retif(page == NULL, EINA_FALSE, "Invalid parameter!");
285 page_handler = quickpanel_page_handler_get(page);
286 retif(page_handler == NULL, EINA_FALSE, "no page handler found");
288 if (page_handler->down_cb != NULL) {
289 page_handler->down_cb(event, NULL);
295 static void _scroller_anim_start_cb(void *data, Evas_Object *scroller,
297 Evas_Object *page = _current_page_get();
298 QP_Page_Handler *page_handler = NULL;
299 retif(page == NULL, , "Invalid parameter!");
301 s_info.scroll_start_from = _current_page_index_get();
303 if (_get_state() == PAGER_STATE_IDLE) {
304 _set_state(PAGER_STATE_WILL_SCROLL);
306 page_handler = quickpanel_page_handler_get(page);
307 retif(page_handler == NULL, , "no page handler found");
309 if (page_handler->scroll_start_cb != NULL) {
310 page_handler->scroll_start_cb(event_info, NULL);
315 static void _scroller_anim_stop_cb(void *data, Evas_Object *scroller,
317 Evas_Object *page = _current_page_get();
318 QP_Page_Handler *page_handler = NULL;
319 retif(page == NULL, , "Invalid parameter!");
321 if (s_info.is_in_edge == 1 || _get_state() == PAGER_STATE_FINISHED_SCROLLING) {
322 _set_state(PAGER_STATE_IDLE);
324 page_handler = quickpanel_page_handler_get(page);
325 retif(page_handler == NULL, , "no page handler found");
327 if (page_handler->scroll_done_cb != NULL) {
328 page_handler->scroll_done_cb(event_info, NULL);
331 _page_mapbuf_enable_set(s_info.view_box, 0);
335 static void _scroller_edge_cb(void *data, Evas_Object *scroller,
337 if (_get_state() == PAGER_STATE_WILL_SCROLL
338 || _get_state() == PAGER_STATE_SCROLLING) {
339 _set_state(PAGER_STATE_FINISHED_SCROLLING);
340 s_info.is_in_edge = 1;
345 static void _scroller_scroll_cb(void *data, Evas_Object *scroller,
347 s_info.is_in_edge = 0;
350 /*****************************************************************************
354 *****************************************************************************/
355 static int _init(void *data)
357 struct appdata *ad = (struct appdata *)data;
358 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
359 retif(s_info.view_scroller == NULL, QP_FAIL, "Invalid parameter!");
361 s_info.hdl_up = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _up_cb
362 , s_info.view_scroller);
363 s_info.hdl_down = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _down_cb
364 , s_info.view_scroller);
366 evas_object_smart_callback_add(s_info.view_scroller, "scroll,drag,start",
367 _scroller_anim_start_cb, s_info.view_scroller);
368 evas_object_smart_callback_add(s_info.view_scroller, "scroll,anim,stop",
369 _scroller_anim_stop_cb, s_info.view_scroller);
370 evas_object_smart_callback_add(s_info.view_scroller, "scroll,drag,stop",
371 _scroller_anim_stop_cb, s_info.view_scroller);
372 evas_object_smart_callback_add(s_info.view_scroller, "scroll",
373 _scroller_scroll_cb, s_info.view_scroller);
375 evas_object_smart_callback_add(s_info.view_scroller, "edge,left",
376 _scroller_edge_cb, s_info.view_scroller);
377 evas_object_smart_callback_add(s_info.view_scroller, "edge,right",
378 _scroller_edge_cb, s_info.view_scroller);
380 _set_state(PAGER_STATE_IDLE);
385 static void _init_job_cb(void *data)
387 struct appdata *ad = (struct appdata *)data;
388 retif(ad == NULL, , "Invalid parameter!");
389 retif(s_info.view_scroller == NULL, , "Invalid parameter!");
393 _page_show(PAGE_IDX_MAIN);
394 evas_object_show(s_info.view_scroller);
397 static int _fini(void *data)
399 struct appdata *ad = (struct appdata *)data;
400 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
402 if (s_info.hdl_up != NULL) {
403 ecore_event_handler_del(s_info.hdl_up);
405 if (s_info.hdl_down != NULL) {
406 ecore_event_handler_del(s_info.hdl_down);
412 static int _resume(void *data)
414 struct appdata *ad = data;
415 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
420 static void _opened(void *data)
422 struct appdata *ad = data;
423 retif(ad == NULL, , "Invalid parameter!");
425 _page_mapbuf_enable_set(s_info.view_box, 0);
427 quickpanel_page_editing_icon_visible_status_update();
430 static void _closed(void *data)
432 struct appdata *ad = data;
433 retif(ad == NULL, , "Invalid parameter!");
434 retif(s_info.view_scroller == NULL, , "Invalid parameter!");
436 _page_show(PAGE_IDX_MAIN);
437 _page_mapbuf_enable_set(s_info.view_box, 0);
439 quickpanel_page_editing_icon_visible_status_update();
442 static void _refresh(void *data) {
443 struct appdata *ad = data;
444 retif(ad == NULL, , "Invalid parameter!");
445 retif(s_info.view_box == NULL, , "Invalid parameter!");
446 retif(s_info.view_scroller == NULL, , "Invalid parameter!");
451 static void _scroller_resized_cb(void *data, Evas * e,
452 Evas_Object * obj, void *event_info)
454 _page_show(PAGE_IDX_MAIN);
455 evas_object_event_callback_del(s_info.view_scroller,
456 EVAS_CALLBACK_RESIZE, _scroller_resized_cb);
459 HAPI Evas_Object *quickpanel_pager_new(Evas_Object *parent, void *data) {
460 Evas_Object *box = NULL;
461 Evas_Object *scroller = NULL;
463 retif(parent == NULL, NULL, "failed to memory allocation");
465 if (s_info.view_scroller != NULL && s_info.view_box != NULL)
466 return s_info.view_scroller;
468 scroller = elm_scroller_add(parent);
469 retif(!scroller, NULL, "fail to add scroller");
470 elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_TRUE);
471 elm_scroller_propagate_events_set(scroller, EINA_FALSE);
472 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
473 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
474 evas_object_size_hint_fill_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
475 elm_scroller_page_relative_set (scroller, 1.0, 0.0);
477 box = elm_box_add(scroller);
479 ERR("fail to add box");
480 if (scroller != NULL) {
481 evas_object_del(scroller);
486 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
487 evas_object_size_hint_fill_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
488 elm_box_horizontal_set(box, EINA_TRUE);
489 evas_object_show(box);
491 elm_object_content_set(scroller, box);
493 s_info.view_scroller = scroller;
494 s_info.view_box = box;
496 evas_object_event_callback_add(s_info.view_scroller, EVAS_CALLBACK_RESIZE,
497 _scroller_resized_cb, NULL);
502 HAPI void quickpanel_pager_destroy(void) {
503 if (s_info.view_box != NULL) {
504 elm_box_unpack_all(s_info.view_box);
505 evas_object_del(s_info.view_box);
506 s_info.view_box = NULL;
508 if (s_info.view_scroller != NULL) {
509 evas_object_del(s_info.view_scroller);
510 s_info.view_scroller = NULL;
514 HAPI Evas_Object *quickpanel_pager_view_get(const char *view_name) {
515 retif(view_name == NULL, NULL, "invalid parameter");
517 if (strcmp(view_name, "SCROLLER") == 0) {
518 return s_info.view_scroller;
520 } else if (strcmp(view_name, "BOX") == 0) {
521 return s_info.view_box;
527 HAPI int quickpanel_pager_current_page_get(void) {
530 elm_scroller_current_page_get(s_info.view_scroller, &index, NULL);
535 HAPI void quickpanel_pager_page_set(int page_index, int need_resize) {
536 struct appdata *ad = quickpanel_get_app_data();
537 retif(ad == NULL, , "invalid parameter");
542 _page_show(page_index);
544 evas_object_show(s_info.view_scroller);
547 HAPI void quickpanel_pager_mapbuf_set(int is_enable) {
548 _page_mapbuf_enable_set(s_info.view_box, is_enable);