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.
18 #include <Elementary.h>
21 #include "homescreen-efl.h"
22 #include "page_scroller.h"
24 #define PAGE_SCROLLER_WIDTH 272
25 #define PAGE_SCROLLER_HEIGHT 272
27 #define EDJE_PAGE_SCROLLER_FILENAME "/usr/apps/com.samsung.home-lite/res/edje/page_scroller.edj"
28 #define EDJE_PAGE_SCROLLER_LIVEBOX_GROUP_NAME "page_scroller_livebox"
29 #define EDJE_PAGE_SCROLLER_ALL_APPS_GROUP_NAME "page_scroller_all_apps"
30 #define EDJE_PAGE_SCROLLER_CONTENT_GROUP_NAME "page_scroller_content"
33 static Evas_Object *__page_scroller_create_scroller(void);
34 static void __page_scroller_change_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
35 static Eina_Bool __page_scroller_blocker_cb(void *data);
44 HAPI Evas_Object *page_scroller_create(int page_width, int page_height)
46 Evas_Object *scroller = NULL;
48 scroller = __page_scroller_create_scroller();
50 LOGE("Failed to create scroller");
54 elm_scroller_page_size_set(scroller, page_width, page_height);
55 elm_scroller_loop_set(scroller, EINA_TRUE, EINA_FALSE);
56 elm_object_signal_callback_add(scroller, "*", SIGNAL_SOURCE, __page_scroller_change_cb, NULL);
62 HAPI void page_scroller_destroy(Evas_Object *scroller)
64 LOGD("Destroy page scroller");
67 LOGE("Invalid param : scroller is NULL");
71 evas_object_del(scroller);
74 HAPI bool page_scroller_add_page(Evas_Object *scroller, Evas_Object *page)
78 Evas_Object *box = NULL;
80 if (!page || !scroller) {
81 LOGE("Invalid parameters : page or scroller is NULL");
85 box = elm_object_content_get(scroller);
87 LOGE("Failed to obtain box from scroller");
91 elm_box_pack_end(box, page);
96 HAPI void page_scroller_remove_page(Evas_Object *scroller, Evas_Object *page)
99 Evas_Object *box = NULL;
101 if (!page || !scroller) {
102 LOGE("Page or scroller is NULL");
106 box = elm_object_content_get(scroller);
108 LOGE("Failed to get scroller");
112 elm_box_unpack(box, page);
113 evas_object_del(page);
117 HAPI Eina_List* page_scroller_get_all_pages(Evas_Object *scroller)
119 Evas_Object *box = NULL;
120 Eina_List *pages = NULL;
123 LOGE("Invalid parameter : scroller is NULL");
127 box = elm_object_content_get(scroller);
129 LOGE("Failed to get box");
133 pages = elm_box_children_get(box);
135 LOGE("Failed to get pages list");
143 HAPI Evas_Object* page_scroller_get_page(Evas_Object *scroller, int n)
145 Eina_List *pages = NULL;
146 Evas_Object *page = NULL;
148 pages = page_scroller_get_all_pages(scroller);
150 LOGE("Failed to get page");
154 page = (Evas_Object*) eina_list_nth(pages, n);
156 eina_list_free(pages);
162 HAPI bool page_scroller_freeze(Evas_Object *scroller)
164 LOGD("Freeze page scroller");
167 LOGE("Page Scroller is NULL");
171 elm_scroller_movement_block_set(scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
176 HAPI bool page_scroller_unfreeze(Evas_Object *scroller)
178 LOGD("Unfreeze page scroller");
181 LOGE("Page Scroller is NULL");
185 elm_scroller_movement_block_set(scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
190 HAPI int page_scroller_get_page_count(Evas_Object *scroller)
192 Eina_List *page_list = NULL;
196 LOGE("invalid param : scroller is NULL");
200 page_list = page_scroller_get_all_pages(scroller);
201 page_count = eina_list_count(page_list);
203 eina_list_free(page_list);
209 HAPI Eina_List* page_scroller_unpack_pages(Evas_Object *scroller)
211 Evas_Object *box = NULL;
212 Eina_List *page_list = NULL;
215 LOGE("Page scroller is NULL");
219 page_list = page_scroller_get_all_pages(scroller);
222 LOGE("Failed to get m_page list");
226 box = elm_object_content_get(scroller);
227 elm_box_unpack_all(box); ///@todo better content unset?
233 HAPI void page_scroller_pack_pages(Evas_Object *scroller, Eina_List *page_list)
236 Eina_List *item = NULL;
237 Evas_Object *page = NULL;
238 Evas_Object *box = NULL;
240 if (!scroller || !page_list) {
241 LOGE("Invalid parameters : scroller [%p] page_list [%p]", scroller, page_list);
245 box = elm_object_content_get(scroller);
247 LOGE("Cannot obtain box, pages will remain unpacked");
251 EINA_LIST_FOREACH(page_list, item, page) {
253 LOGE("Failed to get page");
256 elm_box_pack_end(box, page);
257 evas_object_size_hint_weight_set(page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
258 evas_object_size_hint_align_set(page, EVAS_HINT_FILL, EVAS_HINT_FILL);
260 elm_box_recalculate(box);
264 HAPI Evas_Object* page_scroller_get_page_thumbnail(Evas_Object *page, unsigned int w, unsigned int h)
267 Evas_Object *image = NULL;
270 LOGE("Invalid page number");
274 image = evas_object_image_filled_add(evas_object_evas_get(home_screen_get_win()));
276 LOGE("Could not create image proxy object");
281 if (!evas_object_image_source_set(image, page)) {
282 evas_object_del(image);
283 LOGE("Could not set proxy image source");
287 evas_object_image_fill_set(image, 0, 0, w, h);
288 evas_object_move(image, 0, 0);
289 evas_object_show(image);
294 HAPI int page_scroller_get_current_page(Evas_Object *page_scroller)
298 if (!page_scroller) {
299 LOGE("Invalid param : page_scroller is NULL");
303 elm_scroller_current_page_get(page_scroller, &h_page, NULL);
308 HAPI bool page_scroller_set_current_page(Evas_Object *page_scroller, int idx)
310 if (!page_scroller || idx < 0) {
311 LOGE("[INVALID_PARAM][page_scroller='%p'][idx='%d']", page_scroller, idx);
316 elm_scroller_page_bring_in(page_scroller, idx, 0);
320 HAPI void page_scroller_show_page(Evas_Object *page_scroller, int idx)
322 if (!page_scroller || idx < 0) {
323 LOGE("[INVALID_PARAM][page_scroller='%p'][idx='%d']", page_scroller, idx);
327 elm_scroller_page_show(page_scroller, idx, 0);
330 static Evas_Object* __page_scroller_create_scroller(void)
332 Evas_Object *win = home_screen_get_win();
333 Evas_Object *scroller = NULL;
334 Evas_Object *box = NULL;
337 print_log(DLOG_ERROR, LOG_TAG, "Window doesn't exist");
341 scroller = elm_scroller_add(win);
343 LOGE("Cannot create scroller");
347 elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE);
348 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
349 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
350 elm_scroller_page_scroll_limit_set(scroller, 1, 1);
352 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
354 box = elm_box_add(scroller);
356 LOGE("Cannot create box");
357 evas_object_del(scroller);
360 elm_box_horizontal_set(box, EINA_TRUE);
361 elm_box_align_set(box, 0.5, 0.5);
362 evas_object_show(scroller);
363 elm_object_content_set(scroller, box);
368 static void __page_scroller_change_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
370 int cnt = -1, curr = -1, dest = -1;
372 cnt = page_scroller_get_page_count(obj);
373 curr = page_scroller_get_current_page(obj);
378 if (!strncmp(emission, SIGNAL_NEXT_PAGE_CHANGE, strlen(emission))) {
379 if (curr == cnt - 1) {
384 page_scroller_set_current_page(obj, dest);
385 } else if (!strncmp(emission, SIGNAL_PREV_PAGE_CHANGE, strlen(emission))) {
391 page_scroller_set_current_page(obj, dest);
394 s_info.blocker = ecore_timer_add(0.5, __page_scroller_blocker_cb, NULL);
397 static Eina_Bool __page_scroller_blocker_cb(void *data)
399 s_info.blocker = NULL;
400 return ECORE_CALLBACK_CANCEL;