2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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.
17 #include <efl_extension.h>
19 #include "homescreen-efl.h"
20 #include "cluster_view.h"
25 #include "page_indicator.h"
26 #include "widget_viewer.h"
29 #include "cluster_page.h"
30 #include "cluster_data.h"
31 #include "add_widget_viewer/add_widget_viewer.h"
33 #include "screen_reader_handler.h"
35 #define SCROLL_STOP_TIME 0.05
39 Evas_Object *scroller;
42 Evas_Object *allpage_add_page;
43 Evas_Object *allpage_grid;
44 page_indicator_t *indicator;
47 view_state_t view_state;
49 cluster_page_t *picked_page;
50 widget_data_t *picked_widget;
51 Ecore_Timer *edit_mode_scroll_timer;
52 Ecore_Timer *scroll_stop_timer;
54 Ecore_Animator *edit_animator;
63 .allpage_add_page = NULL,
67 .current_page = INIT_VALUE,
68 .view_state = VIEW_STATE_NORMAL,
71 .picked_widget = NULL,
72 .edit_mode_scroll_timer = NULL,
73 .scroll_stop_timer = NULL,
75 .edit_animator = NULL,
76 .animation_from_x = INIT_VALUE,
77 .animation_from_y = INIT_VALUE,
78 .animation_to_x = INIT_VALUE,
79 .animation_to_y = INIT_VALUE,
82 static int cluster_menu_list[4] = {
84 MENU_CLUSTER_ADD_WIDGET,
85 MENU_CLUSTER_CHANGE_WALLPAPER,
86 MENU_CLUSTER_ALL_PAGES
89 static mouse_info_t cluster_mouse_info = {
91 .long_pressed = false,
98 .long_press_timer = NULL,
104 #define SCROLL_TIMING_ISSUE
105 #ifdef SCROLL_TIMING_ISSUE
106 #define SCROLL_TIMING_INTERVAL 0.001
108 static Ecore_Timer *__scroll_timing_timer = NULL;
111 static Eina_Hash *cluster_menu_table = NULL;
113 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win);
115 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
116 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
117 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
118 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data);
120 static void __cluster_view_create_cluster(void);
121 static void __cluster_view_create_menu(void);
122 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info);
123 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info);
124 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info);
125 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info);
126 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data);
127 static void __cluster_view_scroll_to_home(void);
128 static void __cluster_view_scroll_to_page(int page_idx, bool animation);
129 static void __cluster_view_add_widget_content(widget_data_t *item);
130 static void __cluster_view_create_all_page(void);
131 static void __cluster_view_destroy_all_page(void);
132 static cluster_page_t * __cluster_view_page_new(void);
133 static void __cluster_view_page_delete(cluster_page_t *page);
134 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
135 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
136 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info);
138 static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
139 static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
140 static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
141 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data);
142 static void __cluster_view_allpage_drag_page(void *data);
143 static void __cluster_view_allpage_pick_up_page(void *data);
144 static void __cluster_view_allpage_drop_page(void *data);
145 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source);
147 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
148 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
149 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
150 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data);
152 static void __cluster_view_edit_pick_up_widget(void *data);
153 static void __cluster_view_edit_drag_widget(void *data);
154 static void __cluster_view_edit_drop_widget(void *data);
155 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos);
156 static void __cluster_view_edit_move_anim_done(void *data);
158 static Eina_Bool __cluster_view_scroll_timer_cb(void *data);
160 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info);
161 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info);
162 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info);
163 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info);
164 static void __cluster_view_scroll_start(void);
165 static Eina_Bool __cluster_view_scroll_stop(void *data);
166 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h);
167 static int __cluster_view_allpage_get_page_index(int x, int y);
168 static void __cluster_view_allpage_reposition(void);
169 static int __cluster_view_page_sort_cb(const void *a , const void *b);
171 static void __cluster_view_get_access_page_thumbnail(Eina_List **list);
172 static void __cluster_view_get_access_page_delete_button(Eina_List **list);
173 static void __cluster_view_get_access_add_page(Eina_List **list);
175 Evas_Object *cluster_view_create(Evas_Object *win)
177 cluster_view_s.win = win;
179 Evas_Object *base_layout = __cluster_view_create_base_gui(win);
181 if (base_layout == NULL) {
182 LOGE("[FAILED][base_layout == NULL]");
186 cluster_view_s.indicator = page_indictor_create(cluster_view_s.scroller);
187 page_indicator_scroller_resize(cluster_view_s.indicator, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
192 void cluster_view_init(void)
194 widget_viewer_init(cluster_view_s.win);
197 __cluster_view_create_cluster();
198 __cluster_view_create_menu();
201 void cluster_view_app_terminate(void)
203 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb);
204 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb);
205 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb);
206 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb);
208 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb);
209 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb);
210 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb);
212 eina_hash_free(cluster_menu_table);
213 widget_viewer_fini();
216 void cluster_view_show(void)
218 page_indicator_show(cluster_view_s.indicator);
221 void cluster_view_hide(void)
223 page_indicator_hide(cluster_view_s.indicator);
226 void cluster_view_show_anim(double pos)
228 evas_object_color_set(cluster_view_s.box, 255, 255, 255, pos*255);
229 if (pos >= (1.0 - (1e-10))) {
230 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 255);
234 void cluster_view_hide_anim(double pos)
236 evas_object_color_set(cluster_view_s.box, 255, 255, 255, (1-pos)*255);
237 if (pos >= (1.0 - (1e-10))) {
238 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 0);
242 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win)
244 cluster_view_s.scroller = elm_scroller_add(win);
245 if (cluster_view_s.scroller == NULL) {
248 elm_scroller_content_min_limit(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
249 elm_scroller_bounce_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
250 elm_scroller_policy_set(cluster_view_s.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
251 elm_scroller_page_scroll_limit_set(cluster_view_s.scroller, 1, 0);
252 evas_object_size_hint_weight_set(cluster_view_s.scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
253 evas_object_resize(cluster_view_s.scroller, CLUSTER_VIEW_W, CLUSTER_VIEW_H);
255 elm_scroller_loop_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
256 elm_scroller_page_size_set(cluster_view_s.scroller, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
258 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb, NULL);
259 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb, NULL);
260 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb, NULL);
262 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb, NULL);
263 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb, NULL);
264 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb, NULL);
265 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL);
267 cluster_view_s.box = elm_box_add(cluster_view_s.scroller);
268 elm_box_horizontal_set(cluster_view_s.box, EINA_TRUE);
269 evas_object_size_hint_weight_set(cluster_view_s.box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
270 evas_object_size_hint_align_set(cluster_view_s.box, 0, 0);
271 evas_object_show(cluster_view_s.box);
273 elm_object_content_set(cluster_view_s.scroller, cluster_view_s.box);
275 return cluster_view_s.scroller;
278 static void __cluster_view_create_cluster(void)
280 Eina_List *widget_list = cluster_data_get_widget_list();
281 int page_count = cluster_data_get_page_count();
282 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
284 while (page_count--) {
285 __cluster_view_page_new();
288 Eina_List *find_list;
289 widget_data_t *item = NULL;
290 EINA_LIST_FOREACH(widget_list, find_list, item) {
291 __cluster_view_add_widget_content(item);
292 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
294 LOGE("page is NULL");
296 if (!cluster_page_set_widget(page, item)) {
297 LOGE("failed cluster_page_set_widget page %d", item->page_idx);
302 page_indicator_set_current_page(cluster_view_s.indicator, cluster_view_s.current_page);
305 static void __cluster_view_create_menu(void)
307 cluster_menu_table = eina_hash_int32_new(NULL);
308 eina_hash_add(cluster_menu_table, &cluster_menu_list[0], __cluster_view_menu_edit_cb);
309 eina_hash_add(cluster_menu_table, &cluster_menu_list[1], __cluster_view_menu_add_widget_cb);
310 eina_hash_add(cluster_menu_table, &cluster_menu_list[2], __cluster_view_menu_change_wallpaper_cb);
311 eina_hash_add(cluster_menu_table, &cluster_menu_list[3], __cluster_view_menu_all_pages_cb);
314 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info)
318 cluster_view_set_state(VIEW_STATE_EDIT);
321 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info)
325 cluster_view_set_state(VIEW_STATE_ADD_VIEWER);
328 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info)
330 const char *appid = "org.tizen.wallpaper-ui-service";
331 app_control_h app_control_handle = NULL;
333 if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
334 LOGE("[FAILED][app_control_create]");
338 app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl");
339 app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup");
340 app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen");
342 if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
343 LOGE("[FAILED][app_control_set_app_id]");
344 app_control_destroy(app_control_handle);
348 if (app_control_set_operation(app_control_handle, APP_CONTROL_OPERATION_MAIN) != APP_CONTROL_ERROR_NONE) {
349 LOGE("[FAILED][app_control_set_operation]");
350 app_control_destroy(app_control_handle);
354 if (app_control_send_launch_request(app_control_handle, __cluster_view_app_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
355 LOGE("[FAILED][app_control_send_launch_request]");
356 app_control_destroy(app_control_handle);
360 app_control_destroy(app_control_handle);
365 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info)
369 cluster_view_set_state(VIEW_STATE_ALL_PAGE);
372 void cluster_view_hw_menu_key(void)
374 if (cluster_view_s.view_state == VIEW_STATE_NORMAL)
375 menu_change_state_on_hw_menu_key(cluster_menu_table);
378 bool cluster_view_hw_home_key(void)
380 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
381 __cluster_view_scroll_to_home();
382 } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
383 cluster_view_set_state(VIEW_STATE_NORMAL);
384 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
385 cluster_view_set_state(VIEW_STATE_NORMAL);
386 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
387 cluster_view_set_state(VIEW_STATE_NORMAL);
393 bool cluster_view_hw_back_key(void)
395 if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
396 cluster_view_set_state(VIEW_STATE_NORMAL);
397 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
398 cluster_view_set_state(VIEW_STATE_NORMAL);
399 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
400 cluster_view_set_state(VIEW_STATE_NORMAL);
406 void cluster_view_lang_changed(homescreen_view_t view_type)
408 if (view_type == HOMESCREEN_VIEW_HOME) {
409 cluster_view_set_state(VIEW_STATE_NORMAL);
413 view_state_t cluster_view_get_state(void)
415 return cluster_view_s.view_state;
418 #ifdef SCROLL_TIMING_ISSUE
419 static Eina_Bool __cluster_view_close_all_page(void *data)
421 __cluster_view_destroy_all_page();
422 __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
424 evas_object_show(cluster_view_s.scroller);
426 __scroll_timing_timer = NULL;
427 return ECORE_CALLBACK_CANCEL;
431 bool cluster_view_set_state(view_state_t state)
433 if (cluster_view_s.is_srolling) {
434 LOGE("cannot change view-state");
438 if (cluster_view_s.edit_animator) {
439 ecore_animator_del(cluster_view_s.edit_animator);
440 cluster_view_s.edit_animator = NULL;
441 __cluster_view_edit_move_anim_done(cluster_view_s.picked_widget);
444 if (state == VIEW_STATE_EDIT) {
445 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
447 Eina_List *data_list = cluster_data_get_widget_list();
448 Eina_List *find_list = NULL;
450 widget_data_t *item = NULL;
451 EINA_LIST_FOREACH(data_list, find_list, item) {
452 if (item->widget_layout) {
453 if (!cluster_view_s.picked_widget || item->widget_layout != cluster_view_s.picked_widget->widget_layout) {
454 elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
456 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
457 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
458 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
460 widget_viewer_thumbnail_add(item);
461 widget_viewer_pause_widget(item);
462 elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
466 cluster_page_t *page_item = NULL;
467 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
468 if (page_item->page_layout) {
469 elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
472 } else if (state == VIEW_STATE_NORMAL) {
473 if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
474 homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
476 if (cluster_view_s.picked_widget) {
477 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
478 cluster_page_set_widget(page, cluster_view_s.picked_widget);
480 cluster_view_s.picked_widget = NULL;
482 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
483 cluster_page_drag_cancel(page);
486 Eina_List *data_list = cluster_data_get_widget_list();
487 Eina_List *find_list = NULL;
488 cluster_page_t *page_item = NULL;
489 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
490 if (page_item->page_layout) {
491 elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE);
495 widget_data_t *item = NULL;
496 EINA_LIST_FOREACH(data_list, find_list, item) {
497 if (item->widget_layout) {
498 elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
499 elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_NORMAL_STATE, SIGNAL_SOURCE);
500 widget_viewer_resume_widget(item);
503 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
504 add_widget_viewer_win_destroy();
505 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
506 elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_SHOW);
507 homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
508 page_indicator_show(cluster_view_s.indicator);
509 evas_object_hide(cluster_view_s.scroller);
512 Eina_List *find_list = NULL;
514 cluster_page_t *page_item = NULL;
516 elm_box_unpack_all(cluster_view_s.box);
517 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
518 if (page_item->page_layout) {
519 elm_box_pack_end(cluster_view_s.box, page_item->page_layout);
523 Eina_List *data_list = cluster_data_get_widget_list();
524 widget_data_t *item = NULL;
525 EINA_LIST_FOREACH(data_list, find_list, item) {
526 if (item->widget_layout) {
527 widget_viewer_resume_widget(item);
531 if (cluster_view_s.current_page >= cluster_view_s.page_count) {
532 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
535 #ifdef SCROLL_TIMING_ISSUE
536 if (__scroll_timing_timer) {
537 ecore_timer_del(__scroll_timing_timer);
538 __scroll_timing_timer = NULL;
540 __scroll_timing_timer = ecore_timer_add(SCROLL_TIMING_INTERVAL, __cluster_view_close_all_page, NULL);
542 __cluster_view_destroy_all_page();
543 __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
545 evas_object_show(cluster_view_s.scroller);
548 } else if (state == VIEW_STATE_ADD_VIEWER) {
549 add_widget_viewer_win_create();
550 } else if (state == VIEW_STATE_ALL_PAGE) {
551 elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_HIDE);
552 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
553 page_indicator_hide(cluster_view_s.indicator);
555 __cluster_view_create_all_page();
557 Eina_List *data_list = cluster_data_get_widget_list();
558 Eina_List *find_list = NULL;
559 widget_data_t *item = NULL;
560 EINA_LIST_FOREACH(data_list, find_list, item) {
561 if (item->widget_layout) {
562 widget_viewer_pause_widget(item);
567 cluster_view_s.view_state = state;
568 screen_reader_update(HOME);
573 bool cluster_view_add_widget(widget_data_t *item, bool scroll)
577 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
578 if (cluster_page_find_empty_space(page, item->type, &item->pos_x, &item->pos_y)) {
579 item->page_idx = cluster_view_s.current_page;
584 Eina_List *find_list = NULL;
585 cluster_page_t *page_item = NULL;
586 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
587 if (cluster_page_find_empty_space(page_item, item->type, &item->pos_x, &item->pos_y)) {
588 item->page_idx = page_item->page_index;
597 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
598 LOGE("cluster page is max.");
600 Evas_Smart_Cb func[3] = { NULL, NULL, NULL };
601 void *data[3] = { NULL, NULL, NULL };
602 char btn_text[3][STR_MAX] = { "", "", "" };
603 char title_text[STR_MAX] = { "" };
604 char popup_text[STR_MAX] = { "" };
605 snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_CAM_SK_OK"));
606 snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB"));
607 snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG"));
608 popup_show(1, func, data, btn_text, title_text, popup_text);
612 cluster_page_t *page_t = __cluster_view_page_new();
614 LOGE("Cannot add widget");
618 if (!cluster_page_find_empty_space(page_t, item->type, &item->pos_x, &item->pos_y)) {
622 item->page_idx = page_t->page_index;
626 if (!item->widget_layout) {
627 __cluster_view_add_widget_content(item);
630 if (!cluster_page_set_widget(page, item)) {
631 LOGE("cluster_page_set_widget is failed!!!");
636 cluster_view_s.current_page = item->page_idx;
637 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
643 void cluster_view_delete_widget(widget_data_t *item)
648 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
650 cluster_page_unset(page, item);
652 LOGE("Page is NULL");
654 if (item->widget_layout) {
655 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
656 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
657 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
659 evas_object_del(item->widget_layout);
660 item->widget_layout = NULL;
663 screen_reader_update(HOME);
666 void cluster_view_edit_on_done(cluster_page_t *page)
668 if (cluster_view_s.picked_widget) {
669 if (page->page_index == cluster_view_s.picked_widget->page_idx) {
670 cluster_page_unset(page, cluster_view_s.picked_widget);
671 cluster_mouse_info.offset_x *= 0.9;
672 cluster_mouse_info.offset_y *= 0.9;
677 void cluster_view_get_access_object_list(Eina_List **list)
679 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
680 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
681 cluster_page_get_access_widget_list(page, list, EINA_FALSE);
683 homescreen_efl_get_access_menu_btn(list);
684 homescreen_efl_get_access_apps_btn(list);
685 } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
686 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
687 cluster_page_get_access_widget_list(page, list, EINA_TRUE);
688 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
689 __cluster_view_get_access_page_thumbnail(list);
690 __cluster_view_get_access_page_delete_button(list);
692 __cluster_view_get_access_add_page(list);
696 static void __cluster_view_get_access_page_thumbnail(Eina_List **list)
698 Eina_List *find_list = NULL;
699 cluster_page_t *page_item = NULL;
700 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
701 if (page_item->thumbnail_ly) {
702 char buf[STR_MAX] = { 0, };
703 snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), page_item->page_index + 1, cluster_view_s.page_count);
704 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
705 info->is_access_obj = EINA_FALSE;
706 info->target = page_item->thumbnail_ly;
707 info->parent = page_item->page_layout;
708 info->name = strdup(buf);
709 info->description = strdup(_("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
710 info->role = ELM_ATSPI_ROLE_UNKNOWN;
711 info->clicked_cb = __cluster_view_allpage_clicked_page;
712 info->cb_data = page_item;
713 info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE;
715 *list = eina_list_append(*list, info);
720 static void __cluster_view_get_access_page_delete_button(Eina_List **list)
722 if (eina_list_count(cluster_view_s.page_list) > 1) {
723 Eina_List *find_list = NULL;
724 cluster_page_t *page_item = NULL;
725 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
726 if (page_item->thumbnail_ly) {
727 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
728 info->is_access_obj = EINA_FALSE;
729 info->target = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(page_item->thumbnail_ly), CLUSTER_ALLPAGE_DELETE_BUTTON);
730 info->parent = page_item->thumbnail_ly;
731 info->name = strdup(_("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
732 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
733 info->role = ELM_ATSPI_ROLE_UNKNOWN;
734 info->clicked_cb = __cluster_view_allpage_delete_clicked;
735 info->cb_data = page_item;
736 info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE + ACCESS_PRIORITY_ALL_PAGE / 2;
738 *list = eina_list_append(*list, info);
744 static void __cluster_view_get_access_add_page(Eina_List **list)
746 if (cluster_view_s.allpage_add_page) {
747 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
748 info->is_access_obj = EINA_FALSE;
749 info->target = cluster_view_s.allpage_add_page;
750 info->parent = cluster_view_s.allpage_grid;
751 info->name = strdup(_("IDS_HS_BODY_CREATE_PAGE"));
752 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
753 info->role = ELM_ATSPI_ROLE_UNKNOWN;
754 info->clicked_cb = __cluster_view_allpage_add_clicked;
755 info->cb_data = NULL;
756 info->priority = (CLUSTER_MAX_PAGE + 1) * ACCESS_PRIORITY_ALL_PAGE;
758 *list = eina_list_append(*list, info);
762 static void __cluster_view_scroll_to_home(void)
764 __cluster_view_scroll_to_page(CLUSTER_HOME_PAGE, true);
767 static void __cluster_view_scroll_to_page(int page_idx, bool animation)
769 __cluster_view_scroll_start();
772 __D("bring in %d page", page_idx);
773 elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0);
775 page_indicator_set_current_page(cluster_view_s.indicator, page_idx);
776 LOGD("show %d page", page_idx);
778 elm_scroller_page_show(cluster_view_s.scroller, page_idx, 0);
779 __cluster_view_scroll_stop(NULL);
783 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
786 case APP_CONTROL_RESULT_CANCELED:
787 LOGE("[APP_CONTROL_RESULT_CANCELED]");
789 case APP_CONTROL_RESULT_FAILED:
790 LOGE("[APP_CONTROL_RESULT_FAILED]");
792 case APP_CONTROL_RESULT_SUCCEEDED:
793 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
796 LOGE("UNKNOWN ERROR");
801 static void __cluster_view_add_widget_content(widget_data_t *item)
804 LOGD("Create Widget: pkg[%s], type[%d]", item->pkg_name, item->type);
805 widget_viewer_add_widget(cluster_view_s.win, item, &w, &h);
806 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
807 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
808 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
809 LOGD("widget size : %d %d", w, h);
812 static void __cluster_view_create_all_page(void)
814 cluster_view_s.allpage = elm_layout_add(homescreen_efl_get_win());
815 elm_layout_file_set(cluster_view_s.allpage, util_get_res_file_path(EDJE_DIR"/cluster_allpage.edj"), GROUP_CLUSTER_ALLPAGE_LY);
817 evas_object_size_hint_align_set(cluster_view_s.allpage, EVAS_HINT_FILL, EVAS_HINT_FILL);
818 evas_object_size_hint_weight_set(cluster_view_s.allpage, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
819 evas_object_resize(cluster_view_s.allpage, WINDOW_W, WINDOW_H);
820 evas_object_move(cluster_view_s.allpage, 0, 0);
821 evas_object_show(cluster_view_s.allpage);
823 Evas_Object *page_bg = evas_object_rectangle_add(evas_object_evas_get(cluster_view_s.allpage));
824 evas_object_size_hint_min_set(page_bg, WINDOW_W, WINDOW_H);
825 evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
826 evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
827 evas_object_color_set(page_bg, 0, 0, 0, 50);
828 evas_object_show(page_bg);
829 elm_object_part_content_set(cluster_view_s.allpage, SIZE_SETTER, page_bg);
831 Evas_Object *grid = elm_grid_add(cluster_view_s.allpage);
832 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
833 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
834 elm_grid_size_set(grid, WINDOW_W, WINDOW_H);
835 evas_object_show(grid);
836 elm_layout_content_set(cluster_view_s.allpage, CLUSTER_ALLPAGE_GRID, grid);
837 cluster_view_s.allpage_grid = grid;
839 Eina_List *find_list = NULL;
840 cluster_page_t *page_item = NULL;
841 elm_box_unpack_all(cluster_view_s.box);
842 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
843 evas_object_move(page_item->page_layout, -WINDOW_W, -WINDOW_H);
844 if (page_item->page_layout) {
845 page_item->thumbnail_ly = elm_layout_add(page_item->page_layout);
846 elm_layout_file_set(page_item->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
848 evas_object_size_hint_align_set(page_item->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
849 evas_object_size_hint_weight_set(page_item->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
850 evas_object_show(page_item->thumbnail_ly);
852 Evas_Object *thumbnail = cluster_page_thumbnail(page_item);
853 elm_object_part_content_set(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
854 elm_object_signal_callback_add(page_item->thumbnail_ly,
855 SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
856 __cluster_view_allpage_delete_clicked, page_item);
858 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_item);
859 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_item);
860 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_item);
864 __cluster_view_allpage_reposition();
866 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
868 cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage_grid);
869 elm_layout_file_set(cluster_view_s.allpage_add_page, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
871 evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
872 evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
873 evas_object_show(cluster_view_s.allpage_add_page);
875 elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
876 elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
877 SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
878 __cluster_view_allpage_add_clicked, NULL);
880 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
881 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
885 static void __cluster_view_allpage_reposition(void)
887 Eina_List *find_list = NULL;
888 cluster_page_t *page_item = NULL;
889 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
891 __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
892 elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
893 if (cluster_view_s.page_count > 1)
894 elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
896 elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
901 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h)
905 if (cluster_view_s.page_count < 2) {
906 start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
907 } else if (cluster_view_s.page_count < 4) {
908 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
910 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
915 *w = CLUSTER_ALL_PAGE_PADDING_SIDE + (col * (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W));
916 *h = start_y + (row * (CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H));
919 static int __cluster_view_allpage_get_page_index(int x, int y)
922 int sx = CLUSTER_ALL_PAGE_PADDING_SIDE;
924 if (cluster_view_s.page_count < 2) {
925 sy = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
926 } else if (cluster_view_s.page_count < 4) {
927 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
929 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
931 int w = CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W;
932 int h = CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H;
934 for (idx = 0; idx < cluster_view_s.page_count; idx++) {
937 int ny = sy + (row * h) + (CLUSTER_ALL_PAGE_H / 2);
938 int nx = sx + (col * w) + (CLUSTER_ALL_PAGE_W / 2);
940 int d = (ny - y) * (ny - y) + (nx - x) * (nx - x);
941 if (d < CLUSTER_VIEW_ALLPAGE_MOVE_GAP) {
942 return (row * 2) + col;
949 static void __cluster_view_destroy_all_page(void)
951 Eina_List *find_list = NULL;
952 cluster_page_t *page_item = NULL;
953 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
955 Evas_Object *image = elm_object_part_content_get(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE);
956 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb);
957 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb);
958 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb);
960 evas_object_del(page_item->thumbnail_ly);
961 page_item->thumbnail_ly = NULL;
964 if (cluster_view_s.allpage_add_page)
965 evas_object_del(cluster_view_s.allpage_add_page);
966 if (cluster_view_s.allpage)
967 evas_object_del(cluster_view_s.allpage);
969 cluster_view_s.allpage_add_page = NULL;
970 cluster_view_s.allpage = NULL;
973 static cluster_page_t *__cluster_view_page_new(void)
975 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
976 LOGE("cluster page is max.");
980 cluster_page_t *page_t = cluster_page_new(cluster_view_s.box);
981 cluster_view_s.page_list = eina_list_append(cluster_view_s.page_list, page_t);
982 elm_box_pack_end(cluster_view_s.box, page_t->page_layout);
983 cluster_view_s.page_count = eina_list_count(cluster_view_s.page_list);
984 page_t->page_index = cluster_view_s.page_count - 1;
985 cluster_data_set_page_count(cluster_view_s.page_count);
987 page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
992 static void __cluster_view_page_delete(cluster_page_t *page)
994 elm_grid_unpack(cluster_view_s.allpage_grid, page->thumbnail_ly);
996 cluster_view_s.page_list = eina_list_remove(cluster_view_s.page_list, page);
997 elm_box_unpack(cluster_view_s.box, page->page_layout);
999 Eina_List *find_list = NULL;
1000 widget_data_t *widget = NULL;
1001 EINA_LIST_FOREACH(page->widget_list, find_list, widget) {
1002 cluster_data_delete(widget);
1004 cluster_page_delete(page);
1006 cluster_view_s.page_count--;
1008 cluster_data_set_page_count(cluster_view_s.page_count);
1009 page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
1012 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1014 if (cluster_view_s.page_count <= 1)
1017 cluster_page_t *page_item = (cluster_page_t *)data;
1018 if (eina_list_count(page_item->widget_list) > 0) {
1019 Evas_Smart_Cb func[3] = { __cluster_view_allpage_delete_page_cb, NULL, NULL };
1020 void *data[3] = { page_item, NULL, NULL };
1021 char btn_text[3][STR_MAX] = { "", "", "" };
1022 char title_text[STR_MAX] = { "" };
1023 char popup_text[STR_MAX] = { "" };
1024 snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_HS_OPT_DELETE"));
1025 snprintf(btn_text[1], sizeof(btn_text[1]), "%s", _("IDS_CAM_SK_CANCEL"));
1026 snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
1027 snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED"));
1028 popup_show(2, func, data, btn_text, title_text, popup_text);
1030 __cluster_view_allpage_delete_page_cb(page_item, NULL, NULL);
1034 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1036 cluster_page_t *page_t = __cluster_view_page_new();
1038 LOGE("cluster page is max.");
1042 elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page);
1044 page_t->thumbnail_ly = elm_layout_add(page_t->page_layout);
1045 elm_layout_file_set(page_t->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
1047 evas_object_size_hint_align_set(page_t->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
1048 evas_object_size_hint_weight_set(page_t->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1049 evas_object_show(page_t->thumbnail_ly);
1051 Evas_Object *thumbnail = cluster_page_thumbnail(page_t);
1052 elm_object_part_content_set(page_t->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
1053 elm_object_signal_emit(page_t->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1054 elm_object_signal_callback_add(page_t->thumbnail_ly,
1055 SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
1056 __cluster_view_allpage_delete_clicked, page_t);
1058 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_t);
1059 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_t);
1060 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_t);
1062 __cluster_view_allpage_reposition();
1064 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1066 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1067 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1069 evas_object_del(cluster_view_s.allpage_add_page);
1070 cluster_view_s.allpage_add_page = NULL;
1073 screen_reader_update(HOME);
1076 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info)
1078 cluster_page_t *page = (cluster_page_t *)data;
1080 Eina_List *find_list = NULL;
1081 cluster_page_t *page_item = NULL;
1082 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1083 if (page_item->page_index > page->page_index) {
1084 page_item->page_index -= 1;
1089 Eina_List *widget_list = NULL;
1090 widget_data_t *widget_item = NULL;
1091 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1092 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1093 if (page_item == page)
1094 widget_item->page_idx = -1;
1096 widget_item->page_idx = page_item->page_index;
1097 cluster_data_update(widget_item);
1101 __cluster_view_page_delete(page);
1102 __cluster_view_allpage_reposition();
1105 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1106 if (cluster_view_s.allpage_add_page == NULL) {
1107 cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage);
1108 elm_layout_file_set(cluster_view_s.allpage_add_page, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
1110 evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
1111 evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1112 evas_object_show(cluster_view_s.allpage_add_page);
1114 elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
1115 elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
1116 SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
1117 __cluster_view_allpage_add_clicked, NULL);
1120 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1121 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1124 screen_reader_update(HOME);
1127 static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1129 Evas_Event_Mouse_Down* ev = event_info;
1130 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1132 cluster_mouse_info.pressed = true;
1133 cluster_mouse_info.pressed_obj = obj;
1135 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1136 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1138 if (cluster_mouse_info.long_press_timer) {
1139 ecore_timer_del(cluster_mouse_info.long_press_timer);
1140 cluster_mouse_info.long_press_timer = NULL;
1143 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1144 __cluster_view_thumbnail_long_press_time_cb, data);
1147 static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1149 cluster_page_t *page_t = (cluster_page_t *) data;
1150 Evas_Event_Mouse_Up* ev = event_info;
1151 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1153 if (!cluster_mouse_info.pressed)
1156 cluster_mouse_info.pressed = false;
1157 cluster_mouse_info.pressed_obj = NULL;
1159 if (cluster_mouse_info.long_press_timer) {
1160 ecore_timer_del(cluster_mouse_info.long_press_timer);
1161 cluster_mouse_info.long_press_timer = NULL;
1164 cluster_mouse_info.up_x = ev->output.x;
1165 cluster_mouse_info.up_y = ev->output.y;
1167 if (!cluster_mouse_info.long_pressed) {
1168 int distance = (cluster_mouse_info.down_x - cluster_mouse_info.up_x) * (cluster_mouse_info.down_x - cluster_mouse_info.up_x);
1169 distance += (cluster_mouse_info.down_y - cluster_mouse_info.up_y) * (cluster_mouse_info.down_y - cluster_mouse_info.up_y);
1171 if (distance <= MOUSE_MOVE_MIN_DISTANCE) {
1172 cluster_view_s.current_page = page_t->page_index;
1173 cluster_view_set_state(VIEW_STATE_NORMAL);
1179 cluster_mouse_info.long_pressed = false;
1181 if (cluster_view_s.picked_page) {
1182 __cluster_view_allpage_drop_page(data);
1186 static int __cluster_view_page_sort_cb(const void *a , const void *b)
1188 cluster_page_t *item1 = (cluster_page_t *)a;
1189 cluster_page_t *item2 = (cluster_page_t *)b;
1191 return item1->page_index - item2->page_index;
1194 static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1196 Evas_Event_Mouse_Move* ev = event_info;
1198 if (!cluster_mouse_info.pressed)
1201 cluster_mouse_info.move_x = ev->cur.output.x;
1202 cluster_mouse_info.move_y = ev->cur.output.y;
1204 if (!cluster_mouse_info.long_pressed) {
1205 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1206 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1208 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1209 if (cluster_mouse_info.long_press_timer) {
1210 ecore_timer_del(cluster_mouse_info.long_press_timer);
1211 cluster_mouse_info.long_press_timer = NULL;
1218 if (cluster_view_s.picked_page) {
1219 __cluster_view_allpage_drag_page(data);
1223 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data)
1225 if (!cluster_mouse_info.pressed)
1226 return ECORE_CALLBACK_CANCEL;
1228 cluster_mouse_info.long_pressed = true;
1230 if (cluster_mouse_info.long_press_timer) {
1231 ecore_timer_del(cluster_mouse_info.long_press_timer);
1232 cluster_mouse_info.long_press_timer = NULL;
1235 __cluster_view_allpage_pick_up_page(data);
1237 return ECORE_CALLBACK_CANCEL;
1240 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source)
1242 cluster_page_t *page_t = (cluster_page_t *)data;
1244 cluster_view_s.current_page = page_t->page_index;
1245 cluster_view_set_state(VIEW_STATE_NORMAL);
1248 static void __cluster_view_allpage_drag_page(void *data)
1250 if (cluster_view_s.picked_page) {
1251 int move_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1252 int move_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1253 int new_index = INIT_VALUE;
1254 evas_object_move(cluster_view_s.picked_page->thumbnail_ly, move_x, move_y);
1255 new_index = __cluster_view_allpage_get_page_index(MIRRORING_X(move_x + CLUSTER_ALL_PAGE_W / 2, WINDOW_W), move_y + CLUSTER_ALL_PAGE_H / 2);
1259 if (new_index != cluster_view_s.picked_page->page_index && new_index != INIT_VALUE) {
1260 if (cluster_view_s.picked_page->page_index < new_index) {
1262 start = cluster_view_s.picked_page->page_index;
1264 } else if (cluster_view_s.picked_page->page_index > new_index) {
1266 end = cluster_view_s.picked_page->page_index;
1270 Eina_List *find_list = NULL;
1271 cluster_page_t *page_item = NULL;
1272 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1273 if (page_item == cluster_view_s.picked_page) {
1274 page_item->page_index = new_index;
1275 } else if (page_item->page_index >= start && page_item->page_index <= end) {
1276 page_item->page_index += move;
1278 elm_grid_unpack(cluster_view_s.allpage_grid, page_item->thumbnail_ly);
1282 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1283 if (page_item != cluster_view_s.picked_page) {
1284 __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
1285 elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1292 static void __cluster_view_allpage_pick_up_page(void *data)
1294 screen_reader_update(CLEAR);
1296 cluster_view_s.picked_page = (cluster_page_t *)data;
1297 elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly);
1299 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
1300 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_SHOW, SIGNAL_SOURCE);
1302 int cx = -1, cy = -1;
1303 int gx = -1, gy = -1, gw = 0, gh = 0;
1306 Evas_Object *page = cluster_view_s.picked_page->thumbnail_ly;
1307 e = evas_object_evas_get(page);
1308 evas_pointer_canvas_xy_get(e, &cx, &cy);
1309 evas_object_geometry_get(page, &gx, &gy, &gw, &gh);
1311 cluster_mouse_info.offset_x = cx - gx;
1312 cluster_mouse_info.offset_y = cy - gy;
1315 static void __cluster_view_allpage_drop_page(void *data)
1317 if (cluster_view_s.picked_page) {
1318 if (cluster_view_s.page_count > 1)
1319 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1320 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_HIDE, SIGNAL_SOURCE);
1323 __cluster_view_allpage_get_page_pos(cluster_view_s.picked_page->page_index, &x, &y);
1324 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1325 cluster_view_s.picked_page = NULL;
1327 cluster_view_s.page_list = eina_list_sort(cluster_view_s.page_list,
1328 eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb);
1330 Eina_List *find_list = NULL, *widget_list = NULL;
1331 cluster_page_t *page_item = NULL;
1332 widget_data_t *widget_item = NULL;
1333 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1334 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1335 widget_item->page_idx = page_item->page_index;
1336 cluster_data_update(widget_item);
1340 screen_reader_update(HOME);
1343 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1345 Evas_Event_Mouse_Down* ev = event_info;
1346 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1348 if (cluster_view_s.edit_animator) {
1349 LOGE("edit animator is running");
1353 cluster_mouse_info.pressed = true;
1354 cluster_mouse_info.pressed_obj = obj;
1356 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1357 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1359 if (cluster_mouse_info.long_press_timer) {
1360 ecore_timer_del(cluster_mouse_info.long_press_timer);
1361 cluster_mouse_info.long_press_timer = NULL;
1364 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1365 __cluster_view_widget_long_press_time_cb, data);
1368 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1370 Evas_Event_Mouse_Up* ev = event_info;
1371 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1373 if (!cluster_mouse_info.pressed)
1376 cluster_mouse_info.pressed = false;
1377 cluster_mouse_info.pressed_obj = NULL;
1379 if (cluster_mouse_info.long_press_timer) {
1380 ecore_timer_del(cluster_mouse_info.long_press_timer);
1381 cluster_mouse_info.long_press_timer = NULL;
1384 cluster_mouse_info.up_x = ev->output.x;
1385 cluster_mouse_info.up_y = ev->output.y;
1387 if (!cluster_mouse_info.long_pressed)
1390 cluster_mouse_info.long_pressed = false;
1392 elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
1394 if (cluster_view_s.picked_widget) {
1395 __cluster_view_edit_drop_widget(data);
1399 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1401 Evas_Event_Mouse_Move* ev = event_info;
1403 if (!cluster_mouse_info.pressed)
1406 cluster_mouse_info.move_x = ev->cur.output.x;
1407 cluster_mouse_info.move_y = ev->cur.output.y;
1409 if (!cluster_mouse_info.long_pressed) {
1410 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1411 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1413 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1414 if (cluster_mouse_info.long_press_timer) {
1415 ecore_timer_del(cluster_mouse_info.long_press_timer);
1416 cluster_mouse_info.long_press_timer = NULL;
1423 if (cluster_view_s.picked_widget) {
1424 __cluster_view_edit_drag_widget(data);
1428 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data)
1430 widget_data_t *widget = (widget_data_t *)data;
1431 if (!cluster_mouse_info.pressed)
1432 return ECORE_CALLBACK_CANCEL;
1434 cluster_mouse_info.long_pressed = true;
1436 elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
1438 widget_viewer_send_cancel_click_event(widget);
1440 __cluster_view_edit_pick_up_widget(data);
1442 return ECORE_CALLBACK_CANCEL;
1445 static void __cluster_view_edit_pick_up_widget(void *data)
1447 int cx = -1, cy = -1;
1448 int gx = -1, gy = -1, gw = 0, gh = 0;
1451 screen_reader_update(CLEAR);
1453 cluster_view_s.picked_widget = (widget_data_t *)data;
1455 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1457 e = evas_object_evas_get(widget_layout);
1459 evas_pointer_canvas_xy_get(e, &cx, &cy);
1460 evas_object_geometry_get(widget_layout, &gx, &gy, &gw, &gh);
1461 LOGD("cx, cy (%d, %d )", cx, cy);
1462 LOGD("gx, gy, gw, gh (%d, %d, %d, %d)", gx, gy, gw, gh);
1464 cluster_mouse_info.offset_x = cx - gx;
1465 cluster_mouse_info.offset_y = cy - gy;
1467 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1469 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
1470 cluster_view_set_state(VIEW_STATE_EDIT);
1472 cluster_page_unset(page, cluster_view_s.picked_widget);
1475 elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
1476 elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE);
1478 evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1479 cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1482 static void __cluster_view_edit_drag_widget(void *data)
1484 cluster_view_s.picked_widget = (widget_data_t *)data;
1486 if (!cluster_view_s.picked_widget)
1489 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1490 evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1491 cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1493 if ((cluster_mouse_info.move_x > CLUSTER_EDIT_RIGHT_SCROLL_REGION) && (cluster_view_s.page_count > 1)) {
1494 if (!cluster_view_s.edit_mode_scroll_timer)
1495 cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL);
1497 } else if ((cluster_mouse_info.move_x < CLUSTER_EDIT_LEFT_SCROLL_REGION) && (cluster_view_s.page_count > 1)) {
1498 if (!cluster_view_s.edit_mode_scroll_timer)
1499 cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL);
1501 int page_x, page_y, page_w, page_h;
1502 int widget_x, widget_y;
1504 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1505 evas_object_geometry_get(page->grid, &page_x, &page_y, &page_w, &page_h);
1506 evas_object_geometry_get(widget_layout, &widget_x, &widget_y, NULL, NULL);
1510 if (cluster_view_s.edit_mode_scroll_timer) {
1511 ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1512 cluster_view_s.edit_mode_scroll_timer = NULL;
1515 if (!cluster_view_s.is_srolling) {
1516 int block_w = (page_w / CLUSTER_COL);
1517 int block_h = (page_h / CLUSTER_ROW);
1518 double pos_x = (double)widget_x / block_w + 0.5;
1519 double pos_y = (double)widget_y / block_h + 0.5;
1521 cluster_page_drag_widget(page, cluster_view_s.picked_widget->type, pos_x < 0.0 ? -1 : (int)pos_x, pos_y < 0.0 ? -1 : (int)pos_y);
1526 static void __cluster_view_edit_drop_widget(void *data)
1528 if (cluster_view_s.edit_mode_scroll_timer) {
1529 ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1530 cluster_view_s.edit_mode_scroll_timer = NULL;
1533 if (cluster_view_s.edit_animator) {
1534 ecore_animator_del(cluster_view_s.edit_animator);
1535 cluster_view_s.edit_animator = NULL;
1539 cluster_view_s.animation_from_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1540 cluster_view_s.animation_from_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1542 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1543 cluster_page_unset(page, cluster_view_s.picked_widget);
1545 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1546 cluster_page_get_highlight_xy(page, &to_x, &to_y);
1547 if (to_x == INIT_VALUE || to_y == INIT_VALUE) {
1549 evas_object_geometry_get(page->grid, &gx, &gy, &w, &h);
1550 to_x = gx + cluster_view_s.picked_widget->pos_x * (w / CLUSTER_COL);
1551 to_y = gy + cluster_view_s.picked_widget->pos_y * (h / CLUSTER_ROW);
1554 cluster_view_s.animation_to_x = to_x;
1555 cluster_view_s.animation_to_y = to_y;
1557 cluster_view_s.edit_animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __cluster_view_edit_move_anim, NULL);
1559 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
1560 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
1561 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
1564 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos)
1566 evas_object_move(cluster_view_s.picked_widget->widget_layout,
1567 (cluster_view_s.animation_to_x - cluster_view_s.animation_from_x) * pos + cluster_view_s.animation_from_x,
1568 (cluster_view_s.animation_to_y - cluster_view_s.animation_from_y) * pos + cluster_view_s.animation_from_y);
1570 if (pos >= 1.0 - (1e-10)) {
1571 __cluster_view_edit_move_anim_done(data);
1573 cluster_view_s.edit_animator = NULL;
1574 return ECORE_CALLBACK_DONE;
1577 return ECORE_CALLBACK_RENEW;
1580 static void __cluster_view_edit_move_anim_done(void *data)
1582 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1583 elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
1584 elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
1586 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1588 if (!cluster_page_drop_widget(page, cluster_view_s.picked_widget)) {
1589 if (cluster_view_s.picked_widget->page_idx != cluster_view_s.current_page) {
1590 cluster_view_s.current_page = cluster_view_s.picked_widget->page_idx;
1591 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
1594 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1595 if (!cluster_page_set_widget(page, cluster_view_s.picked_widget)) {
1596 cluster_view_add_widget(cluster_view_s.picked_widget, true);
1600 cluster_view_s.picked_widget = NULL;
1601 screen_reader_update(HOME);
1604 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1606 Evas_Event_Mouse_Down* ev = event_info;
1608 if (cluster_view_s.view_state != VIEW_STATE_NORMAL)
1611 if (cluster_view_s.edit_animator) {
1612 LOGE("edit animator is running");
1616 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1618 cluster_mouse_info.pressed = true;
1619 cluster_mouse_info.pressed_obj = obj;
1621 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1622 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1624 if (cluster_mouse_info.long_press_timer) {
1625 ecore_timer_del(cluster_mouse_info.long_press_timer);
1626 cluster_mouse_info.long_press_timer = NULL;
1629 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1630 __cluster_view_scroller_long_press_time_cb, obj);
1633 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1635 Evas_Event_Mouse_Up* ev = event_info;
1637 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1640 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1642 cluster_mouse_info.pressed = false;
1644 if (cluster_mouse_info.long_press_timer) {
1645 ecore_timer_del(cluster_mouse_info.long_press_timer);
1646 cluster_mouse_info.long_press_timer = NULL;
1649 cluster_mouse_info.up_x = ev->output.x;
1650 cluster_mouse_info.up_y = ev->output.y;
1652 cluster_mouse_info.long_pressed = false;
1655 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1657 Evas_Event_Mouse_Move* ev = event_info;
1659 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1662 cluster_mouse_info.move_x = ev->cur.output.x;
1663 cluster_mouse_info.move_y = ev->cur.output.y;
1665 if (!cluster_mouse_info.long_pressed) {
1666 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1667 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1669 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1670 if (cluster_mouse_info.long_press_timer) {
1671 ecore_timer_del(cluster_mouse_info.long_press_timer);
1672 cluster_mouse_info.long_press_timer = NULL;
1680 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data)
1682 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != data)
1683 return ECORE_CALLBACK_CANCEL;
1685 cluster_mouse_info.long_pressed = true;
1687 cluster_view_set_state(VIEW_STATE_EDIT);
1689 return ECORE_CALLBACK_CANCEL;
1692 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
1694 __cluster_view_scroll_start();
1697 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
1699 if (cluster_view_s.scroll_stop_timer) {
1700 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1701 cluster_view_s.scroll_stop_timer = NULL;
1704 cluster_view_s.scroll_stop_timer = ecore_timer_add(SCROLL_STOP_TIME, __cluster_view_scroll_stop, NULL);
1707 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info)
1709 if (cluster_view_s.scroll_stop_timer) {
1710 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1711 cluster_view_s.scroll_stop_timer = NULL;
1715 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
1717 __cluster_view_scroll_stop(NULL);
1720 static void __cluster_view_scroll_start(void)
1722 screen_reader_update(CLEAR);
1724 cluster_view_s.is_srolling = true;
1726 cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1727 Eina_List *find_list = NULL;
1728 widget_data_t *item;
1729 LOGD("Current Page : %d", cluster_view_s.current_page);
1730 EINA_LIST_FOREACH(current_page->widget_list, find_list, item) {
1731 widget_viewer_send_cancel_click_event(item);
1735 static Eina_Bool __cluster_view_scroll_stop(void *data)
1737 if (!cluster_view_s.is_srolling) {
1738 LOGE("scroll is already stopped");
1739 return ECORE_CALLBACK_CANCEL;
1742 cluster_view_s.is_srolling = false;
1744 elm_scroller_current_page_get(cluster_view_s.scroller, &cluster_view_s.current_page, NULL);
1745 cluster_view_s.current_page = cluster_view_s.current_page % cluster_view_s.page_count;
1746 LOGD("current page %d", cluster_view_s.current_page);
1748 char buf[STR_MAX] = { 0 , };
1749 snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), cluster_view_s.current_page + 1, cluster_view_s.page_count);
1750 screen_reader_read(buf);
1751 screen_reader_update(HOME);
1753 return ECORE_CALLBACK_CANCEL;
1756 static Eina_Bool __cluster_view_scroll_timer_cb(void *data)
1758 cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1760 int next_page_idx = 0;
1761 if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) > CLUSTER_EDIT_RIGHT_SCROLL_REGION) {
1762 next_page_idx = current_page->page_index + 1;
1763 } else if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) < CLUSTER_EDIT_LEFT_SCROLL_REGION) {
1764 next_page_idx = current_page->page_index - 1;
1766 cluster_view_s.edit_mode_scroll_timer = NULL;
1767 return ECORE_CALLBACK_CANCEL;
1770 if (next_page_idx < 0 || next_page_idx >= cluster_view_s.page_count) {
1771 return ECORE_CALLBACK_RENEW;
1774 cluster_page_drag_cancel(current_page);
1775 __cluster_view_scroll_to_page(next_page_idx, true);
1776 return ECORE_CALLBACK_RENEW;
1781 void __t__cluster_view_scroll_to_page(int page_idx, bool animation)
1783 __cluster_view_scroll_to_page(page_idx, animation);
1785 int __t__cluster_view_get_current_page(void)
1787 return cluster_view_s.current_page;
1789 Evas_Object * __t__cluster_view_get_scroller(void)
1791 return cluster_view_s.scroller;
1793 cluster_page_t *__t__cluster_view_page_new(void)
1795 __cluster_view_page_new();