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 "livebox/grid_item_resize.h"
18 #include "homescreen-efl.h"
20 #include "livebox/livebox_panel.h"
21 #include "livebox/livebox_widget.h"
22 #include "page_scroller.h"
24 #include "data_model.h"
31 } gird_item_resize_dir_t;
38 Eina_Bool is_resizing;
47 static void __gird_item_resize_button_pressed_cb(void *data, Evas_Object *obj,
48 const char *emission, const char *source);
49 static int __grid_item_resize_drag_pos_get(Evas_Object *obj, const char *part,
50 Eina_Bool is_horizontal);
51 static void __grid_item_resize_finalize(Evas_Object *obj);
52 static Eina_Bool __grid_item_resize_get_available_sizes(Evas_Object *livebox, int w, int h);
53 static void __grid_item_resize_drag(Evas_Object *livebox, int new_x, int new_y, int new_w,
55 static void __grid_item_resize_drag_stop_cb(void *data, Evas_Object *obj, const char *emission,
57 static void __grid_item_resize_get_sliders_geometry(Evas_Object *page, int *out_x,
58 int *out_y, int *out_w, int *out_h);
59 static void __grid_item_resize_drag_cb(void *data, Evas_Object *obj, const char *emission,
61 static void __grid_item_resize_page_background_clicked_cb(void *data, Evas_Object *obj,
62 const char *emission, const char *source);
64 #ifdef LIVEBOX_RESIZE_ENABLED
65 static void __grid_item_resize_set_slider_pos(Evas_Object *page, const char *part,
66 int pos, Eina_Bool is_horizontal);
70 void grid_item_set_resize_livebox_sliders(Evas_Object *livebox,
73 #ifdef LIVEBOX_RESIZE_ENABLED
85 LOGE("livebox == NULL");
89 elm_grid_pack_get(livebox, &x, &y, &w, &h);
90 LOGD("LIVEBOX NEW POS: %d %d %d %d", x, y, w, h);
92 __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_UP, y, EINA_FALSE);
93 __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_DOWN, y + h, EINA_FALSE);
94 __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_LEFT, x, EINA_TRUE);
95 __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_RIGHT, x + w, EINA_TRUE);
97 elm_layout_signal_emit(page, SIGNAL_RESIZE_SLIDERS_SHOW,
98 SIGNAL_LIVEBOX_SOURCE);
103 bool grid_item_init_resize_callbacks(Evas_Object *livebox_container_scroller,
104 Evas_Object *livebox_container)
106 Evas_Object *edje = NULL;
108 if (!livebox_container_scroller) {
109 LOGE("livebox_container_scroller == NULL");
113 if (!livebox_container) {
114 LOGE("livebox_container == NULL");
118 edje = elm_layout_edje_get(livebox_container);
120 LOGE("edje == NULL");
124 edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN,
125 PART_RESIZE_BUTTON_DOWN, __gird_item_resize_button_pressed_cb,
126 livebox_container_scroller);
127 edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN,
128 PART_RESIZE_BUTTON_LEFT, __gird_item_resize_button_pressed_cb,
129 livebox_container_scroller);
130 edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN,
131 PART_RESIZE_BUTTON_UP, __gird_item_resize_button_pressed_cb,
132 livebox_container_scroller);
133 edje_object_signal_callback_add(edje,
134 SIGNAL_MOUSE_DOWN, PART_RESIZE_BUTTON_RIGHT,
135 __gird_item_resize_button_pressed_cb, livebox_container_scroller);
136 edje_object_part_drag_value_set(edje,
137 PART_RESIZE_BUTTON_DOWN, 0.0, 0.999);
138 edje_object_part_drag_value_set(edje,
139 PART_RESIZE_BUTTON_UP, 0.0, 0.001);
140 edje_object_signal_callback_add(edje,
141 SIGNAL_RESIZING, PART_RESIZE_BUTTON_DOWN,
142 __grid_item_resize_drag_cb, livebox_container);
143 edje_object_signal_callback_add(edje,
144 SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_DOWN,
145 __grid_item_resize_drag_stop_cb, NULL);
146 edje_object_signal_callback_add(edje, SIGNAL_RESIZING,
147 PART_RESIZE_BUTTON_UP, __grid_item_resize_drag_cb, livebox_container);
148 edje_object_signal_callback_add(edje,
149 SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_UP, __grid_item_resize_drag_stop_cb, NULL);
150 edje_object_part_drag_value_set(edje,
151 PART_RESIZE_BUTTON_LEFT, 0.001, 0.0);
152 edje_object_part_drag_value_set(edje,
153 PART_RESIZE_BUTTON_RIGHT, 0.999, 0.0);
154 edje_object_signal_callback_add(edje,
155 SIGNAL_RESIZING, PART_RESIZE_BUTTON_LEFT, __grid_item_resize_drag_cb,
157 edje_object_signal_callback_add(edje,
158 SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_LEFT,
159 __grid_item_resize_drag_stop_cb, NULL);
160 edje_object_signal_callback_add(edje,
161 SIGNAL_RESIZING, PART_RESIZE_BUTTON_RIGHT,
162 __grid_item_resize_drag_cb, livebox_container);
163 edje_object_signal_callback_add(edje,
164 SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_RIGHT,
165 __grid_item_resize_drag_stop_cb, NULL);
167 elm_layout_signal_callback_add(livebox_container, SIGNAL_CLICKED,
168 PART_PAGE_BG, __grid_item_resize_page_background_clicked_cb, NULL);
173 void grid_item_set_resize_sliders_visibility(Evas_Object *page, bool visible)
176 LOGE("page == NULL");
181 elm_object_signal_emit(page, SIGNAL_RESIZE_SLIDERS_SHOW,
182 SIGNAL_LIVEBOX_SOURCE);
184 elm_object_signal_emit(page, SIGNAL_RESIZE_SLIDERS_HIDE,
185 SIGNAL_LIVEBOX_SOURCE);
189 static void __gird_item_resize_button_pressed_cb(void *data, Evas_Object *obj,
190 const char *emission, const char *source)
192 Evas_Object *livebox = NULL;
193 Evas_Object *livebox_scroller = NULL;
195 if (!obj || !emission || !source) {
196 LOGE("Wrong arguments provided: %p %p %p", obj,
201 livebox_scroller = data;
202 if (!livebox_scroller) {
203 LOGE("livebox_scroller == NULL");
208 page_scroller_freeze(livebox_scroller);
210 livebox = livebox_utils_selected_livebox_get();
212 LOGE("livebox == NULL");
216 elm_grid_pack_get(livebox, &s_info.x_at_drag_start,
217 &s_info.y_at_drag_start,
218 &s_info.w_at_drag_start,
219 &s_info.h_at_drag_start);
221 s_info.is_resizing = EINA_TRUE;
223 LOGD("BUTTON PRESSED: %p !!! x = %d; y = %d; w = %d; h = %d", livebox,
224 s_info.x_at_drag_start,
225 s_info.y_at_drag_start,
226 s_info.w_at_drag_start,
227 s_info.h_at_drag_start);
230 static int __grid_item_resize_drag_pos_get(Evas_Object *obj, const char *part,
231 Eina_Bool is_horizontal)
237 LOGE("Wrong arguments provided: %p %p", obj, part);
242 edje_object_part_drag_value_get(obj, part, &val, NULL);
243 pos = (int)(val * LIVEBOX_GRID_COLUMNS);
245 edje_object_part_drag_value_get(obj, part, NULL, &val);
246 pos = (int)(val * LIVEBOX_GRID_ROWS);
250 LOGD("DRAG UP STOP: %f POS: %d", val, pos);
255 static void __grid_item_resize_finalize(Evas_Object *obj)
258 Evas_Object *lb_scroller = NULL;
264 edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_OK,
265 SIGNAL_RESIZE_SLIDER_DRAG_OK);
267 s_info.is_resizing = EINA_FALSE;
269 lb_scroller = livebox_panel_get();
271 LOGE("lb_scroller == NULL");
275 page_scroller_unfreeze(lb_scroller);
278 static Eina_Bool __grid_item_resize_get_available_sizes(Evas_Object *livebox, int w, int h)
281 int *size_list = NULL;
282 Evas_Object *widget = NULL;
288 LOGE("livebox == NULL");
292 widget = elm_layout_content_get(livebox, PART_LIVEBOX);
294 LOGE("widget == NULL");
298 livebox_widget_get_size_available(widget, &cnt, &size_list);
300 LOGD("Size count: %d", cnt);
303 LOGE("size_list == NULL");
307 for (i = 0; i < cnt; ++i) {
308 livebox_widget_get_dimensions(size_list[i], &test_w, &test_h);
310 if (w == test_w * LIVEBOX_GRID_ROWS_CELLS_MULTI &&
311 h == test_h * LIVEBOX_GRID_ROWS_CELLS_MULTI) {
312 LOGD("RESIZE AVAILABLE SIZE FOUND: %d %d",
324 static void __grid_item_resize_drag(Evas_Object *livebox,
325 int new_x, int new_y, int new_w, int new_h)
328 Evas_Object *page = NULL;
329 Eina_Rectangle *rect = NULL;
331 int out_x = -1, out_y = -1, out_w = -1, out_h = -1;
334 LOGE("livebox == NULL");
338 page = livebox_utils_get_selected_livebox_layout();
340 LOGE("page == NULL");
344 list = livebox_utils_get_liveboxes_on_page_list(page);
346 LOGE("list == NULL");
351 __grid_item_resize_get_sliders_geometry(page, &out_x, &out_y, &out_w, &out_h);
352 rect = eina_rectangle_new(out_x, out_y, out_w, out_h);
354 if (__grid_item_resize_get_available_sizes(livebox, new_w, new_h) &&
355 !livebox_utils_check_rect_list_grid_interesction(rect,
357 elm_grid_pack_set(livebox, new_x, new_y, new_w, new_h);
358 LOGD("RESIZE OK: %d %d %d %d", new_x, new_y, new_w, new_h);
360 elm_grid_pack_set(livebox, s_info.x_at_drag_start,
361 s_info.y_at_drag_start,
362 s_info.w_at_drag_start,
363 s_info.h_at_drag_start);
364 LOGD("RESIZE FAIL: %d %d %d %d; ", new_x, new_y, new_w, new_h);
367 eina_rectangle_free(rect);
370 static void _drag_size_new_get(gird_item_resize_dir_t dir, Evas_Object *livebox,
371 int pos, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
376 LOGE("livebox == NULL");
380 if (!x || !y || !w || !h) { /*Other arguments can be NULL*/
381 LOGE("Wrong arguments: x = %p; y = %p; w = %p; h = %p",
386 elm_grid_pack_get(livebox, x, y, w, h);
389 case GRID_RESIZE_LEFT:
391 *w = x2 - (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI);
392 *x = (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI);
394 case GRID_RESIZE_RIGHT:
395 *w = (pos - *x) * LIVEBOX_GRID_ROWS_CELLS_MULTI;
399 *h = y2 - (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI);
400 *y = (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI);
402 case GRID_RESIZE_DOWN:
403 *h = (pos - *y) * LIVEBOX_GRID_ROWS_CELLS_MULTI;
408 static void __grid_item_resize_drag_stop_cb(void *data, Evas_Object *obj, const char *emission,
416 Evas_Object *livebox = NULL;
417 Tree_node_t *item_node = NULL;
418 gird_item_resize_dir_t resize_dir;
419 bool horizontal = false;
422 if (!obj || !emission || !source) {
423 LOGE("Wrong arguments provided: %p %p %p",
424 obj, emission, source);
428 livebox = livebox_utils_selected_livebox_get();
430 LOGE("livebox == NULL");
434 __grid_item_resize_finalize(obj);
436 if (!strncmp(PART_RESIZE_BUTTON_DOWN, source,
437 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
438 horizontal = EINA_FALSE;
439 resize_dir = GRID_RESIZE_DOWN;
440 } else if (!strncmp(PART_RESIZE_BUTTON_UP, source,
441 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
442 horizontal = EINA_FALSE;
443 resize_dir = GRID_RESIZE_UP;
444 } else if (!strncmp(PART_RESIZE_BUTTON_LEFT, source,
445 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
446 horizontal = EINA_TRUE;
447 resize_dir = GRID_RESIZE_LEFT;
448 } else if (!strncmp(PART_RESIZE_BUTTON_RIGHT, source,
449 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
450 horizontal = EINA_TRUE;
451 resize_dir = GRID_RESIZE_RIGHT;
453 LOGE("UNKNOWN PART");
457 pos = __grid_item_resize_drag_pos_get(obj, source, horizontal);
458 _drag_size_new_get(resize_dir, livebox, pos, &x, &y, &w, &h);
460 __grid_item_resize_drag(livebox, x, y, w, h);
461 elm_grid_pack_get(livebox, &x, &y, &w, &h);
463 edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_DOWN, 0,
464 (y + h) * LIVEBOX_RESIZE_POS_MULTI_ROWS);
466 edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_UP, 0,
467 (float) y * LIVEBOX_RESIZE_POS_MULTI_ROWS);
469 edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_LEFT,
470 (float) x * LIVEBOX_RESIZE_POS_MULTI_COLS, 0);
472 edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_RIGHT,
473 (float) (x + w) * LIVEBOX_RESIZE_POS_MULTI_COLS, 0);
475 item_node = evas_object_data_get(livebox, KEY_ICON_DATA);
477 LOGE("item_node == NULL");
481 data_model_resize_widget(item_node, x, y, w, h);
482 home_screen_print_tree();
485 static void __grid_item_resize_get_sliders_geometry(Evas_Object *page, int *out_x,
486 int *out_y, int *out_w, int *out_h)
488 Evas_Object *edje = elm_layout_edje_get(page);
489 Evas_Object *grid = NULL;
493 LOGE("edje == NULL");
497 grid = edje_object_part_swallow_get(edje, SIGNAL_CONTENT_SOURCE);
499 LOGE("grid == NULL");
503 if (!out_x || !out_y || !out_w || !out_h) {
504 LOGE("x = %p; y = %p; w = %p; h = %p",
505 out_x, out_y, out_w, out_h);
509 edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_LEFT,
511 *out_x = round(val * LIVEBOX_TOTAL_COLUMNS);
513 edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_UP,
515 *out_y = round(val * LIVEBOX_TOTAL_ROWS);
517 edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_RIGHT,
519 *out_w = round(val * LIVEBOX_TOTAL_COLUMNS - *out_x);
521 edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_DOWN,
523 *out_h = round(val * LIVEBOX_TOTAL_ROWS - *out_y);
526 static void __grid_item_resize_drag_cb(void *data, Evas_Object *obj, const char *emission,
534 Evas_Object *livebox = NULL;
535 Eina_List *list = NULL;
536 Eina_Rectangle *rect;
537 int out_x = -1, out_y = -1, out_w = -1, out_h = -1;
539 Evas_Object *page_container = data;
540 if (!page_container) {
541 LOGE("page_container == NULL");
545 if (!obj || !emission || !source) {
546 LOGE("Wrong arguments provided: obj == %p; \
547 emission == %p; source == %p", obj, emission, source);
551 livebox = livebox_utils_selected_livebox_get();
553 LOGE("livebox == NULL");
557 list = livebox_utils_get_liveboxes_on_page_list(page_container);
559 LOGE("list == NULL");
564 if (!strncmp(source, PART_RESIZE_BUTTON_DOWN,
565 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
566 pos = __grid_item_resize_drag_pos_get(obj, source, EINA_FALSE);
567 _drag_size_new_get(GRID_RESIZE_DOWN, livebox, pos,
570 LOGD("pos = %d", pos);
571 } else if (!strncmp(source, PART_RESIZE_BUTTON_UP,
572 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
573 pos = __grid_item_resize_drag_pos_get(obj, source, EINA_FALSE);
574 _drag_size_new_get(GRID_RESIZE_UP, livebox,
575 pos, &x, &y, &w, &h);
577 LOGD("pos = %d", pos);
578 } else if (!strncmp(source, PART_RESIZE_BUTTON_LEFT,
579 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
580 pos = __grid_item_resize_drag_pos_get(obj, source, EINA_TRUE);
581 _drag_size_new_get(GRID_RESIZE_LEFT, livebox,
582 pos, &x, &y, &w, &h);
583 } else if (!strncmp(source, PART_RESIZE_BUTTON_RIGHT,
584 LIVEBOX_MAX_BUTTON_NAME_LENGTH)) {
585 pos = __grid_item_resize_drag_pos_get(obj, source, EINA_TRUE);
586 _drag_size_new_get(GRID_RESIZE_RIGHT, livebox,
587 pos, &x, &y, &w, &h);
592 __grid_item_resize_get_sliders_geometry(page_container, &out_x,
593 &out_y, &out_w, &out_h);
594 rect = eina_rectangle_new(out_x, out_y, out_w, out_h);
596 if (!__grid_item_resize_get_available_sizes(livebox, w, h) ||
597 livebox_utils_check_rect_list_grid_interesction(rect,
599 edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_ERR,
600 SIGNAL_LIVEBOX_SOURCE);
602 edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_OK,
603 SIGNAL_LIVEBOX_SOURCE);
606 eina_rectangle_free(rect);
609 #ifdef LIVEBOX_RESIZE_ENABLED
610 static void __grid_item_resize_set_slider_pos(Evas_Object *page, const char *part,
611 int pos, Eina_Bool is_horizontal)
613 Evas_Object *edje = NULL;
616 LOGE("page == NULL");
620 edje = elm_layout_edje_get(page);
622 LOGE("page == NULL");
627 LOGE("part == NULL");
632 if (pos < 0 || pos > LIVEBOX_TOTAL_COLUMNS) {
633 LOGE("Wrong value of pos = %d", pos);
637 LOGD("NEW POS OF %s is %f", part,
638 (float)pos / LIVEBOX_TOTAL_COLUMNS);
639 edje_object_part_drag_value_set(edje, part,
640 (float)pos / LIVEBOX_TOTAL_COLUMNS, 0);
642 if (pos < 0 || pos > LIVEBOX_TOTAL_ROWS) {
643 LOGE("Wrong value of pos = %d", pos);
647 LOGD("NEW POS OF %s is %f", part,
648 (float)pos / LIVEBOX_TOTAL_ROWS);
649 edje_object_part_drag_value_set(edje, part, 0,
650 (float)pos / LIVEBOX_TOTAL_ROWS);
655 static void __grid_item_resize_page_background_clicked_cb(void *data, Evas_Object *obj,
656 const char *emission, const char *source)
663 LOGD("Background clicked");
664 elm_layout_signal_emit(obj, SIGNAL_RESIZE_SLIDERS_HIDE,
665 SIGNAL_LIVEBOX_SOURCE);