From d7b9f77e7e59231fea11ec10fc79439dd4d038ff Mon Sep 17 00:00:00 2001 From: Kamil Lipiszko Date: Tue, 12 Apr 2016 12:53:14 +0200 Subject: [PATCH 01/16] homescreen: Layout freeze fix Change-Id: I99a9a56150c831ef5b3c61539f89efc51bcc66c7 --- src/homescreen-efl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/homescreen-efl.c b/src/homescreen-efl.c index 834a96e..984c1d4 100644 --- a/src/homescreen-efl.c +++ b/src/homescreen-efl.c @@ -1239,7 +1239,7 @@ static Eina_Bool __homescreen_efl_show_all_apps_anim(void *data, double pos) evas_object_color_set(box, 255, 255, 255, pos*(double)255); - if (pos >= 1.0) { + if (pos >= 0.99) { elm_object_part_content_set(s_info.layout, PART_CONTENT, s_info.all_apps); all_apps_show(); elm_object_signal_emit(s_info.layout, SIGNAL_UNBLOCK_EVENTS, SIGNAL_SOURCE); @@ -1259,7 +1259,7 @@ static Eina_Bool __homescreen_efl_show_home_anim(void *data, double pos) evas_object_color_set(box, 255, 255, 255, (1.0 - pos * 2.0)*(double)255); - if (pos >= 1.0) { + if (pos >= 0.99) { if (s_info.layout && elm_object_part_content_get(s_info.layout, PART_CONTENT) == NULL && s_info.home) { elm_object_part_content_set(s_info.layout, PART_CONTENT, s_info.home); livebox_panel_set_content(s_info.layout); -- 2.7.4 From 4a9eb46abbe7491cb9042144bbb399d5f60b4b2c Mon Sep 17 00:00:00 2001 From: Kamil Lipiszko Date: Thu, 14 Apr 2016 11:51:04 +0200 Subject: [PATCH 02/16] data_model: remove build warning Change-Id: Ie74d35a104e887efe36b1f895c0ec31671d46f40 --- src/data_model.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data_model.c b/src/data_model.c index 99bf127..190149c 100644 --- a/src/data_model.c +++ b/src/data_model.c @@ -612,7 +612,7 @@ Tree_node_t *data_model_search_package(const char* pkg_str) { search_package_t search; search.data = NULL; - search.search = pkg_str; + search.search = (char *)pkg_str; tree_in_depth_browse(s_info.all_apps, __data_model_search_package_cb, &search); -- 2.7.4 From f2f1ee6337bca7e4ab2ba9c051c5f660972eb9d3 Mon Sep 17 00:00:00 2001 From: Kamil Lipiszko Date: Wed, 13 Apr 2016 11:51:35 +0200 Subject: [PATCH 03/16] edje: Add ... to not matching icon label Change-Id: Ia020f0b3aff9c208615b2627df4f2f8127d70eac --- inc/conf.h | 4 ++-- res/edje/icon.edc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/inc/conf.h b/inc/conf.h index 50baf66..cbd3a9b 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -519,7 +519,7 @@ #define _SEPARATOR_Y_MAX 64 #define _CONTENT_Y_MIN 53 -#define _CONTENT_Y_MAX 569 +#define _CONTENT_Y_MAX 635 #define _INDEX_Y_MIN 355 #define _INDEX_Y_MAX 421 @@ -567,7 +567,7 @@ #define FOLDER_POPUP_X_REL 0.0441 #define FOLDER_GRID_W_REL 0.9 -#define FOLDER_GRID_H_REL 0.58 +#define FOLDER_GRID_H_REL 0.6 #define FOLDER_ITEM_MARGIN 0.04 #define FOLDER_LEFT_MARGIN 0.07 diff --git a/res/edje/icon.edc b/res/edje/icon.edc index 8a07f77..6fbbde2 100644 --- a/res/edje/icon.edc +++ b/res/edje/icon.edc @@ -29,11 +29,11 @@ images { styles { style{ name: "icon_label"; - base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=28 wrap=mixed"; + base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=28 wrap=mixed ellipsis=1.0"; } style{ name: "icon_label_edit"; - base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=25 wrap=mixed"; + base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=25 wrap=mixed ellipsis=1.0"; } } @@ -137,7 +137,7 @@ collections { state: "edit" 0.0; inherit: "default" 0.0; rel1{relative: ICON_NAME_X_MIN ICON_NAME_Y_MIN; to: "icon_bg";} - rel2{relative: ICON_NAME_X_MAX ICON_NAME_Y_MAX; to: "icon_bg";} + rel2{relative: ICON_NAME_X_MAX 1.0; to: "icon_bg";} text { style: "icon_label_edit"; } -- 2.7.4 From d245e469d8a339bda12d4baa6bb8fa7ee9934741 Mon Sep 17 00:00:00 2001 From: Kamil Lipiszko Date: Fri, 22 Apr 2016 12:04:11 +0200 Subject: [PATCH 04/16] app_mgr: validate app info before it is copied Change-Id: Ia933fc10c277f7dc5e4b863d809b3ffeed8586db --- src/app_mgr.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app_mgr.c b/src/app_mgr.c index 07cd317..4720064 100644 --- a/src/app_mgr.c +++ b/src/app_mgr.c @@ -234,6 +234,12 @@ static void __app_mgr_event_cb(const char *type, const char *package, } app_mgr_item = __app_mgr_load_item_info(ai_handle); + if (!app_mgr_item) { + LOGE("Failed to load app mgr item info"); + app_info_destroy(ai_handle); + return; + } + item = data_model_install_application(app_mgr_item); if (!item) { LOGE("Failed to create app item"); -- 2.7.4 From cd98f00d5b59764d44201aaa22ee80db0b7e7797 Mon Sep 17 00:00:00 2001 From: "juhee,park" Date: Mon, 9 May 2016 11:53:18 +0900 Subject: [PATCH 05/16] [TSAM-2390]add string Signed-off-by: juhee,park Change-Id: I7b3be42042774730293526e699aa66ef30c19ea0 --- res/po/en.po | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/res/po/en.po b/res/po/en.po index 0852283..ab8d2f0 100755 --- a/res/po/en.po +++ b/res/po/en.po @@ -307,6 +307,12 @@ msgstr "Maximum number of characters reached." msgid "IDS_COM_SK_OK" msgstr "OK" +msgid "IDS_COM_SK_CANCEL" +msgstr "Cancel" + +msgid "IDS_COM_SK_DONE" +msgstr "Done" + msgid "IDS_CAM_BODY_SHOWING_PD_ITEMS_T_TTS" msgstr "Showing %d items" @@ -343,6 +349,9 @@ msgstr "Select" msgid "IDS_COM_BODY_INTERNET" msgstr "Internet" +msgid "IDS_MEMO_HEADER_PD_SELECTED_ABB2" +msgstr "%d selected" + msgid "IDS_ST_SK_NEXT" msgstr "Next" @@ -391,6 +400,63 @@ msgstr "All pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Blank" +msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" +msgstr "Add Dynamic Box" + +msgid "IDS_ST_BUTTON_REMOVE_ABB2" +msgstr "Remove" + +msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" +msgstr "Remove folder" + +msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" +msgstr "Folder will be removed. Applications in this folder will not be uninstalled." + +msgid "IDS_HS_OPT_MANUALLY_ABB" +msgstr "Manually" + +msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" +msgstr "By name (A-Z)" + +msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" +msgstr "%s will be uninstalled." + +msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" +msgstr "Unable to rearrange icons sorted by name (A-Z)." + +msgid "IDS_TPLATFORM_ACBUTTON_DONE_ABB" +msgstr "DONE" + +msgid "IDS_TPLATFORM_ACBUTTON_CANCEL_ABB" +msgstr "CANCEL" + +msgid "IDS_HS_OPT_SORT_ITEMS" +msgstr "Sort items" + +msgid "IDS_HS_HEADER_SORT_ITEMS" +msgstr "Sort items" + +msgid "IDS_HS_BODY_WIDGETS_ABB" +msgstr "Widgets" + +msgid "IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB" +msgstr "Unable to add widget" + +msgid "IDS_HS_HEADER_ADD_WIDGET" +msgstr "Add widget" + +msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" +msgstr "There is not enough space on the Home screen. Remove some widgets and try again." + +msgid "IDS_HS_HEADER_EDIT" +msgstr "Edit" + +msgid "IDS_HS_OPT_EDIT" +msgstr "Edit" + +msgid "IDS_HS_BODY_THEMES_ABB" +msgstr "Themes" + msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" msgstr "Sort items alphabetically" @@ -400,3 +466,5 @@ msgstr "Sort items alphabetically" msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" msgstr "App icons and folders will be sorted into alphabetical order. Any customisations you have made will be discarded." +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" +msgstr "Maximum number of applications in folder (%d) reached." \ No newline at end of file -- 2.7.4 From cc4f13d2794da498c648d48e4ccc9d99d7ec35ce Mon Sep 17 00:00:00 2001 From: "juhee,park" Date: Mon, 9 May 2016 16:13:01 +0900 Subject: [PATCH 06/16] [TSAM-2388]add-viewer/the app name display as 'org.tizen.app.widget' Signed-off-by: juhee,park Change-Id: Iaad98ee102e7b3a6276b4fb79bdaf49afb5a20c7 --- inc/add_viewer/widget.h | 1 + src/add_viewer/list_view.c | 4 ++-- src/add_viewer/widget.c | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/add_viewer/widget.c diff --git a/inc/add_viewer/widget.h b/inc/add_viewer/widget.h index c5d7c2f..63164ac 100644 --- a/inc/add_viewer/widget.h +++ b/inc/add_viewer/widget.h @@ -22,6 +22,7 @@ typedef struct { char *widget_id; char *app_id; + char *label; Eina_List *preview_list; Elm_Object_Item *genlist_item; diff --git a/src/add_viewer/list_view.c b/src/add_viewer/list_view.c index f86489e..ff3aaaa 100644 --- a/src/add_viewer/list_view.c +++ b/src/add_viewer/list_view.c @@ -125,7 +125,7 @@ static char *__gl_text_get_cb(void *data, Evas_Object *obj, const char *part) return NULL; if(!strcmp(part, "elm.text")) - return strdup(widget->widget_id); + return strdup(widget->label); return strdup("widget name not found"); } @@ -195,7 +195,7 @@ static Evas_Object *__list_view_widget_box_create(Evas_Object *obj, widget_t *wi return NULL; } - elm_object_part_text_set(preview_layout, "text", widget->widget_id); + elm_object_part_text_set(preview_layout, "text", widget->label); //elm_box_pack_end(main_box, preview_layout); diff --git a/src/add_viewer/widget.c b/src/add_viewer/widget.c old mode 100644 new mode 100755 index fe8cf94..69d8556 --- a/src/add_viewer/widget.c +++ b/src/add_viewer/widget.c @@ -73,7 +73,7 @@ static int __widget_compare_widget_id_cb(const void *data1, const void *data2) widget_t *w1 = (widget_t *)data1; widget_t *w2 = (widget_t *)data2; - res = strcmp(w1->widget_id, w2->widget_id); + res = strcmp(w1->label, w2->label); if (res < 0) return -1; else if (res > 0) return 1; @@ -146,6 +146,9 @@ static int __widget_list_widget_append(const char *appid, const char *widget_id, widget->size_types_count = types_count; widget->app_id = strdup(appid); widget->widget_id = strdup(widget_id); + widget->label = widget_service_get_name(widget->widget_id, NULL); + if (!widget->label || strlen(widget->label) == 0) + widget->label = strdup(widget_id); widget_list = eina_list_sorted_insert(widget_list, __widget_compare_widget_id_cb, widget); //widget_list = eina_list_append(widget_list, widget); @@ -168,6 +171,7 @@ static void __widget_list_widget_remove(widget_t *widget) eina_list_free(widget->preview_list); free(widget->app_id); free(widget->widget_id); + free(widget->label); free(widget); } -- 2.7.4 From 375c105801e7480af8aa7760fb1f2982ed6792d9 Mon Sep 17 00:00:00 2001 From: YoungHun Cho Date: Tue, 17 May 2016 16:57:15 +0900 Subject: [PATCH 07/16] HOMESCREEN-EFL 3.0 1.0.0 merge to tizen branch Change-Id: I9dfb690b281979e18ef92b79e7e1c176c304d879 Signed-off-by: YoungHun Cho --- .cproject | 225 ++- .gitignore | 8 +- .project | 10 +- .rds_delta | 6 + .sdk_delta.info | Bin 0 -> 30517 bytes .sign/.manifest.tmp | 131 ++ .sign/author-signature.xml | 574 +++++++ .sign/signature1.xml | 577 +++++++ Build/appendix.mk | 0 Build/basedef.mk | 0 Build/flags.mk | 0 Build/makefile | 0 Build/prepost.mk | 11 +- Build/tooldef.mk | 0 CMake/CMakeLists.txt | 93 -- CMake/res/CMakeLists.txt | 4 - CMake/res/edje/CMakeLists.txt | 87 - CMake/res/images/CMakeLists.txt | 25 - CMake/res/po/CMakeLists.txt | 26 - inc/add_viewer/add_viewer.h | 55 - inc/add_viewer/view.h | 72 - inc/add_viewer/widget.h | 66 - inc/add_widget_viewer/add_widget_data.h | 43 + .../add_widget_viewer.h} | 17 +- inc/all_apps.h | 85 - inc/app_grid.h | 98 -- inc/app_icon.h | 168 -- inc/app_item.h | 96 -- inc/app_mgr.h | 88 -- inc/apps_data.h | 64 + inc/{add_viewer/list_view.h => apps_db.h} | 30 +- inc/{layout.h => apps_package_manager.h} | 23 +- inc/apps_view.h | 46 + inc/cluster_data.h | 48 + inc/cluster_db.h | 31 + inc/cluster_page.h | 50 + inc/cluster_view.h | 41 + inc/conf.h | 659 +------- inc/data_model.h | 217 --- inc/db/db.h | 64 - inc/dynamic_index.h | 56 - inc/edc_conf.h | 164 ++ inc/folder_panel.h | 139 -- inc/homescreen-efl.h | 164 +- inc/hw_key.h | 23 + inc/livebox/grid_item_resize.h | 52 - inc/livebox/grid_reposition.h | 79 - inc/livebox/livebox_animator.h | 86 - inc/livebox/livebox_panel.h | 216 --- inc/livebox/livebox_utils.h | 259 --- inc/livebox/livebox_widget.h | 97 -- inc/livebox_all_pages.h | 57 - inc/menu.h | 39 + inc/mouse.h | 40 +- inc/page_indicator.h | 45 + inc/page_scroller.h | 164 -- inc/popup.h | 67 +- inc/tree.h | 108 -- inc/util.h | 102 +- inc/view.h | 29 + inc/{option_menu.h => widget_viewer.h} | 34 +- org.tizen.homescreen-efl.manifest | 5 - packaging/org.tizen.homescreen-efl.spec | 91 -- project_def.prop | 9 +- res/edje/add_widget_viewer.edc | 302 ++++ res/edje/app_grid.edc | 148 -- res/edje/app_icon.edc | 543 +++++++ res/edje/apps_chooser_btn.edc | 183 +++ res/edje/apps_folder_icon.edc | 336 ++++ res/edje/apps_folder_popup.edc | 218 +++ res/edje/apps_view.edc | 143 ++ res/edje/apps_view_bg.edc | 137 ++ res/edje/cluster_allpage.edc | 41 + res/edje/cluster_allpage_thumbnail.edc | 239 +++ res/edje/cluster_page.edc | 85 + res/edje/color_classes.edc | 43 - res/edje/folder.edc | 619 -------- res/edje/folder_entry.edc | 244 --- res/edje/home.edc | 740 +-------- res/edje/home_btn.edc | 277 ++++ res/edje/icon.edc | 660 -------- res/edje/index_element.edc | 113 -- res/edje/livebox_container.edc | 622 -------- res/edje/livebox_layout.edc | 176 --- res/edje/page_edit.edc | 292 ---- res/edje/page_edit_util.edc | 108 -- res/edje/page_indicator_unit.edc | 108 ++ res/edje/preview.edc | 1093 ------------- res/edje/widget.edc | 166 ++ res/images/00_scroll_bar_v.png | Bin 3192 -> 0 bytes .../{1x1 preview shortcut.png => add_page_nor.png} | Bin 3080 -> 3117 bytes .../{00_scroll_bar_h.png => add_page_press.png} | Bin 3185 -> 3123 bytes res/images/all_apps_icon_menu.png | Bin 1286 -> 0 bytes .../{edit_all_page_add.png => all_page_add.png} | Bin ...l_page_add_press.png => all_page_add_press.png} | Bin .../{edit_all_page_drag.png => all_page_drag.png} | Bin res/images/app_icon_checkbox_bg.png | Bin 288 -> 0 bytes res/images/app_icon_checkbox_border.png | Bin 251 -> 0 bytes res/images/app_icon_downloadable.png | Bin 4256 -> 0 bytes res/images/btn_add_nor.png | Bin 2773 -> 2191 bytes res/images/btn_add_press.png | Bin 2868 -> 2279 bytes res/images/btn_input_clear.png | Bin 1240 -> 0 bytes res/images/core_check_bg.png | Bin 0 -> 1128 bytes res/images/core_check_bg_stroke.png | Bin 0 -> 1141 bytes ...pp_icon_checkbox_on.png => core_check_icon.png} | Bin res/images/default.png | Bin 17581 -> 0 bytes res/images/default_app_icon.png | Bin 0 -> 12850 bytes res/images/edit_all_page_bg.png | Bin 1804 -> 0 bytes res/images/edit_all_page_create.png | Bin 3132 -> 0 bytes res/images/edit_page.png | Bin 279 -> 0 bytes res/images/edit_page_current.png | Bin 279 -> 0 bytes res/images/folder_appicon_bg.png | Bin 5870 -> 3797 bytes res/images/folder_appicon_empty_bg.png | Bin 6151 -> 3808 bytes res/images/frame.png | Bin 421 -> 0 bytes ...{home_icon_reorder.png => home_button_apps.png} | Bin 1209 -> 1110 bytes res/images/home_button_bg.png | Bin 2146 -> 1753 bytes res/images/home_button_home.png | Bin 0 -> 1376 bytes .../{home_icon_menu.png => home_button_menu.png} | Bin 1267 -> 1196 bytes res/images/home_edit_bg.#.png | Bin 954 -> 0 bytes res/images/home_icon_home.png | Bin 1526 -> 0 bytes res/images/icon_badge_container.png | Bin res/images/icon_drawer_search.png | Bin 1892 -> 0 bytes res/images/icon_list_close.png | Bin 1125 -> 0 bytes res/images/icon_list_open.png | Bin 1222 -> 0 bytes res/images/icon_shadow.png | Bin 4001 -> 0 bytes res/images/livebox/preview_FMradio.png | Bin 4863 -> 0 bytes res/images/livebox/preview_alarm.png | Bin 15981 -> 0 bytes res/images/livebox/preview_calendar.png | Bin 17062 -> 0 bytes res/images/livebox/preview_contact_4x2.png | Bin 17936 -> 0 bytes res/images/livebox/preview_contact_4x4.png | Bin 45239 -> 0 bytes res/images/livebox/preview_dual_clock.png | Bin 39495 -> 0 bytes res/images/livebox/preview_gallery.png | Bin 115999 -> 0 bytes res/images/livebox/preview_internet_4x4.png | Bin 21456 -> 0 bytes res/images/livebox/preview_music.png | Bin 11878 -> 0 bytes res/images/livebox/preview_singel_clock.png | Bin 20769 -> 0 bytes res/images/livebox/preview_weather_4x2.png | Bin 8269 -> 0 bytes res/images/livebox/preview_weather_4x4.png | Bin 15112 -> 0 bytes ...indicator_on.png => page_indicator_current.png} | Bin ...r_on_horizontal.png => page_indicator_unit.png} | Bin res/images/preview_bg_1x1.png | Bin 1072 -> 0 bytes res/images/preview_bg_2x1.png | Bin 1123 -> 0 bytes res/images/preview_bg_2x2.png | Bin 1242 -> 0 bytes res/images/preview_bg_4x1.png | Bin 1724 -> 0 bytes res/images/preview_bg_4x2.png | Bin 1467 -> 0 bytes res/images/preview_bg_4x3.png | Bin 1614 -> 0 bytes res/images/preview_bg_4x4.png | Bin 1799 -> 0 bytes res/images/reposition_bg.png | Bin 354 -> 0 bytes res/images/reposition_bg_shadow.png | Bin 8659 -> 0 bytes res/images/resize_button.png | Bin 256 -> 0 bytes res/images/scroll_bar.9.png | Bin 1182 -> 0 bytes res/images/unknown.png | Bin 19568 -> 0 bytes res/po/ar.po | 113 +- res/po/az.po | 24 + res/po/bg.po | 28 +- res/po/ca.po | 28 +- res/po/cs.po | 107 +- res/po/da.po | 50 +- res/po/de.po | 26 +- res/po/el_GR.po | 24 + res/po/en.po | 57 +- res/po/en_PH.po | 26 +- res/po/en_US.po | 32 +- res/po/es_ES.po | 24 + res/po/es_US.po | 28 +- res/po/et.po | 24 + res/po/eu.po | 26 +- res/po/fi.po | 24 + res/po/fr.po | 26 +- res/po/fr_CA.po | 24 + res/po/ga.po | 24 + res/po/gl.po | 24 + res/po/hi.po | 111 +- res/po/hr.po | 24 + res/po/hu.po | 26 +- res/po/hy.po | 24 + res/po/is.po | 24 + res/po/it_IT.po | 24 + res/po/ja_JP.po | 26 +- res/po/ka.po | 24 + res/po/kk.po | 24 + res/po/ko_KR.po | 42 +- res/po/lt.po | 24 + res/po/lv.po | 24 + res/po/mk.po | 24 + res/po/nb.po | 26 +- res/po/nl.po | 36 +- res/po/pl.po | 26 +- res/po/pt_BR.po | 107 +- res/po/pt_PT.po | 24 + res/po/ro.po | 26 +- res/po/ru_RU.po | 24 + res/po/sk.po | 24 + res/po/sl.po | 24 + res/po/sr.po | 24 + res/po/sv.po | 24 + res/po/tr_TR.po | 26 +- res/po/uk.po | 24 + res/po/uz.po | 26 +- res/po/zh_CN.po | 58 +- res/po/zh_HK.po | 36 +- res/po/zh_TW.po | 38 +- src/add_viewer/add_viewer.c | 192 --- src/add_viewer/list_view.c | 535 ------- src/add_viewer/view.c | 159 -- src/add_viewer/widget.c | 178 --- src/add_widget_viewer/add_widget_data.c | 162 ++ src/add_widget_viewer/add_widget_viewer.c | 576 +++++++ src/all_apps.c | 224 --- src/app_grid.c | 1004 ------------ src/app_icon.c | 724 --------- src/app_item.c | 122 -- src/app_mgr.c | 383 ----- src/apps_data.c | 362 +++++ src/apps_db.c | 332 ++++ src/apps_package_manager.c | 205 +++ src/apps_view.c | 1129 +++++++++++++ src/cluster_data.c | 155 ++ src/cluster_db.c | 243 +++ src/cluster_page.c | 274 ++++ src/cluster_view.c | 1227 +++++++++++++++ src/{layout.c => conf.c} | 40 +- src/data_model.c | 965 ------------ src/db/db.c | 330 ---- src/dynamic_index.c | 369 ----- src/folder_panel.c | 942 ----------- src/homescreen-efl.c | 1384 +++------------- src/hw_key.c | 134 ++ src/key.c | 194 --- src/livebox/grid_item_resize.c | 667 -------- src/livebox/grid_reposition.c | 681 -------- src/livebox/livebox_animator.c | 227 --- src/livebox/livebox_panel.c | 1661 -------------------- src/livebox/livebox_utils.c | 573 ------- src/livebox/livebox_widget.c | 513 ------ src/livebox_all_pages.c | 1123 ------------- src/menu.c | 102 ++ src/mouse.c | 162 -- src/option_menu.c | 284 ---- src/page_indicator.c | 235 +++ src/page_scroller.c | 397 ----- src/popup.c | 268 +--- src/tree.c | 238 --- src/util.c | 232 +-- src/widget_viewer.c | 80 + tizen-manifest.xml | 8 +- 245 files changed, 12162 insertions(+), 23165 deletions(-) mode change 100644 => 100755 .cproject mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .project create mode 100644 .rds_delta create mode 100644 .sdk_delta.info create mode 100644 .sign/.manifest.tmp create mode 100644 .sign/author-signature.xml create mode 100644 .sign/signature1.xml mode change 100644 => 100755 Build/appendix.mk mode change 100644 => 100755 Build/basedef.mk mode change 100644 => 100755 Build/flags.mk mode change 100644 => 100755 Build/makefile mode change 100644 => 100755 Build/prepost.mk mode change 100644 => 100755 Build/tooldef.mk delete mode 100644 CMake/CMakeLists.txt delete mode 100644 CMake/res/CMakeLists.txt delete mode 100644 CMake/res/edje/CMakeLists.txt delete mode 100644 CMake/res/images/CMakeLists.txt delete mode 100755 CMake/res/po/CMakeLists.txt delete mode 100644 inc/add_viewer/add_viewer.h delete mode 100644 inc/add_viewer/view.h delete mode 100644 inc/add_viewer/widget.h create mode 100755 inc/add_widget_viewer/add_widget_data.h rename inc/{key.h => add_widget_viewer/add_widget_viewer.h} (70%) mode change 100644 => 100755 delete mode 100644 inc/all_apps.h delete mode 100644 inc/app_grid.h delete mode 100644 inc/app_icon.h delete mode 100644 inc/app_item.h delete mode 100644 inc/app_mgr.h create mode 100755 inc/apps_data.h rename inc/{add_viewer/list_view.h => apps_db.h} (55%) mode change 100644 => 100755 rename inc/{layout.h => apps_package_manager.h} (67%) mode change 100644 => 100755 create mode 100755 inc/apps_view.h create mode 100755 inc/cluster_data.h create mode 100755 inc/cluster_db.h create mode 100755 inc/cluster_page.h create mode 100755 inc/cluster_view.h mode change 100644 => 100755 inc/conf.h delete mode 100644 inc/data_model.h delete mode 100644 inc/db/db.h delete mode 100644 inc/dynamic_index.h create mode 100755 inc/edc_conf.h delete mode 100644 inc/folder_panel.h mode change 100644 => 100755 inc/homescreen-efl.h create mode 100755 inc/hw_key.h delete mode 100644 inc/livebox/grid_item_resize.h delete mode 100644 inc/livebox/grid_reposition.h delete mode 100644 inc/livebox/livebox_animator.h delete mode 100644 inc/livebox/livebox_panel.h delete mode 100644 inc/livebox/livebox_utils.h delete mode 100644 inc/livebox/livebox_widget.h delete mode 100644 inc/livebox_all_pages.h create mode 100755 inc/menu.h mode change 100644 => 100755 inc/mouse.h create mode 100755 inc/page_indicator.h delete mode 100644 inc/page_scroller.h mode change 100644 => 100755 inc/popup.h delete mode 100644 inc/tree.h mode change 100644 => 100755 inc/util.h create mode 100755 inc/view.h rename inc/{option_menu.h => widget_viewer.h} (53%) mode change 100644 => 100755 delete mode 100644 org.tizen.homescreen-efl.manifest delete mode 100644 packaging/org.tizen.homescreen-efl.spec mode change 100644 => 100755 project_def.prop create mode 100755 res/edje/add_widget_viewer.edc delete mode 100644 res/edje/app_grid.edc create mode 100755 res/edje/app_icon.edc create mode 100755 res/edje/apps_chooser_btn.edc create mode 100755 res/edje/apps_folder_icon.edc create mode 100755 res/edje/apps_folder_popup.edc create mode 100755 res/edje/apps_view.edc create mode 100755 res/edje/apps_view_bg.edc create mode 100755 res/edje/cluster_allpage.edc create mode 100755 res/edje/cluster_allpage_thumbnail.edc create mode 100755 res/edje/cluster_page.edc delete mode 100644 res/edje/color_classes.edc delete mode 100644 res/edje/folder.edc delete mode 100644 res/edje/folder_entry.edc mode change 100644 => 100755 res/edje/home.edc create mode 100755 res/edje/home_btn.edc delete mode 100644 res/edje/icon.edc delete mode 100644 res/edje/index_element.edc delete mode 100644 res/edje/livebox_container.edc delete mode 100644 res/edje/livebox_layout.edc delete mode 100644 res/edje/page_edit.edc delete mode 100644 res/edje/page_edit_util.edc create mode 100755 res/edje/page_indicator_unit.edc delete mode 100644 res/edje/preview.edc create mode 100755 res/edje/widget.edc delete mode 100644 res/images/00_scroll_bar_v.png rename res/images/{1x1 preview shortcut.png => add_page_nor.png} (86%) mode change 100644 => 100755 rename res/images/{00_scroll_bar_h.png => add_page_press.png} (84%) mode change 100644 => 100755 delete mode 100644 res/images/all_apps_icon_menu.png rename res/images/{edit_all_page_add.png => all_page_add.png} (100%) mode change 100644 => 100755 rename res/images/{edit_all_page_add_press.png => all_page_add_press.png} (100%) mode change 100644 => 100755 rename res/images/{edit_all_page_drag.png => all_page_drag.png} (100%) delete mode 100755 res/images/app_icon_checkbox_bg.png delete mode 100755 res/images/app_icon_checkbox_border.png delete mode 100644 res/images/app_icon_downloadable.png mode change 100644 => 100755 res/images/btn_add_nor.png mode change 100644 => 100755 res/images/btn_add_press.png delete mode 100755 res/images/btn_input_clear.png create mode 100755 res/images/core_check_bg.png create mode 100755 res/images/core_check_bg_stroke.png rename res/images/{app_icon_checkbox_on.png => core_check_icon.png} (100%) delete mode 100644 res/images/default.png create mode 100755 res/images/default_app_icon.png delete mode 100644 res/images/edit_all_page_bg.png delete mode 100755 res/images/edit_all_page_create.png delete mode 100644 res/images/edit_page.png delete mode 100644 res/images/edit_page_current.png mode change 100644 => 100755 res/images/folder_appicon_bg.png mode change 100644 => 100755 res/images/folder_appicon_empty_bg.png delete mode 100644 res/images/frame.png rename res/images/{home_icon_reorder.png => home_button_apps.png} (53%) mode change 100644 => 100755 mode change 100644 => 100755 res/images/home_button_bg.png create mode 100755 res/images/home_button_home.png rename res/images/{home_icon_menu.png => home_button_menu.png} (51%) mode change 100644 => 100755 delete mode 100644 res/images/home_edit_bg.#.png delete mode 100644 res/images/home_icon_home.png mode change 100644 => 100755 res/images/icon_badge_container.png delete mode 100644 res/images/icon_drawer_search.png delete mode 100644 res/images/icon_list_close.png delete mode 100644 res/images/icon_list_open.png delete mode 100644 res/images/icon_shadow.png delete mode 100644 res/images/livebox/preview_FMradio.png delete mode 100644 res/images/livebox/preview_alarm.png delete mode 100644 res/images/livebox/preview_calendar.png delete mode 100644 res/images/livebox/preview_contact_4x2.png delete mode 100644 res/images/livebox/preview_contact_4x4.png delete mode 100644 res/images/livebox/preview_dual_clock.png delete mode 100644 res/images/livebox/preview_gallery.png delete mode 100644 res/images/livebox/preview_internet_4x4.png delete mode 100644 res/images/livebox/preview_music.png delete mode 100644 res/images/livebox/preview_singel_clock.png delete mode 100644 res/images/livebox/preview_weather_4x2.png delete mode 100644 res/images/livebox/preview_weather_4x4.png rename res/images/{core_page_indicator_on.png => page_indicator_current.png} (100%) rename res/images/{core_page_indicator_on_horizontal.png => page_indicator_unit.png} (100%) delete mode 100644 res/images/preview_bg_1x1.png delete mode 100644 res/images/preview_bg_2x1.png delete mode 100644 res/images/preview_bg_2x2.png delete mode 100644 res/images/preview_bg_4x1.png delete mode 100644 res/images/preview_bg_4x2.png delete mode 100644 res/images/preview_bg_4x3.png delete mode 100644 res/images/preview_bg_4x4.png delete mode 100644 res/images/reposition_bg.png delete mode 100644 res/images/reposition_bg_shadow.png delete mode 100644 res/images/resize_button.png delete mode 100644 res/images/scroll_bar.9.png delete mode 100644 res/images/unknown.png delete mode 100644 src/add_viewer/add_viewer.c delete mode 100644 src/add_viewer/list_view.c delete mode 100644 src/add_viewer/view.c delete mode 100755 src/add_viewer/widget.c create mode 100755 src/add_widget_viewer/add_widget_data.c create mode 100755 src/add_widget_viewer/add_widget_viewer.c delete mode 100644 src/all_apps.c delete mode 100644 src/app_grid.c delete mode 100644 src/app_icon.c delete mode 100644 src/app_item.c delete mode 100644 src/app_mgr.c create mode 100755 src/apps_data.c create mode 100755 src/apps_db.c create mode 100755 src/apps_package_manager.c create mode 100755 src/apps_view.c create mode 100755 src/cluster_data.c create mode 100755 src/cluster_db.c create mode 100755 src/cluster_page.c create mode 100755 src/cluster_view.c rename src/{layout.c => conf.c} (51%) mode change 100644 => 100755 delete mode 100644 src/data_model.c delete mode 100644 src/db/db.c delete mode 100644 src/dynamic_index.c delete mode 100644 src/folder_panel.c mode change 100644 => 100755 src/homescreen-efl.c create mode 100755 src/hw_key.c delete mode 100644 src/key.c delete mode 100644 src/livebox/grid_item_resize.c delete mode 100644 src/livebox/grid_reposition.c delete mode 100644 src/livebox/livebox_animator.c delete mode 100644 src/livebox/livebox_panel.c delete mode 100644 src/livebox/livebox_utils.c delete mode 100644 src/livebox/livebox_widget.c delete mode 100644 src/livebox_all_pages.c create mode 100755 src/menu.c delete mode 100644 src/mouse.c delete mode 100644 src/option_menu.c create mode 100755 src/page_indicator.c delete mode 100644 src/page_scroller.c mode change 100644 => 100755 src/popup.c delete mode 100644 src/tree.c mode change 100644 => 100755 src/util.c create mode 100755 src/widget_viewer.c mode change 100644 => 100755 tizen-manifest.xml diff --git a/.cproject b/.cproject old mode 100644 new mode 100755 index badb93d..518044c --- a/.cproject +++ b/.cproject @@ -1,8 +1,8 @@ - - + + @@ -16,19 +16,20 @@ - - - - - - - - - - + + @@ -307,19 +293,20 @@ - - - - - - - - - + - + - + - - - - - - - - + diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index c951582..65fa71e --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,2 @@ -.sdk_delta.info -.sign/ -.rds_delta -Debug/ -crash-info/ -/Release +/Debug +/SA_Report diff --git a/.project b/.project old mode 100644 new mode 100755 index f4406b9..ec5f53c --- a/.project +++ b/.project @@ -6,11 +6,6 @@ - org.tizen.nativecore.apichecker.apicheckerbuilder - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder @@ -27,11 +22,10 @@ org.eclipse.cdt.core.ccnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.tizen.nativecore.apichecker.apicheckernature - 1453299913505 + 1460334470859 26 @@ -40,7 +34,7 @@ - 1453299913511 + 1460334470865 6 diff --git a/.rds_delta b/.rds_delta new file mode 100644 index 0000000..a8acc85 --- /dev/null +++ b/.rds_delta @@ -0,0 +1,6 @@ +#delete +#add +#modify +author-signature.xml +signature1.xml +bin/homescreen-efl diff --git a/.sdk_delta.info b/.sdk_delta.info new file mode 100644 index 0000000000000000000000000000000000000000..d99572355c07a107c7de9148bfca687035b95451 GIT binary patch literal 30517 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 TAKnkRkW29IoboSCyIT8K7@7x0 literal 0 HcmV?d00001 diff --git a/.sign/.manifest.tmp b/.sign/.manifest.tmp new file mode 100644 index 0000000..151acc1 --- /dev/null +++ b/.sign/.manifest.tmp @@ -0,0 +1,131 @@ +bin/homescreen-efl__DEL__jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= +res/edje/app_grid.edj__DEL__NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= +res/edje/color_classes.edj__DEL__dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= +res/edje/folder.edj__DEL__2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= +res/edje/folder_entry.edj__DEL__4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= +res/edje/home.edj__DEL__d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= +res/edje/icon.edj__DEL__fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= +res/edje/index_element.edj__DEL__GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= +res/edje/livebox_container.edj__DEL__D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= +res/edje/livebox_layout.edj__DEL__gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= +res/edje/page_edit.edj__DEL__Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= +res/edje/page_edit_util.edj__DEL__MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= +res/edje/preview.edj__DEL__MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= +res/images/00_scroll_bar_h.png__DEL__YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= +res/images/00_scroll_bar_v.png__DEL__69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= +res/images/1x1 preview shortcut.png__DEL__3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= +res/images/all_apps_icon_menu.png__DEL__nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= +res/images/app_icon_checkbox_bg.png__DEL__uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= +res/images/app_icon_checkbox_border.png__DEL__y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= +res/images/app_icon_checkbox_on.png__DEL__rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= +res/images/app_icon_downloadable.png__DEL__4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= +res/images/app_press_117.png__DEL__E0bg/oVwC1pn7GMC+aZdkXgJFEXghqC3BrLkLWgt9Ko= +res/images/btn_add_nor.png__DEL__ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= +res/images/btn_add_press.png__DEL__Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= +res/images/btn_delete_nor.png__DEL__87nZJ0uJhX3Kx2dv6BMUmHDw/4xagceKslZ7bML7hvo= +res/images/btn_delete_press.png__DEL__y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= +res/images/btn_input_clear.png__DEL__kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= +res/images/core_page_indicator_on.png__DEL__HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= +res/images/core_page_indicator_on_horizontal.png__DEL__0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= +res/images/default.png__DEL__Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= +res/images/default_bg.png__DEL__0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= +res/images/edit_all_page_add.png__DEL__NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= +res/images/edit_all_page_add_press.png__DEL__nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= +res/images/edit_all_page_bg.png__DEL__UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= +res/images/edit_all_page_create.png__DEL__wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= +res/images/edit_all_page_drag.png__DEL__QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= +res/images/edit_page.png__DEL__0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= +res/images/edit_page_current.png__DEL__nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= +res/images/folder_appicon_bg.png__DEL__SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= +res/images/folder_appicon_bg_impossible.png__DEL__zsCUAlXZcgZpTpvNM8pwzCCvzQxDtltJf7V6YA0DT4I= +res/images/folder_appicon_bg_possible.png__DEL__z5iytDrt/KDlOXhLpUdQYzzujZE6edmRR6lasSQewHw= +res/images/folder_appicon_empty_bg.png__DEL__Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= +res/images/folder_popup_bg.png__DEL__APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= +res/images/frame.png__DEL__gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= +res/images/home_button_bg.png__DEL__l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= +res/images/home_edit_bg.#.png__DEL__TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= +res/images/home_icon_home.png__DEL__+tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= +res/images/home_icon_menu.png__DEL__H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= +res/images/home_icon_reorder.png__DEL__zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= +res/images/icon_badge_container.png__DEL__jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= +res/images/icon_drawer_search.png__DEL__JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= +res/images/icon_list_close.png__DEL__3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= +res/images/icon_list_open.png__DEL__Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= +res/images/icon_shadow.png__DEL__4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= +res/images/livebox/preview_FMradio.png__DEL__AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= +res/images/livebox/preview_alarm.png__DEL__P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= +res/images/livebox/preview_calendar.png__DEL__JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= +res/images/livebox/preview_contact_4x2.png__DEL__EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= +res/images/livebox/preview_contact_4x4.png__DEL__z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= +res/images/livebox/preview_dual_clock.png__DEL__nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= +res/images/livebox/preview_gallery.png__DEL__MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= +res/images/livebox/preview_internet_4x4.png__DEL__L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= +res/images/livebox/preview_music.png__DEL__6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= +res/images/livebox/preview_singel_clock.png__DEL__H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= +res/images/livebox/preview_weather_4x2.png__DEL__A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= +res/images/livebox/preview_weather_4x4.png__DEL__ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= +res/images/preview_bg_1x1.png__DEL__HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= +res/images/preview_bg_2x1.png__DEL__IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= +res/images/preview_bg_2x2.png__DEL__xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= +res/images/preview_bg_4x1.png__DEL__QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= +res/images/preview_bg_4x2.png__DEL__mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= +res/images/preview_bg_4x3.png__DEL__+Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= +res/images/preview_bg_4x4.png__DEL__o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= +res/images/reposition_bg.png__DEL__bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= +res/images/reposition_bg_shadow.png__DEL__Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= +res/images/resize_button.png__DEL__geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= +res/images/scroll_bar.9.png__DEL__1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= +res/images/unknown.png__DEL__wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= +res/locale/ar/LC_MESSAGES/homescreen-efl.mo__DEL__qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= +res/locale/az/LC_MESSAGES/homescreen-efl.mo__DEL__SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= +res/locale/bg/LC_MESSAGES/homescreen-efl.mo__DEL__Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= +res/locale/ca/LC_MESSAGES/homescreen-efl.mo__DEL__69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= +res/locale/cs/LC_MESSAGES/homescreen-efl.mo__DEL__7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= +res/locale/da/LC_MESSAGES/homescreen-efl.mo__DEL__j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= +res/locale/de/LC_MESSAGES/homescreen-efl.mo__DEL__nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= +res/locale/el_GR/LC_MESSAGES/homescreen-efl.mo__DEL__+XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= +res/locale/en/LC_MESSAGES/homescreen-efl.mo__DEL__QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= +res/locale/en_PH/LC_MESSAGES/homescreen-efl.mo__DEL__q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= +res/locale/en_US/LC_MESSAGES/homescreen-efl.mo__DEL__GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= +res/locale/es_ES/LC_MESSAGES/homescreen-efl.mo__DEL__L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= +res/locale/es_US/LC_MESSAGES/homescreen-efl.mo__DEL__hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= +res/locale/et/LC_MESSAGES/homescreen-efl.mo__DEL__2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= +res/locale/eu/LC_MESSAGES/homescreen-efl.mo__DEL__KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= +res/locale/fi/LC_MESSAGES/homescreen-efl.mo__DEL__AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= +res/locale/fr/LC_MESSAGES/homescreen-efl.mo__DEL__cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= +res/locale/fr_CA/LC_MESSAGES/homescreen-efl.mo__DEL__NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= +res/locale/ga/LC_MESSAGES/homescreen-efl.mo__DEL__W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= +res/locale/gl/LC_MESSAGES/homescreen-efl.mo__DEL__uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= +res/locale/hi/LC_MESSAGES/homescreen-efl.mo__DEL__XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= +res/locale/hr/LC_MESSAGES/homescreen-efl.mo__DEL__Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= +res/locale/hu/LC_MESSAGES/homescreen-efl.mo__DEL__TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= +res/locale/hy/LC_MESSAGES/homescreen-efl.mo__DEL__SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= +res/locale/is/LC_MESSAGES/homescreen-efl.mo__DEL__JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= +res/locale/it_IT/LC_MESSAGES/homescreen-efl.mo__DEL__x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= +res/locale/ja_JP/LC_MESSAGES/homescreen-efl.mo__DEL__3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= +res/locale/ka/LC_MESSAGES/homescreen-efl.mo__DEL__R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= +res/locale/kk/LC_MESSAGES/homescreen-efl.mo__DEL__FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= +res/locale/ko_KR/LC_MESSAGES/homescreen-efl.mo__DEL__r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= +res/locale/lt/LC_MESSAGES/homescreen-efl.mo__DEL__zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= +res/locale/lv/LC_MESSAGES/homescreen-efl.mo__DEL__XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= +res/locale/mk/LC_MESSAGES/homescreen-efl.mo__DEL__c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= +res/locale/nb/LC_MESSAGES/homescreen-efl.mo__DEL__Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= +res/locale/nl/LC_MESSAGES/homescreen-efl.mo__DEL__q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= +res/locale/pl/LC_MESSAGES/homescreen-efl.mo__DEL__XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= +res/locale/pt_BR/LC_MESSAGES/homescreen-efl.mo__DEL__IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= +res/locale/pt_PT/LC_MESSAGES/homescreen-efl.mo__DEL__aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= +res/locale/ro/LC_MESSAGES/homescreen-efl.mo__DEL__RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= +res/locale/ru_RU/LC_MESSAGES/homescreen-efl.mo__DEL__Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= +res/locale/sk/LC_MESSAGES/homescreen-efl.mo__DEL__4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= +res/locale/sl/LC_MESSAGES/homescreen-efl.mo__DEL__Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= +res/locale/sr/LC_MESSAGES/homescreen-efl.mo__DEL__x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= +res/locale/sv/LC_MESSAGES/homescreen-efl.mo__DEL__3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= +res/locale/tr_TR/LC_MESSAGES/homescreen-efl.mo__DEL__uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= +res/locale/uk/LC_MESSAGES/homescreen-efl.mo__DEL__w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= +res/locale/uz/LC_MESSAGES/homescreen-efl.mo__DEL__1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= +res/locale/zh_CN/LC_MESSAGES/homescreen-efl.mo__DEL__dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= +res/locale/zh_HK/LC_MESSAGES/homescreen-efl.mo__DEL__6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= +res/locale/zh_TW/LC_MESSAGES/homescreen-efl.mo__DEL__LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= +shared/res/homescreen-efl.png__DEL__1d0oEZHqPn+QzNzGIHwj9ODby6x9ggFs9uOsav6jPNs= +tizen-manifest.xml__DEL__en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= +author-signature.xml__DEL__nhDdIrtAyw1Q8c9XtEOVIg4NVx2e1wI3Q4JQT9eKIYo= diff --git a/.sign/author-signature.xml b/.sign/author-signature.xml new file mode 100644 index 0000000..55bade4 --- /dev/null +++ b/.sign/author-signature.xml @@ -0,0 +1,574 @@ + + + + + + +jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= + + + +NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= + + + +dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= + + + +2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= + + + +4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= + + + +d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= + + + +fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= + + + +GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= + + + +D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= + + + +gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= + + + +Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= + + + +MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= + + + +MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= + + + +YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= + + + +69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= + + + +3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= + + + +nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= + + + +uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= + + + +y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= + + + +rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= + + + +4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= + + + +E0bg/oVwC1pn7GMC+aZdkXgJFEXghqC3BrLkLWgt9Ko= + + + +ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= + + + +Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= + + + +87nZJ0uJhX3Kx2dv6BMUmHDw/4xagceKslZ7bML7hvo= + + + +y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= + + + +kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= + + + +HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= + + + +0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= + + + +Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= + + + +0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= + + + +NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= + + + +nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= + + + +UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= + + + +wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= + + + +QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= + + + +0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= + + + +nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= + + + +SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= + + + +zsCUAlXZcgZpTpvNM8pwzCCvzQxDtltJf7V6YA0DT4I= + + + +z5iytDrt/KDlOXhLpUdQYzzujZE6edmRR6lasSQewHw= + + + +Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= + + + +APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= + + + +gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= + + + +l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= + + + +TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= + + + ++tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= + + + +H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= + + + +zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= + + + +jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= + + + +JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= + + + +3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= + + + +Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= + + + +4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= + + + +AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= + + + +P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= + + + +JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= + + + +EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= + + + +z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= + + + +nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= + + + +MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= + + + +L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= + + + +6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= + + + +H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= + + + +A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= + + + +ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= + + + +HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= + + + +IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= + + + +xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= + + + +QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= + + + +mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= + + + ++Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= + + + +o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= + + + +bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= + + + +Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= + + + +geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= + + + +1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= + + + +wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= + + + +qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= + + + +SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= + + + +Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= + + + +69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= + + + +7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= + + + +j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= + + + +nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= + + + ++XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= + + + +QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= + + + +q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= + + + +GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= + + + +L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= + + + +hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= + + + +2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= + + + +KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= + + + +AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= + + + +cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= + + + +NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= + + + +W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= + + + +uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= + + + +XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= + + + +Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= + + + +TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= + + + +SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= + + + +JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= + + + +x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= + + + +3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= + + + +R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= + + + +FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= + + + +r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= + + + +zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= + + + +XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= + + + +c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= + + + +Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= + + + +q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= + + + +XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= + + + +IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= + + + +aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= + + + +RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= + + + +Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= + + + +4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= + + + +Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= + + + +x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= + + + +3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= + + + +uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= + + + +w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= + + + +1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= + + + +dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= + + + +6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= + + + +LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= + + + +1d0oEZHqPn+QzNzGIHwj9ODby6x9ggFs9uOsav6jPNs= + + + +en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= + + + + + + +lpo8tUDs054eLlBQXiDPVDVKfw30ZZdtkRs1jd7H5K8= + + + +m4ONQLtiOft2RJxb5X4jIRKmlzl8j8k4YtyAK6kSjtSCEaJfcfQLrZQchsl8T3/RJDEy2MpXz6HD +1QzsDqnWFbpQziNy8HfSmDVPfdMzoK+ti1pEbgQA6Koi+fLuNyjOADumY+gmPOxj+dR63XOUr839 +146zgZVFzB2c1D4/lNc= + + + + +MIICmzCCAYOgAwIBAgIGAT8T+Ms5MA0GCSqGSIb3DQEBBQUAMFYxGjAYBgNVBAoMEVRpemVuIEFz +c29jaWF0aW9uMRowGAYDVQQLDBFUaXplbiBBc3NvY2lhdGlvbjEcMBoGA1UEAwwTVGl6ZW4gRGV2 +ZWxvcGVycyBDQTAeFw0xMjExMDEwMDAwMDBaFw0xOTAxMDEwMDAwMDBaMBcxFTATBgNVBAMMDHRp +emVuX2F1dGhvcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAssi+tZOAmBSLiy8JTOk7gXrk +Nlg8Jq+O+4yd14a407BTbmp9r4qfNlUKLpYRL0TyU84XUWrLHHXe9aO2G223v/DUz3f182W5JWK0 +HvHt0vYcBycOBkXCc5y26funq7qhEgC9e1NNxIc1mFYD0jJiRNJgxIRCw33Ca/8qdGPY1K8CAwEA +AaMyMDAwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwDQYJ +KoZIhvcNAQEFBQADggEBAJweqlVjN2GHF01jlE1HfZNFJ5Y7Ye+NagJnNdj6iVOPGP9J9PVOmllB +8S8pon1fUXPvrHFe8gNFg1klLMJaPbeDQM+UiPWn80A+8e4gJpHz+E9on2ZYkEBCZHOXSxxzaS7D +0bwj3eotbpY/duepn3U91fcLcnoehO3oe4pawrC6AObRjqY/Sh9I4j8btHFxRRVpsa7VkSg/5JB4 +2jfKlJ2otI8bYYuOiYeZC2ody9PsHzlqmqlo+J68RlxAemPMovRqGeK0XDqJEt7dJEzknQmp0732 +fhAZNyXVlukjdR8+3+f1J5vu4MEqT/7aLXLOwLN/qgUfCBA2YQ/YqMJvf9Y= + + +MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMRowGAYDVQQKDBFUaXplbiBBc3NvY2lh +dGlvbjEaMBgGA1UECwwRVGl6ZW4gQXNzb2NpYXRpb24xHjAcBgNVBAMMFVRpemVuIERldmVsb3Bl +cnMgUm9vdDAeFw0xMjAxMDEwMDAwMDBaFw0yNzAxMDEwMDAwMDBaMFYxGjAYBgNVBAoMEVRpemVu +IEFzc29jaWF0aW9uMRowGAYDVQQLDBFUaXplbiBBc3NvY2lhdGlvbjEcMBoGA1UEAwwTVGl6ZW4g +RGV2ZWxvcGVycyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANVGhRGmMIUyBA7o +PCz8Sxut6z6HNkF4oDIuzuKaMzRYPeWodwe9O0gmqAkToQHfwg2giRhE5GoPld0fq+OYMMwSasCu +g8dwODx1eDeSYVuOLWRxpAmbTXOsSFi6VoWeyaPEm18JBHvZBsU5YQtgZ6Kp7MqzvQg3pXOxtajj +vyHxiatJl+xXrHgcXC1wgyG3buty7u/Fi2mvKXJ0PRJcCjjK81dqe/Vr20sRUCrbk02zbm5ggFt/ +jIEhV8wbFRQpliobc7J4dSTKhFfrqGM8rdd54LYhD7gSI1CFSe16pUXfcVR7FhJztRaiGLnCrwBE +dyTZ248+D4L/qR/D0axb3jcCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC +AQEAnOXXQ/1O/QTDHyrmQDtFziqPY3xWlJBqJtEqXiT7Y+Ljpe66e+Ee/OjQMlZe8gu21/8cKklH +95RxjopMWCVedXDUbWdvS2+CdyvVW/quT2E0tjqIzXDekUTYwwhlPWlGxvfj3VsxqSFq3p8Brl04 +1Gx5RKAGyKVsMfTLhbbwSWwApuBUxYfcNpKwLWGPXkysu+HctY03OKv4/xKBnVWiN8ex/Sgesi0M ++OBAOMdZMPK32uJBTeKFx1xZgTLIhk45V0hPOomPjZloiv0LSS11eyd451ufjW0iHRE7WlpR6EvI +W6TFyZgMpQq+kg4hWl2SBTf3s2VI8Ygz7gj8TMlClg== + + + + + \ No newline at end of file diff --git a/.sign/signature1.xml b/.sign/signature1.xml new file mode 100644 index 0000000..3f0d832 --- /dev/null +++ b/.sign/signature1.xml @@ -0,0 +1,577 @@ + + + + + + +nhDdIrtAyw1Q8c9XtEOVIg4NVx2e1wI3Q4JQT9eKIYo= + + + +jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= + + + +NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= + + + +dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= + + + +2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= + + + +4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= + + + +d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= + + + +fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= + + + +GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= + + + +D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= + + + +gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= + + + +Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= + + + +MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= + + + +MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= + + + +YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= + + + +69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= + + + +3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= + + + +nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= + + + +uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= + + + +y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= + + + +rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= + + + +4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= + + + +E0bg/oVwC1pn7GMC+aZdkXgJFEXghqC3BrLkLWgt9Ko= + + + +ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= + + + +Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= + + + +87nZJ0uJhX3Kx2dv6BMUmHDw/4xagceKslZ7bML7hvo= + + + +y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= + + + +kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= + + + +HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= + + + +0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= + + + +Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= + + + +0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= + + + +NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= + + + +nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= + + + +UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= + + + +wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= + + + +QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= + + + +0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= + + + +nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= + + + +SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= + + + +zsCUAlXZcgZpTpvNM8pwzCCvzQxDtltJf7V6YA0DT4I= + + + +z5iytDrt/KDlOXhLpUdQYzzujZE6edmRR6lasSQewHw= + + + +Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= + + + +APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= + + + +gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= + + + +l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= + + + +TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= + + + ++tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= + + + +H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= + + + +zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= + + + +jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= + + + +JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= + + + +3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= + + + +Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= + + + +4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= + + + +AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= + + + +P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= + + + +JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= + + + +EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= + + + +z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= + + + +nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= + + + +MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= + + + +L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= + + + +6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= + + + +H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= + + + +A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= + + + +ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= + + + +HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= + + + +IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= + + + +xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= + + + +QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= + + + +mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= + + + ++Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= + + + +o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= + + + +bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= + + + +Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= + + + +geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= + + + +1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= + + + +wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= + + + +qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= + + + +SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= + + + +Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= + + + +69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= + + + +7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= + + + +j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= + + + +nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= + + + ++XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= + + + +QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= + + + +q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= + + + +GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= + + + +L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= + + + +hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= + + + +2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= + + + +KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= + + + +AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= + + + +cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= + + + +NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= + + + +W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= + + + +uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= + + + +XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= + + + +Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= + + + +TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= + + + +SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= + + + +JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= + + + +x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= + + + +3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= + + + +R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= + + + +FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= + + + +r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= + + + +zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= + + + +XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= + + + +c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= + + + +Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= + + + +q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= + + + +XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= + + + +IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= + + + +aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= + + + +RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= + + + +Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= + + + +4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= + + + +Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= + + + +x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= + + + +3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= + + + +uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= + + + +w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= + + + +1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= + + + +dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= + + + +6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= + + + +LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= + + + +1d0oEZHqPn+QzNzGIHwj9ODby6x9ggFs9uOsav6jPNs= + + + +en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= + + + + + + +u/jU3U4Zm5ihTMSjKGlGYbWzDfRkGphPPHx3gJIYEJ4= + + + +H0Q8k/2eJseDxpcoWO+FKzF8K3iCjp8YiS+7HBaV5nMdQWrei3xe6LGRbVfeNQrQ4IcMznehyO9t +YvzRHA20H9czpqF5p3Mfs7yR7zO0/kxexqWtti62lUCz4cHddrMUiXBazXNX4l8qUejsBGe9yhSE +HidgpQvFsy3PpQM8/3I= + + + + +MIICtzCCAiACCQCX7BAlwjllkTANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCS1IxDjAMBgNV +BAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UECgwNVGl6ZW4gVGVzdCBDQTEiMCAGA1UE +CwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVzdCBDQTEyMDAGA1UEAwwpVGl6ZW4gUGFydG5lci1NYW51 +ZmFjdHVyZXIgRGlzdHJpYnV0b3IgQ0EwHhcNMTIxMjEzMDU0NDI3WhcNMjIxMjExMDU0NDI3WjCB +oTELMAkGA1UEBhMCS1IxDjAMBgNVBAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UECgwN +VGl6ZW4gVGVzdCBDQTEiMCAGA1UECwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVzdCBDQTE2MDQGA1UE +AwwtVGl6ZW4gUGFydG5lci1NYW51ZmFjdHVyZXIgRGlzdHJpYnV0b3IgU2lnbmVyMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQC2O0i2ou9Pa8KI+RVu6/1QAMichy8YqDtpM4cogiX+tYfafN/v +4l7q9sQdotaFPLWPR1HNtG6O6SKWZmM/Hp2U+S3vDeylEhex/IopWF9RZMPJFyKr9bJnlzTqiZuz +qItlXOZZBHhUL73v6OxqYg2BsA88jLtCoZWVAkoKDX93ZQIDAQABMA0GCSqGSIb3DQEBBQUAA4GB +AJ5vn+dEhnZFuRdIMUt8TwQzXSxPMqNmR8+fcwwzAacxeOTgeK1C+DqE31vead/c8CVDMurZHQbs +qH/Ala6FomTm1q0uuM3Ll2qZaPkI3qr+h37YD4AI5scyIlP7ppApcdPRSkDgqfXkika62Q9M0+MN +nxl8+AvEukgC6qcd90oL + + +MIICzzCCAjigAwIBAgIJAMNp1nbwir4GMA0GCSqGSIb3DQEBBQUAMIGiMQswCQYDVQQGEwJLUjEO +MAwGA1UECAwFU3V3b24xDjAMBgNVBAcMBVN1d29uMRYwFAYDVQQKDA1UaXplbiBUZXN0IENBMSIw +IAYDVQQLDBlUaXplbiBEaXN0cmlidXRvciBUZXN0IENBMTcwNQYDVQQDDC5UaXplbiBQYXJ0bmVy +LU1hbnVmYWN0dXJlciBEaXN0cmlidXRvciBSb290IENBMB4XDTEyMTIxMzA1NDQyMFoXDTIyMTIx +MTA1NDQyMFowgZ0xCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTdXdvbjEOMAwGA1UEBwwFU3V3b24x +FjAUBgNVBAoMDVRpemVuIFRlc3QgQ0ExIjAgBgNVBAsMGVRpemVuIERpc3RyaWJ1dG9yIFRlc3Qg +Q0ExMjAwBgNVBAMMKVRpemVuIFBhcnRuZXItTWFudWZhY3R1cmVyIERpc3RyaWJ1dG9yIENBMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMni4Qmv96ww/De92kYhtzpas7viwyYoFTTuvcmayD +FBuDoaHqrSDsrb9M7qrR4N9higg1mT8a9J8CUhPLKhlifK9OwyQsZS+8xVfPfogIJ3wumfjLl5zi +nqpkSe2ernxOTU+PB5lWU8toKbnJO3+jchm14DjCQ4ZoqG26qbG5pQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAA9lsDyArDR9balTfqrjN241nVqyLqPOP+MFRjGWrIlI +yLDcw2/L9hxguD8XhgAanaQUzS06XM6BajDjcSiJrohjoMFkB09M+r5fVkrhkT29oABsKXO87+p8 +JbbbIfdwMUrAjXsrjMUzJ3J6fn86/dn/PcuMAkCgrD069IzpE8NM + + + + + \ No newline at end of file diff --git a/Build/appendix.mk b/Build/appendix.mk old mode 100644 new mode 100755 diff --git a/Build/basedef.mk b/Build/basedef.mk old mode 100644 new mode 100755 diff --git a/Build/flags.mk b/Build/flags.mk old mode 100644 new mode 100755 diff --git a/Build/makefile b/Build/makefile old mode 100644 new mode 100755 diff --git a/Build/prepost.mk b/Build/prepost.mk old mode 100644 new mode 100755 index 6bb5e2f..a8a4d87 --- a/Build/prepost.mk +++ b/Build/prepost.mk @@ -1,6 +1,7 @@ - # Add pre/post build process -PREBUILD_DESC = -PREBUILD_COMMAND = -POSTBUILD_DESC = -POSTBUILD_COMMAND = + +PREBUILD_COMMAND = +PREBUILD_DESC = + +POSTBUILD_COMMAND = +POSTBUILD_DESC = diff --git a/Build/tooldef.mk b/Build/tooldef.mk old mode 100644 new mode 100755 diff --git a/CMake/CMakeLists.txt b/CMake/CMakeLists.txt deleted file mode 100644 index 95630d6..0000000 --- a/CMake/CMakeLists.txt +++ /dev/null @@ -1,93 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(homescreen-efl C) - -SET(INSTALL_EXEC_PREFIX "${INSTALL_PREFIX}/bin") -SET(INSTALL_RESDIR "${INSTALL_PREFIX}/res") -SET(INSTALL_IMAGEDIR "${INSTALL_RESDIR}/images") -SET(EDJEDIR "${INSTALL_RESDIR}/edje") -SET(LOCALEDIR "${INSTALL_RESDIR}/locale") -SET(CMAKE_VERBOSE_MAKEFILE 0) - -SET(PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}/..") -SET(PROJECT_RESOURCES_DIR "${PROJECT_ROOT_DIR}/res") -SET(PROJECT_EDC_DIR "${PROJECT_RESOURCES_DIR}/edje") -SET(PROJECT_IMAGES_DIR "${PROJECT_RESOURCES_DIR}/images") -SET(PROJECT_PO_DIR "${PROJECT_RESOURCES_DIR}/po") - -INCLUDE(FindPkgConfig) -pkg_check_modules(MENU_PKGS REQUIRED - appsvc - badge - capi-appfw-application - capi-system-info - capi-appfw-package-manager - capi-appfw-app-manager - capi-system-system-settings - dlog - elementary - shortcut - syspopup-caller - widget_viewer - widget_service - widget_viewer_evas - capi-appfw-preference - sqlite3 -) - -FOREACH (flag ${MENU_PKGS_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Winline -g -fno-builtin-malloc -fPIC") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") - -INCLUDE_DIRECTORIES(${PROJECT_ROOT_DIR}/inc) - -ADD_EXECUTABLE(${PROJECT_NAME} - ${PROJECT_ROOT_DIR}/src/homescreen-efl.c - ${PROJECT_ROOT_DIR}/src/all_apps.c - ${PROJECT_ROOT_DIR}/src/app_mgr.c - ${PROJECT_ROOT_DIR}/src/app_item.c - ${PROJECT_ROOT_DIR}/src/data_model.c - ${PROJECT_ROOT_DIR}/src/tree.c - - ${PROJECT_ROOT_DIR}/src/app_grid.c - ${PROJECT_ROOT_DIR}/src/layout.c - ${PROJECT_ROOT_DIR}/src/page_scroller.c - ${PROJECT_ROOT_DIR}/src/util.c - ${PROJECT_ROOT_DIR}/src/app_icon.c - ${PROJECT_ROOT_DIR}/src/key.c - ${PROJECT_ROOT_DIR}/src/option_menu.c - ${PROJECT_ROOT_DIR}/src/mouse.c - ${PROJECT_ROOT_DIR}/src/folder_panel.c - ${PROJECT_ROOT_DIR}/src/popup.c - ${PROJECT_ROOT_DIR}/src/dynamic_index.c - ${PROJECT_ROOT_DIR}/src/livebox_all_pages.c - ${PROJECT_ROOT_DIR}/src/db/db.c - - ${PROJECT_ROOT_DIR}/src/livebox/livebox_panel.c - ${PROJECT_ROOT_DIR}/src/livebox/livebox_animator.c - ${PROJECT_ROOT_DIR}/src/livebox/grid_item_resize.c - ${PROJECT_ROOT_DIR}/src/livebox/livebox_utils.c - ${PROJECT_ROOT_DIR}/src/livebox/grid_reposition.c - ${PROJECT_ROOT_DIR}/src/livebox/livebox_widget.c - - ${PROJECT_ROOT_DIR}/src/add_viewer/add_viewer.c - ${PROJECT_ROOT_DIR}/src/add_viewer/list_view.c - ${PROJECT_ROOT_DIR}/src/add_viewer/view.c - ${PROJECT_ROOT_DIR}/src/add_viewer/widget.c -) - -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lm) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${MENU_PKGS_LDFLAGS}) - -# Install -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_EXEC_PREFIX}) - -INSTALL(FILES ${PROJECT_ROOT_DIR}/tizen-manifest.xml DESTINATION ${SYS_PACKAGES_DIR} RENAME org.tizen.homescreen-efl.xml) -INSTALL(DIRECTORY DESTINATION ${PREFIX}/data) -INSTALL(FILES ${PROJECT_ROOT_DIR}/shared/res/homescreen-efl.png DESTINATION ${SYS_ICONS_DIR}) - -# End of a file -ADD_SUBDIRECTORY(res) diff --git a/CMake/res/CMakeLists.txt b/CMake/res/CMakeLists.txt deleted file mode 100644 index d6667e4..0000000 --- a/CMake/res/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -ADD_SUBDIRECTORY(edje) -ADD_SUBDIRECTORY(images) -ADD_SUBDIRECTORY(po) - diff --git a/CMake/res/edje/CMakeLists.txt b/CMake/res/edje/CMakeLists.txt deleted file mode 100644 index bf99cf5..0000000 --- a/CMake/res/edje/CMakeLists.txt +++ /dev/null @@ -1,87 +0,0 @@ -ADD_CUSTOM_TARGET(home.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/home.edc home.edj - DEPENDS ${PROJECT_EDC_DIR}/home.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} home.edj) -INSTALL(FILES home.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(icon.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/icon.edc icon.edj - DEPENDS ${PROJECT_EDC_DIR}/icon.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} icon.edj) -INSTALL(FILES icon.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(folder.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/folder.edc folder.edj - DEPENDS ${PROJECT_EDC_DIR}/folder.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} folder.edj) -INSTALL(FILES folder.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(folder_entry.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/folder_entry.edc folder_entry.edj - DEPENDS ${PROJECT_EDC_DIR}/folder_entry.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} folder_entry.edj) -INSTALL(FILES folder_entry.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(index_element.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/index_element.edc index_element.edj - DEPENDS ${PROJECT_EDC_DIR}/index_element.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} index_element.edj) -INSTALL(FILES index_element.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(app_grid.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/app_grid.edc app_grid.edj - DEPENDS ${PROJECT_EDC_DIR}/app_grid.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} app_grid.edj) -INSTALL(FILES app_grid.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(livebox_container.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/livebox_container.edc livebox_container.edj - DEPENDS ${PROJECT_EDC_DIR}/livebox_container.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} livebox_container.edj) -INSTALL(FILES livebox_container.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(livebox_layout.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/livebox_layout.edc livebox_layout.edj - DEPENDS ${PROJECT_EDC_DIR}/livebox_layout.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} livebox_layout.edj) -INSTALL(FILES livebox_layout.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(page_edit.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/page_edit.edc page_edit.edj - DEPENDS ${PROJECT_EDC_DIR}/page_edit.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} page_edit.edj) -INSTALL(FILES page_edit.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(preview.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/preview.edc preview.edj - DEPENDS ${PROJECT_EDC_DIR}/preview.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} preview.edj) -INSTALL(FILES preview.edj DESTINATION ${EDJEDIR}) - -ADD_CUSTOM_TARGET(color_classes.edj - COMMAND edje_cc -id ${PROJECT_EDC_DIR}/../images ${EDJE_CFLAGS} - ${PROJECT_EDC_DIR}/color_classes.edc color_classes.edj - DEPENDS ${PROJECT_EDC_DIR}/color_classes.edc -) -ADD_DEPENDENCIES(${PROJECT_NAME} color_classes.edj) -INSTALL(FILES color_classes.edj DESTINATION ${EDJEDIR}) diff --git a/CMake/res/images/CMakeLists.txt b/CMake/res/images/CMakeLists.txt deleted file mode 100644 index cc6190a..0000000 --- a/CMake/res/images/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -INSTALL(FILES - ${PROJECT_IMAGES_DIR}/default_bg.png - ${PROJECT_IMAGES_DIR}/default.png -DESTINATION - ${INSTALL_IMAGEDIR} -) - -INSTALL(FILES - ${PROJECT_IMAGES_DIR}/livebox/preview_alarm.png - ${PROJECT_IMAGES_DIR}/livebox/preview_contact_4x2.png - ${PROJECT_IMAGES_DIR}/livebox/preview_dual_clock.png - ${PROJECT_IMAGES_DIR}/livebox/preview_gallery.png - ${PROJECT_IMAGES_DIR}/livebox/preview_music.png - ${PROJECT_IMAGES_DIR}/livebox/preview_weather_4x2.png - ${PROJECT_IMAGES_DIR}/livebox/preview_calendar.png - ${PROJECT_IMAGES_DIR}/livebox/preview_contact_4x4.png - ${PROJECT_IMAGES_DIR}/livebox/preview_FMradio.png - ${PROJECT_IMAGES_DIR}/livebox/preview_internet_4x4.png - ${PROJECT_IMAGES_DIR}/livebox/preview_singel_clock.png - ${PROJECT_IMAGES_DIR}/livebox/preview_weather_4x4.png -DESTINATION - "${INSTALL_IMAGEDIR}/livebox" -) - -# End of a file diff --git a/CMake/res/po/CMakeLists.txt b/CMake/res/po/CMakeLists.txt deleted file mode 100755 index 1ac0fc9..0000000 --- a/CMake/res/po/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -# for i18n - -SET(POFILES ar.po az.po bg.po ca.po cs.po da.po de.po el_GR.po en_PH.po en.po en_US.po - es_ES.po es_US.po et.po eu.po fi.po fr_CA.po fr.po ga.po gl.po hi.po hr.po - hu.po hy.po is.po it_IT.po ja_JP.po ka.po kk.po ko_KR.po lt.po lv.po mk.po - nb.po nl.po pl.po pt_BR.po pt_PT.po ro.po ru_RU.po sk.po sl.po sr.po sv.po - tr_TR.po uk.po uz.po zh_CN.po zh_HK.po zh_TW.po) -SET(MSGFMT "/usr/bin/msgfmt") - -MESSAGE(STATUS "po files ---") -FOREACH(pofile ${POFILES}) - SET(pofile ${PROJECT_PO_DIR}/${pofile}) - MESSAGE(STATUS " ${pofile}") - GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) - GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) - SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) - ADD_CUSTOM_COMMAND( - OUTPUT ${moFile} - COMMAND ${MSGFMT} -o ${moFile} ${absPofile} - DEPENDS ${absPofile} - ) - INSTALL(FILES ${moFile} DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) - SET(moFiles ${moFiles} ${moFile}) -ENDFOREACH(pofile) - -ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/inc/add_viewer/add_viewer.h b/inc/add_viewer/add_viewer.h deleted file mode 100644 index d00270a..0000000 --- a/inc/add_viewer/add_viewer.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ADD_VIEWER_H_ -#define ADD_VIEWER_H_ - -#include "homescreen-efl.h" - -/** - * @brief Create "add viewer" window - * - * @details Creates basic window that shows genlist with - * all found widgets on device. - * - * @param w Evas_Coord width of the window - * @param h Evas_Coord height of the window - */ -void add_viewer_window_create(Evas_Coord w, Evas_Coord h); - -/** - * @brief Delete "add viewer" window - * - * @details Deletes "add viewer" window and goes back to - * homescreen home view - */ -void add_viewer_window_delete(void); - -/** - * @brief Get "add viewer" layout - * - * @return layout Evas_Object - */ -Evas_Object *add_viewer_get_layout(void); - -/** - * @brief Get "add viewer" main theme - * - * @return theme Elm_Theme - */ -Elm_Theme *add_viewer_get_main_theme(void); - -#endif diff --git a/inc/add_viewer/view.h b/inc/add_viewer/view.h deleted file mode 100644 index 284683c..0000000 --- a/inc/add_viewer/view.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef VIEW_H_ -#define VIEW_H_ - -#include "homescreen-efl.h" - -typedef int(* indexing_cb)(Evas_Object *layout, const char *letter, void *data); - -/** - * @brief Create content of the "add_viewer" layout - * - * @details Function creates additional object of the layout, index etc. - * - * @param naviframe Evas_Object naviframe where content should be created - * @param genlist Evas_Object genlist to be created - * - * @return layout Evas_Object created layout to be displayed - */ -Evas_Object *view_content_create(Evas_Object *frame, void *data); - -/** - * @brief Show content - * - * @details Function sends signal to layout to show its content - * - * @param layout Evas_Object object to be shown - */ -void view_content_show(Evas_Object *layout); - -/** - * @brief Show index - * - * @details Function sends signal to layout to show index - * - * @param layout Evas_Object layout that index belongs to - */ -void view_content_show_index(Evas_Object *layout); - -/** - * @brief Select index item - * - * @details Function selects choosen item of the index - * - * @return 0 on success, 1 on failure - */ -int view_index_set_index(const char *idx); - -/** - * @brief Get index object - * - * @details Function returns index object - * - * @return index Evas_Object - */ -Evas_Object *view_get_index(void); - -#endif diff --git a/inc/add_viewer/widget.h b/inc/add_viewer/widget.h deleted file mode 100644 index 63164ac..0000000 --- a/inc/add_viewer/widget.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WIDGET_H_ -#define WIDGET_H_ - -#include "homescreen-efl.h" - -typedef struct { - char *widget_id; - char *app_id; - char *label; - - Eina_List *preview_list; - Elm_Object_Item *genlist_item; - - int size_types_count; - int size_types; -} widget_t; - -typedef struct { - int type; - char *path; -} preview_t; - -/** - * @brief Initialize widget list - * - * @details Function creates list with all target widgets, previews - * and its sizes. - * - * @return 0 on success, 1 on failure - */ -int widget_init(void); - -/** - * @brief Remove widget list - * - * @details This function removes widget list and frees all its allocated - * memory - */ -void widget_fini(void); - -/** - * @brief Get widget list - * - * @details Function returns list with all found widgets and their data. - * - * @return widget_list Eina_List - */ -Eina_List* widget_get_widget_list(void); - -#endif diff --git a/inc/add_widget_viewer/add_widget_data.h b/inc/add_widget_viewer/add_widget_data.h new file mode 100755 index 0000000..763b56a --- /dev/null +++ b/inc/add_widget_viewer/add_widget_data.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ADD_WIDGET_DATA_H__ +#define __ADD_WIDGET_DATA_H__ + +typedef struct { + char *widget_id; + char *app_id; + char *label; + + Eina_List *preview_list; + Elm_Object_Item *genlist_item; + + int size_types_count; + int size_types; +} add_widget_data_t; + +typedef struct { + int type; + char *path; +} add_widget_data_preview_t; + +bool add_widget_data_init(void); +void add_widget_data_fini(void); + +Eina_List *add_widget_data_get_widget_list(void); +Eina_List *add_widget_data_get_widget_preview_list(add_widget_data_t *widget); + +#endif /* __ADD_WIDGET_DATA_H__ */ diff --git a/inc/key.h b/inc/add_widget_viewer/add_widget_viewer.h old mode 100644 new mode 100755 similarity index 70% rename from inc/key.h rename to inc/add_widget_viewer/add_widget_viewer.h index ee4d38e..5cedab3 --- a/inc/key.h +++ b/inc/add_widget_viewer/add_widget_viewer.h @@ -14,17 +14,10 @@ * limitations under the License. */ -#ifndef KEY_H_ -#define KEY_H_ +#ifndef __ADD_WIDGET_VIEWER_H__ +#define __ADD_WIDGET_VIEWER_H__ -/** - * @brief Registers the key module and all callbacks related to to hw keys. - */ -void key_register(void); - -/** - * @brief Unregisters all callbacks related to hw keys. - */ -void key_unregister(void); +void add_widget_viewer_win_create(void); +void add_widget_viewer_win_destroy(void); -#endif /* KEY_H_ */ +#endif /* __ADD_WIDGET_VIEWER_H__ */ diff --git a/inc/all_apps.h b/inc/all_apps.h deleted file mode 100644 index 5c96691..0000000 --- a/inc/all_apps.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ALL_APPS_H_ -#define ALL_APPS_H_ - -#include -#include "app_grid.h" -#include "data_model.h" - -/** - * @brief Creates all apps panel - * @param parent elm_layout widget with proper swallow part - * @return pointer to Evas_Object - */ -Evas_Object *all_apps_create(Evas_Object *parent, void *data); - -/** - * @brief Shows all_apps panel - */ -void all_apps_show(void); - -/** - * @brief [Hides all apps panel - */ -void all_apps_hide(void); - -/** - * @brief [brief description] - * @details [long description] - */ -void all_apps_del(void); - -/** - * @brief Sets view mode of all apps view - */ -void all_apps_set_view_mode(homescreen_view_t view); - -/** - * @brief Function blocks srolling of the all_apps panel. - * @details It is used during items reposition. - * - * @param is_blocked bool value, true if should be blocked - */ -void all_apps_set_scrolling_blocked_state(bool is_blocked); - -/** - * @brief detaches app icon from grid: - */ -void all_apps_detach_from_grid(Elm_Object_Item *grid_item); - -/** - * @brief attaches app icon to grid number grid_num: - */ -Elm_Object_Item *all_apps_attach_to_grid(Evas_Object *icon, int grid_num); - -/** - * @brief appends new page to the page scroller - */ -bool all_apps_append_page(Tree_node_t *page_item); - -/** - * @brief appends new page to the page scroller - */ -void all_apps_remove_empty_pages(void); - -/** - * @brief it simply updates all pages dynamic index display - */ -void all_apps_update_dynamic_index_count(void); - -#endif /* ALL_APPS_H_ */ diff --git a/inc/app_grid.h b/inc/app_grid.h deleted file mode 100644 index 0de34ce..0000000 --- a/inc/app_grid.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APP_GRID_H_ -#define APP_GRID_H_ - -#include -#include "homescreen-efl.h" -#include "tree.h" - -typedef enum { - APP_GRID_TYPE_ALL_APPS = 0, - APP_GRID_TYPE_FOLDER -} app_grid_type_t; -/** - * @brief Function creates app_grid wgt - * @details This is a kind of wrapper for a gengrid widget but handle drag and - * drop events between different gengrids created by this function. Reposition - * mechanism found active gengrid behind mouse pointer. Reposition is gengeric. - * If you want to modify it you should set some callbacks in function - * app_grid_custom_dnd_handlers_set. - * - * @param parent Pointer to eveas_object. Smart parent widget for app grid. - * Basically you can add it into win. - * @param data Pointer to Eina_List object with content will be inserted in - * applicaiton list. - * @param item_width int describes width of an item in grid. - * @param item_height ind describes height of an item in grid - * @return pointer to created app_grid - */ -extern Evas_Object *app_grid_create(Evas_Object *parent, Tree_node_t *data, - Evas_Coord gengrid_width, Evas_Coord gengrid_height, - app_grid_type_t type); - -/** - * @brief Append an imte inot app_grid - * @param app_grid Pointer to elm_gengrid widget - * @param icon_to_append pointer to appended item - * - * @return Elm_Object_Item if no errors, otherwise NULL - */ -extern Elm_Object_Item *app_grid_append_item(Evas_Object *app_grid, - Evas_Object *icon_to_append); - -/** - * @brief Function inserts an item into specific position. If idx is inproper - * function tries to insert item at the end of the grid. - * - * @param app_grid Pointer to app_grid - * @param item Pointer to item evas_object - * @param idx index where item should be inserted - * - * @return Elm_Object_Item if no errors, otherwise NULL - */ -extern Elm_Object_Item *app_grid_insert_item_relative(Evas_Object *app_grid, - Evas_Object *item, Elm_Object_Item *rel_it); - -/** - * @brief Function change state of app grids in homescreen - * - * @param app_grid Pointer to elm_layout widget - * @param view type of view mode - */ -extern void app_grid_set_view_mode(Evas_Object *app_grid, - homescreen_view_t view); - -/** - * @brief Function unpack item from the app_grid - * - * @param item pointer to stored data model - */ -extern void app_grid_unpack_item(Elm_Object_Item *item); - -/** - * @brief Function pack object to box - */ -extern Evas_Object *app_grid_item_pack(Evas_Object *p, Evas_Object *c); - -/** - * @brief Function get icon and data from app_grid item - */ -extern Eina_Bool app_grid_get_item_content(Elm_Object_Item *item, - Evas_Object **icon, Tree_node_t **data); - -#endif /* APP_GRID_H_ */ diff --git a/inc/app_icon.h b/inc/app_icon.h deleted file mode 100644 index e2e7694..0000000 --- a/inc/app_icon.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APP_ICON_H_ -#define APP_ICON_H_ - -#include -#include - -#include "homescreen-efl.h" -#include "app_item.h" -#include "tree.h" - -typedef struct { - char *app_name; - char *app_appid; -} app_icon_popup_info_t; - -typedef enum { - APP_ICON_TYPE_APP = 0, - APP_ICON_TYPE_FOLDER, - APP_ICON_TYPE_MINIATURE, -} app_icon_type_t; - -typedef enum { - FOLDER_ICON_FRAME_POSSIBLE = 0, - FOLDER_ICON_FRAME_IMPOSSIBLE, - FOLDER_ICON_FRAME_NONE, -} folder_icon_frame_type_t; - -/** - * @brief Sets ignore click flag. - * - * @param ignore if it is true click event on icon will not be processed. - */ -extern void app_icon_set_click_ignore(bool ignore); - -/** - * @brief Remove icon object - * @details Function removes elm_layout widget responsible for application - * shortcut view. It deletes also elm_image widget (application shortuc image) - * with is a child of icon_layout. - * - * @param icon_layout Evas_Object pointer to item witch will be deleted. - */ -extern void app_icon_destroy(Evas_Object *icon_layout); - -/** - * @brief Sets badge number and shows it on application icon. - * - * @param app_icon_layout application icon layout. - * @param int number with will be displayed in badge layout. - */ -extern void app_icon_show_badge(Evas_Object *app_icon_layout, - const unsigned int number); - -/** - * @brief Hides badge icon on application. - * @details [long description] - * @param application icon layout pointer. - */ -extern void app_icon_hide_badge(Evas_Object *app_icon_layout); - -/** - * @brief Sets icon label visible - * @param app_icon_layout pointer to icon layout. - */ -extern void app_icon_show_label(Evas_Object *app_icon_layout); - -/** - * @brief Sets icon label invisible. - * @param app_icon_layout pointer to icon layout. - */ -extern void app_icon_hide_label(Evas_Object *app_icon_layout); - -/** - * @brief Function chage state of icon regarind to passed view type - * - * @param icon Pointer to icon object which should be changed. - * @param view view type - * @param in_folder value indicating whether given item is in folder - * - * @return true if success - */ -bool app_icon_set_view_mode(Evas_Object *icon, homescreen_view_t view, - bool in_folder); - -/** - * @brief Creates icon using app_item_t structure - * - * @param parent Parent widget pointer - * @param item pointer to app_item_t structure - * - * @return Pointer to created icon or NULL. - */ -Evas_Object *app_icon_create(Tree_node_t *tree_data, app_icon_type_t type); - -/** - * @brief Updates miniatures in folder icon - * - * @param folder_icon_layout folder icon layout to update - * @param folder_miniatures list of miniatures shown in folder icon - * @param folder_app_tree applications on the first page of folder - */ -void app_icon_update_folder_icon(Tree_node_t *folder_node); - -/** - * @brief Highlights folder icon with specified frame type - * - * @param folder_icon_layout folder icon layout to highlight - * @param frame_type type of frame to use on folder icon - */ -void app_icon_highlight_folder_icon(Evas_Object *folder_icon_layout, - folder_icon_frame_type_t frame_type); - -/** - * @brief Sets icon's label - * - * @param icon_layout icon layout in which label is set - * @param label label to set - */ -void app_icon_set_label(Evas_Object *icon_layout, const char* label); - -/** - * @brief Sets icon layout's color - * - * @param icon_layout icon layout to set color - * @param r red component of given color - * @param g green component of given color - * @param b blue component of given color - * @param a alpha component of given color - */ -void app_icon_set_color(Evas_Object *icon_layout, int r, int g, int b, int a); - -/** - * @brief Sets icon's label color to black - * - * @param icon_layout icon layout in which label's color is changed - */ -void app_icon_set_label_black(Evas_Object *icon_layout); - -/** - * @brief Removes all data connected with icon_layout - * @param icon_layout Pointer to app_icon layout. - */ -void app_icon_remove(Evas_Object *icon_layout); - -/** - * @brief Removes application icon and data. - * @param icon_layout Pointer to app_icon layout. - */ -void app_icon_uninstall(void *data); - - -#endif /* APP_ICON_H_ */ diff --git a/inc/app_item.h b/inc/app_item.h deleted file mode 100644 index 8a4d199..0000000 --- a/inc/app_item.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APP_ITEM_H_ -#define APP_ITEM_H_ - -#include -#include - -typedef enum { - APP_ITEM_ROOT = 0, - APP_ITEM_HOME, - APP_ITEM_ALL_APPS_ROOT, - APP_ITEM_PAGE, - APP_ITEM_ICON, - APP_ITEM_FOLDER, - APP_ITEM_WIDGET -} app_item_type_t; - -typedef struct { - app_item_type_t type; - int unique_id; /*from db table; used for composing tree structure when - reading flattened db representation*/ - char *label; /*this is the name of the application - viewed in homescreen layout*/ - const char *icon; - const char *exec; /*app exec path - used for notifications*/ - const char *appid; - unsigned int badge_count; /*notification count viewed in icon badge*/ - void *data; /*pointer is used by folder to store the folder layout.*/ - bool removable; - bool is_checked; - Evas_Object *layout; - Elm_Object_Item *grid_item; - int col; - int row; - int col_span; - int row_span; - - char *content_info; -} app_item_t; - -/** - * @brief creates new app_item_t object - * @param type object type - * @param unique_id object id - * @param label label text - * @param icon path to icon - * @param exec app to exec on click - * @param appid application id - * @param data extra data - * @param is_removeable na the app be removed - * @param col object column (used only for widgets) - * @param row object row (used only for widgets) - * @param col_span object column span (used only for widgets) - * @param row_span object row span (used only for widgets) - * @return - */ -app_item_t *app_item_create(const app_item_type_t type, const int unique_id, - const char *label, const char *icon, const char *exec, - const char *appid, void *data, bool is_removeable, - int col, int row, int col_span, int row_span, - const char *content_info); - -/** - * @brief Function frees all data connected with the item - * @param item Pointer to application item. - */ -void app_item_free(app_item_t *item); - -/** - * @brief updates app_item_geometry - * @param app_item app_item to be updated - * @param x new pos - * @param y new pos - * @param w new width - * @param h new height - */ -void app_item_geometry_update(app_item_t *app_item, int x, int y, int w, int h); - -void app_item_update_content_info(app_item_t *app_item, const char *content_info); - -#endif /* APP_ITEM_H_ */ diff --git a/inc/app_mgr.h b/inc/app_mgr.h deleted file mode 100644 index 589f7f2..0000000 --- a/inc/app_mgr.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APP_MGR_H_ -#define APP_MGR_H_ - -#include -#include "util.h" - -typedef struct { - char *label; - char *exec; - char *icon; - char *appid; - char *package; - bool removable; -} app_mgr_item_t; - -typedef void (*package_event_manager_event_callback_t)(const char *app_info, - int progress); - -/** - * @brief Initialize application manager - */ -extern void app_mgr_init(void); - -/** - * @brief Deinintialize application manager - */ -extern void app_mgr_deinit(void); - -/** - * @brief Gets the application list - */ -extern Eina_List *app_mgr_get_apps(void); - -/** - * @brief Destroys application list - */ -extern void app_mgr_free_apps(Eina_List *apps); - -/** - * @brief Uninstall an application from the platform - */ -extern Eina_Bool app_mgr_uninstall_app(const char *appid); - -/** - * @brief gets badge count - * @param app_id - application id - * @param count - badges count - * returns EINA_FALSE on failure - */ -extern Eina_Bool app_mgr_app_get_badge_count(const char *app_id, - unsigned int *count); - -/** -* @brief registers listener for badge status changes -* @param callback - callback function to call on badge change -*/ -extern void app_mgr_register_badge_callback(badge_change_cb callback); - -/** -* @brief uregisters listener for badge status changes -* @param callback - callback function previously registered -*/ -extern void app_mgr_unregister_badge_callback(badge_change_cb callback); - -/** - * @brief Returns application label - * @details Function is used only for update application label after language change. - * @param app_id Application id. - */ -char *app_mgr_get_app_label(const char *app_id); - -#endif /* APP_MGR_H_ */ diff --git a/inc/apps_data.h b/inc/apps_data.h new file mode 100755 index 0000000..fb79e75 --- /dev/null +++ b/inc/apps_data.h @@ -0,0 +1,64 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __APPS_DATA_H__ +#define __APPS_DATA_H__ + +#include +#include + +#define APPS_ROOT -1 +#define TEMP_OWNER "owner" + +typedef struct { + int db_id; + int parent_db_id; + char* owner; + Eina_Bool is_folder; + int position; + char* pkg_str; + char* label_str; + char* icon_path_str; + char* uri; + int type; + bool is_removable; + bool is_system; + Evas_Object *app_layout; + Evas_Object *folder_layout; + unsigned int badge_count; + Eina_Bool is_checked; + bool temp; +} app_data_t; + +enum { + APPS_DATA_TYPE_APP = 0, + APPS_DATA_TYPE_APP_SHORTCUT, + APPS_DATA_TYPE_URI_SHORTCUT +}; + +void apps_data_init(void); +void apps_data_sort(void); +Eina_List *apps_data_get_list(void); +void apps_data_get_folder_item_list(Eina_List **list, app_data_t *folder); +void apps_data_install(app_data_t *item); +void apps_data_uninstall(const char *package); +app_data_t *apps_data_add_folder(void); +void apps_data_delete_folder(app_data_t *folder_item); +void apps_data_update_folder(app_data_t *folder_item); +void apps_data_delete_item(app_data_t *item); +void apps_data_delete_list(Eina_List *list); + +#endif /* __APPS_DATA_H__ */ diff --git a/inc/add_viewer/list_view.h b/inc/apps_db.h old mode 100644 new mode 100755 similarity index 55% rename from inc/add_viewer/list_view.h rename to inc/apps_db.h index 0cf8e47..99c7ea6 --- a/inc/add_viewer/list_view.h +++ b/inc/apps_db.h @@ -14,21 +14,21 @@ * limitations under the License. */ -#ifndef LIST_VIEW_H_ -#define LIST_VIEW_H_ +#ifndef __APPS_DB_H__ +#define __APPS_DB_H__ -#include "homescreen-efl.h" +#include +#include "apps_data.h" + +bool apps_db_create(void); +bool apps_db_close(); +bool apps_db_update(app_data_t *item); +bool apps_db_insert(app_data_t *item); +bool apps_db_delete(app_data_t *item); +bool apps_db_delete_by_pkg_str(const char* pkg); + +bool apps_db_get_list(Eina_List **apps); +bool apps_db_get_app_list(Eina_List **apps); -/** - * @brief Create content of the list - * - * @details Function creates content of the genlist with found widgets - * - * @param naviframe Evas_Object naviframe where content should be created - * @param genlist Evas_Object genlist to be created - * - * @return layout Evas_Object created layout to be displayed - */ -Evas_Object *list_view_create_content(Evas_Object *naviframe, Evas_Object *genlist); -#endif +#endif /* __APPS_DB_H__ */ diff --git a/inc/layout.h b/inc/apps_package_manager.h old mode 100644 new mode 100755 similarity index 67% rename from inc/layout.h rename to inc/apps_package_manager.h index b09f5ed..32879d5 --- a/inc/layout.h +++ b/inc/apps_package_manager.h @@ -14,20 +14,17 @@ * limitations under the License. */ -#ifndef LAYOUT_H_ -#define LAYOUT_H_ +#ifndef __APPS_PACKAGE_MANAGER_H__ +#define __APPS_PACKAGE_MANAGER_H__ -#include -#include -/** - * @brief Sets text in caption menu - * If a parameter is NULL, that parameter won't be set - */ -extern void layout_main_caption_set_menu_texts( - const char *label_text, - const char *left_text, - const char *right_text); +#include +#include +#include +#include +#include +void apps_package_manager_init(); +Eina_Bool apps_package_manger_get_list(Eina_List **list); -#endif /* LAYOUT_H_ */ +#endif /* __APPS_PACKAGE_MANAGER_H__ */ diff --git a/inc/apps_view.h b/inc/apps_view.h new file mode 100755 index 0000000..ae708eb --- /dev/null +++ b/inc/apps_view.h @@ -0,0 +1,46 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __APPS_VIEW_H__ +#define __APPS_VIEW_H__ + +#include + +#include "view.h" +#include "apps_data.h" + +Evas_Object *apps_view_create(Evas_Object *parent); +void apps_view_app_terminate(void); +void apps_view_show(void); +void apps_view_hide(void); +void apps_view_show_anim(double pos); +void apps_view_hide_anim(double pos); +void apps_view_reroder(void); +void apps_view_folder_reroder(void); +void apps_view_update_folder_icon(app_data_t *item); + +Evas_Object* apps_view_create_icon(app_data_t *item); +void apps_view_unset_all(void); +bool apps_view_icon_set(app_data_t *item); +void apps_view_icon_add(app_data_t *item); + +void apps_view_hw_menu_key(void); +bool apps_view_hw_home_key(void); +bool apps_view_hw_back_key(void); +view_state_t apps_view_get_state(void); +void apps_view_set_state(view_state_t state); + +#endif /* __APPS_VIEW_H__ */ diff --git a/inc/cluster_data.h b/inc/cluster_data.h new file mode 100755 index 0000000..0a191ac --- /dev/null +++ b/inc/cluster_data.h @@ -0,0 +1,48 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CLUSTER_DATA_H__ +#define __CLUSTER_DATA_H__ + +#include +#include +#include + +typedef struct { + int widget_id; + int page_idx; + int pos_y; + int pos_x; + char *pkg_name; + char *content_info; + widget_size_type_e type; + double period; + int allow_duplicate; + Evas_Object *widget_layout; +} widget_data_t; + +void cluster_data_init(void); +Eina_List *cluster_data_get_widget_list(void); + +int cluster_data_get_page_count(); +void cluster_data_set_page_count(int count); + +void cluster_data_insert_widget(const char* pkg_name, const char* content_info, int type); +void cluster_data_insert(widget_data_t *item); +void cluster_data_delete(widget_data_t *item); +void cluster_data_update(widget_data_t *item); + +#endif /* __CLUSTER_DATA_H__ */ diff --git a/inc/cluster_db.h b/inc/cluster_db.h new file mode 100755 index 0000000..70d2ea1 --- /dev/null +++ b/inc/cluster_db.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CLUSTER_DB_H__ +#define __CLUSTER_DB_H__ + +#include +#include "cluster_data.h" + +bool cluster_db_create(void); +bool cluster_db_close(); +bool cluster_db_update(widget_data_t *item); +bool cluster_db_insert(widget_data_t *item); +bool cluster_db_delete(widget_data_t *item); + +bool cluster_db_get_list(Eina_List **cluster_list); + +#endif /* __CLUSTER_DB_H__ */ diff --git a/inc/cluster_page.h b/inc/cluster_page.h new file mode 100755 index 0000000..e04965f --- /dev/null +++ b/inc/cluster_page.h @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CLUSTER_PAGE_H__ +#define __CLUSTER_PAGE_H__ + +#include +#include +#include "conf.h" +#include "cluster_data.h" + +typedef struct { + int page_index; + Evas_Object *page_layout; + int space[CLUSTER_ROW][CLUSTER_COL]; + + Evas_Object *grid; + Evas_Object *thumbnail_ly; + Evas_Object *highlight; + int highlight_pos_x; + int highlight_pos_y; + + Eina_List *widget_list; +} cluster_page_t; + +cluster_page_t *cluster_page_new(Evas_Object* parent); +void cluster_page_delete(cluster_page_t *page); +bool cluster_page_set_widget(cluster_page_t *page, widget_data_t *item); +bool cluster_page_unset(cluster_page_t *page, widget_data_t *item); +bool cluster_page_check_empty_space(cluster_page_t *page, widget_size_type_e type, + int pos_x, int pos_y, int *empty_x, int *empty_y); +Evas_Object *cluster_page_thumbnail(cluster_page_t *page); +void cluster_page_drag_cancel(cluster_page_t *page); +void cluster_page_drag_widget(cluster_page_t *page, widget_size_type_e type, int pos_x, int pos_y); +bool cluster_page_drop_widget(cluster_page_t *page, widget_data_t *widget); + +#endif /* __CLUSTER_VIEW_PAGE_H__ */ diff --git a/inc/cluster_view.h b/inc/cluster_view.h new file mode 100755 index 0000000..56499d6 --- /dev/null +++ b/inc/cluster_view.h @@ -0,0 +1,41 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CLUSTER_VIEW_H__ +#define __CLUSTER_VIEW_H__ + +#include + +#include "cluster_data.h" +#include "view.h" + +Evas_Object *cluster_view_create(Evas_Object *parent); +void cluster_view_app_terminate(void); + +void cluster_view_show(void); +void cluster_view_hide(void); +void cluster_view_show_anim(double pos); +void cluster_view_hide_anim(double pos); + +void cluster_view_hw_menu_key(void); +bool cluster_view_hw_home_key(void); +bool cluster_view_hw_back_key(void); +view_state_t cluster_view_get_state(void); +void cluster_view_set_state(view_state_t state); +void cluster_view_delete_widget(widget_data_t *item); +bool cluster_view_add_widget(widget_data_t *item, bool scroll); + +#endif /* __CLUSTER_VIEW_H__ */ diff --git a/inc/conf.h b/inc/conf.h old mode 100644 new mode 100755 index cbd3a9b..2e3a2b7 --- a/inc/conf.h +++ b/inc/conf.h @@ -14,599 +14,80 @@ * limitations under the License. */ -#ifndef CONF_H_ -#define CONF_H_ - - -/* #define HOME_SCREEN_EFL_TEST_RUN 1 */ -/* #define HOME_SCREEN_DND_ENABLED 1 */ -/* #define HOME_SCREEN_BLUR_ENABLED 1 */ +#ifndef __CONF_H__ +#define __CONF_H__ #define FRAMES_PER_SECOND 1.0/60.0 -/*=================================SCREEN CONF================================*/ -#define INDICATOR_HEIGHT 52 -#define ROOT_WIN_H 1280 -#define ROOT_WIN_W 720 - -#define HD_WIDTH 720 -#define HD_HEIGHT 1280 -#define QHD_WIDTH 540 -#define QHD_HEIGHT 960 -#define WVGA_WIDTH 480 -#define WVGA_HEIGHT 800 -#define UHD_WIDTH 1440 -#define UHD_HEIGHT 2560 - -#define HD_SCALE_FACTOR 1.2 -#define QHD_SCALE_FACTOR 0.85 -#define WVGA_SCALE_FACTOR 0.70 -#define UHD_SCALE_FACTOR 1.3 - -/*=================================DATA KEYS CONF=============================*/ -#define KEY_ICON_DATA "item_data" -#define KEY_REPOSITION_DATA "reposition_data" -#define KEY_APP_GRID_DATA "app_grid_data" -#define KEY_THUMB_DATA "thumb_data" - -#define KEY_IS_REPOSITIONABLE "is_repositionable" -#define KEY_INDEX "index_data" - -/*=================================DATABASE===================================*/ -#define DATABASE_FILE \ - "homescreen-efl.db" +#define PATH_MAX_LEN 2048 +#define INIT_VALUE -987654321 -/*=================================RESOURCES==================================*/ #define EDJE_DIR "edje" #define IMAGE_DIR "images" -/******************************************************************************* -* -* -* SOURCE CONFIGS -* -* -*******************************************************************************/ - -/*================================ OPTION_MENU.C==============================*/ -#define OPTION_MENU_SETTINGS "org.tizen.wallpaper-ui-service" -#define CAPTION_MENU_CENTER_LABEL_TEXT_LEN_MAX 16 - -#define INDEX_HEIGHT 45 -#define BUTTONS_AREA 0.055 -/*================================ ALL_APPS.C=================================*/ -#define APP_ROWS 5 -#define APP_COLS 4 - -#define APPS_SHOW_HIDE_ANIMATION_TIME 0.35 -#define ALL_APPS_ANIMATION_DELTA_Y (0.2*(double)ROOT_WIN_H) -#define ALL_APPS_ANIMATION_HOME_DELTA_Y (0.8 * (double) ROOT_WIN_H) - -/*================================ APP_ICON.C=================================*/ -#define DEFAULT_APP_ICON \ - IMAGE_DIR "/default.png" - -#define BADGE_REL_X 0.85 -#define BADGE_REL_Y 0.00 - -#define SIGNAL_HIGHLIGHT_FOLDER "highlight_folder" -#define SIGNAL_UNHIGHLIGHT_FOLDER "unhighlight_folder" -#define SIGNAL_HIGHLIGHT_IMPOSSIBLE_FOLDER "highlight_impossible_folder" - -/*================================ APP_GRID.C=================================*/ -#define GRID_CONTENT "elm.swallow.icon" -#define EDIT_MODE_SCALE 0.9 -#define CHOOSE_MODE_SCALE 0.9 -#define CHANGE_PAGE_TIMER 0.3 -#define CHANGE_PAGE_LEFT_AREA 0.05 -#define CHANGE_PAGE_RIGHT_AREA 0.95 - -#define SIGNAL_APP_GRID_FULL "app_grid_full" -#define SIGNAL_APP_GRID_BG_HIDE "signal_app_grid_bg_hide" - -/*================================ DATA_MODEL.C===============================*/ -#define APPS_PAGE APP_ROWS*APP_COLS -#define FOLDER_APPS_PAGE 9 - -/*================================ LIVEBOX CONFIG ============================*/ -#define WIDGET_NR_OF_SIZE_LIST 13 -#define LIVEBOX_ON_CREATE_SIZE 4 -#define LIVEBOX_MIN_MOUSE_MOVE 100 - -#define TEST_PKG "/usr/apps/org.tizen.homescreen-efl/res/images/livebox/" -#define TEST_PKG_ALARM TEST_PKG"preview_alarm.png" -#define TEST_PKG_DUAL_CLOCK TEST_PKG"preview_dual_clock.png" -#define TEST_PKG_MUSIC TEST_PKG"preview_music.png" -#define TEST_PKG_CALENDAR TEST_PKG"preview_calendar.png" -#define TEST_PKG_FMRADIO TEST_PKG"preview_FMradio.png" -#define TEST_PKG_SINGLE_CLOCK TEST_PKG"preview_singel_clock.png" -#define TEST_PKG_CONTACT_4_2 TEST_PKG"preview_contact_4x2.png" -#define TEST_PKG_GALERY TEST_PKG"preview_gallery.png" -#define TEST_PKG_WEATHER_4_2 TEST_PKG"preview_weather_4x2.png" -#define TEST_PKG_CONTACT_4_4 TEST_PKG"preview_contact_4x4.png" -#define TEST_PKG_INTERNET TEST_PKG"preview_internet_4x4.png" -#define TEST_PKG_WEATHER_4_4 TEST_PKG"preview_weather_4x4.png" - -#define EDJE_LIVEBOX_CONTAINER_FILENAME EDJE_DIR"/livebox_container.edj" -#define GROUP_LIVEBOX_CONTAINER "livebox_container" - -#define EDJE_LIVEBOX_LAYOUT_FILENAME EDJE_DIR"/livebox_layout.edj" -#define GROUP_LIVEBOX_LAYOUT "livebox" - -#define LIVEBOX_SCROLLER_MAX_PAGES 6 -#define LIVEBOX_GRID_ROWS 4 -#define LIVEBOX_GRID_COLUMNS 4 -#define LIVEBOX_GRID_ROWS_CELLS_MULTI 1 -#define LIVEBOX_TOTAL_ROWS (LIVEBOX_GRID_ROWS * LIVEBOX_GRID_ROWS_CELLS_MULTI) -#define LIVEBOX_TOTAL_COLUMNS \ - (LIVEBOX_GRID_COLUMNS * LIVEBOX_GRID_ROWS_CELLS_MULTI) - -#define LIVEBOX_RESIZE_POS_MULTI_ROWS (1.0 / LIVEBOX_TOTAL_ROWS) -#define LIVEBOX_RESIZE_POS_MULTI_COLS (1.0 / LIVEBOX_TOTAL_COLUMNS) -#define LIVEBOX_GRID_BG_PADDING 3 -#define LIVEBOX_MAX_BUTTON_NAME_LENGTH 15 -#define LIVEBOX_PAGE_HEIGHT_REL (1.0*ROOT_WIN_W/ROOT_WIN_H) -/*this should be smaller than scroller page*/ -#define LIVEBOX_SIZE_REL (1.0*ROOT_WIN_W/ROOT_WIN_H) -/*size of the area which causes page change during drag'n drop*/ -#define LIVEBOX_PAGE_CHANGE_RECT_SIZE 60 -#define LIVEBOX_PAGE_NO_CHANGE -1 -#define LIVEBOX_DRAGGED_ITEM_ALPHA 96 -#define LIVEBOX_LONGPRESS_TIME 1 -#define LIVEBOX_PAGE_CHANGE_PERIOD 0.75 -#define LIVEBOX_MAX_STATE_LEN 10 -#define LIVEBOX_HORIZONTAL_PADDING 10 -#define LIVEBOX_MAKE_SPACE_ANIM_TIME 0.33 -#define LIVEBOX_GRID_BG_ALPHA 40 + 51 -#define LIVEBOX_REPOSITION_ANIM_TIME 0.33 - -#define PART_LIVEBOX "livebox" -#define PART_RESIZE_BUTTON_DOWN "button.down" -#define PART_RESIZE_BUTTON_LEFT "button.left" -#define PART_RESIZE_BUTTON_UP "button.up" -#define PART_RESIZE_BUTTON_RIGHT "button.right" -#define PART_ADD_PAGE_BUTTON "add_page_button" -#define PART_PAGE_BG "bg" -#define PART_GRID_BG "grid_bg" -#define PART_GRID "grid" - -#define SIGNAL_CONTENT_SOURCE "content" -#define SIGNAL_LIVEBOX_SOURCE "livebox" -#define SIGNAL_LAYOUT_SOURCE "layout" -#define SIGNAL_REMOVE_SOURCE "remove_button" -#define SIGNAL_RESIZING "drag" -#define SIGNAL_RESIZE_END "drag,stop" -#define SIGNAL_RESIZE_SLIDER_DRAG_OK "drag,ok" -#define SIGNAL_RESIZE_SLIDER_DRAG_ERR "drag,outside" -#define SIGNAL_RESIZE_SLIDERS_SHOW "sliders,show" -#define SIGNAL_RESIZE_SLIDERS_HIDE "sliders,hide" -/*#define SIGNAL_REMOVE_BUTTON_CLICKED "remove_button,clicked" */ -#define SIGNAL_CLICKED "mouse,clicked,*" -#define SIGNAL_LIVEBOX_REMOVE_BUTTON_SHOW "remove_button,show" -#define SIGNAL_LIVEBOX_REMOVE_BUTTON_HIDE "remove_button,hide" -#define SIGNAL_REMOVE_BUTTON_INSTANT_HIDE "remove_button,hide,instant" -#define SIGNAL_LIVEBOX_REPOSITION_BG_SHOW "reposition_bg,show" -#define SIGNAL_LIVEBOX_REPOSITION_BG_HIDE "reposition_bg,hide" -#define SIGNAL_EMPTY_PAGE_SHOW "empty_page,show" -#define SIGNAL_EMPTY_PAGE_HIDE "empty_page,hide" -#define SIGNAL_EMPTY_PAGE_EDIT_START "empty_page,edit,start" -#define SIGNAL_EMPTY_PAGE_EDIT_STOP "empty_page,edit,stop" -#define SIGNAL_EDIT_START "edit,start" -#define SIGNAL_EDIT_STOP "edit,stop" -#define SIGNAL_ADD_SHOW "add,show" -#define SIGNAL_ADD_HIDE "add,hide" -#define SIGNAL_ADD_PAGE_CLICKED "add_page_button_clicked" -#define SIGNAL_SCROLLER_PAGE_COUNT_CHANGED "scroller,count,changed" -#define SIGNAL_MOUSE_DOWN "mouse,down,*" -#define SIGNAL_MOUSE_UP "mouse,up,*" -#define SIGNAL_SCROLLER_DRAG_START "scroll,drag,start" -#define SIGNAL_SCROLLER_SCROLL "scroll" -#define SIGNAL_GRID_SHADOW_SHOW "grid,show" -#define SIGNAL_GRID_SHADOW_HIDE "grid,hide" -#define CANNOT_ADD_PAGE_INFO "There is not enough space on the home screen." -#define CANNOT_ADD_WIDGET_INFO "Unsupported widget size." - -/*========================== ALL PAGES CONFIG ================================*/ -#define GENGRID_ITEM_CONTENT "elm.swallow.icon" - -#define IMAGE_ADD_PAGE_FILENAME \ - "/usr/apps/com.samsung.home-lite/res/images/edit_all_page_create.png" - -#define ALL_PAGES_X 0 -#define ALL_PAGES_Y 0 - -#define THUMB_W_REL (320.0/ROOT_WIN_W) -#define THUMB_H_REL (320.0/ROOT_WIN_H) - -#define ITEM_W_REL (336.0/ROOT_WIN_W) -#define ITEM_H_REL (397.0/ROOT_WIN_H) - -#define MAX_ITEMS 6 -#define ITEM_CREATE_TIME 0.5 -#define OFFSET 100 -/*========================== KEY CONFIG ======================================*/ - -#define KEY_HOME "XF86Home" -#define KEY_MENU "XF86Menu" -#define KEY_BACK "XF86Back" -#define KEY_RETURN "Return" - - -/*======================== FOLDER CONFIG =====================================*/ -#define FOLDER_MAX_ITEMS 9 -#define FOLDER_POPUP_Y_REL 0.1677 - -/*======================== POPUP CONFIG ================================*/ -#define POPUP_MAX_FOLDER_ITEMS_TEXT "There is not enough space in folder" - -/******************************************************************************* -* -* -* EDC FILE CONFIGURATIONS -* -* -*******************************************************************************/ -#define SIGNAL_SOURCE "layout" - -/*========================== HOME VIEW CONFIG ================================*/ -#define _HOME_WGT_MIN_Y 80 -#define _HOME_WGT_MAX_Y 1140 -#define _HOME_WGT_EDIT_MAX_Y 1034 - -#define _HOME_BTNS_Y_MIN 1188 -#define _HOME_BTNS_Y_MAX 1263 -#define _HOME_MENU_BTN_X_MIN 32 -#define _HOME_MENU_BTN_X_MAX 161 - -#define _HOME_HOME_BTN_X_MIN 559 -#define _HOME_HOME_BTN_X_MAX 688 -#define _HOME_CHOOSER_CAPTION_Y_MIN 0 -#define _HOME_CHOOSER_CAPTION_Y_MAX 80 - -#define _HOME_PG_INDEX_X_MIN 161 -#define _HOME_PG_INDEX_X_MAX 559 - -#define INDICE_NEXT_PAGE_X_MIN 0.99 -#define INDICE_NEXT_PAGE_X_MAX 1.00 -#define INDICE_PREV_PAGE_X_MIN 0.00 -#define INDICE_PREV_PAGE_X_MAX 0.01 - -#define _MAIN_CONTENT_Y_MIN 72 /*TODO: This value should be 42*/ -#define _MAIN_CONTENT_Y_MAX 862 -#define _APP_CONTENT_Y_MAX 1172 - -#define CONTENT_Y_MIN _MAIN_CONTENT_Y_MIN/ROOT_WIN_H; -#define CONTENT_Y_MAX _MAIN_CONTENT_Y_MAX/ROOT_WIN_H; -#define CONTENT_APP_Y_MAX _APP_CONTENT_Y_MAX/ROOT_WIN_H; - -#define HOME_WGT_MIN_Y _HOME_WGT_MIN_Y/ROOT_WIN_H -#define HOME_WGT_MAX_Y _HOME_WGT_MAX_Y/ROOT_WIN_H -#define HOME_WGT_EDIT_MAX_Y _HOME_WGT_EDIT_MAX_Y/ROOT_WIN_H - -#define HOME_BTNS_Y_MIN _HOME_BTNS_Y_MIN/ROOT_WIN_H -#define HOME_BTNS_Y_MAX _HOME_BTNS_Y_MAX/ROOT_WIN_H -#define HOME_MENU_BTN_X_MIN _HOME_MENU_BTN_X_MIN/ROOT_WIN_W -#define HOME_MENU_BTN_X_MAX _HOME_MENU_BTN_X_MAX/ROOT_WIN_W -#define HOME_HOME_BTN_X_MIN _HOME_HOME_BTN_X_MIN/ROOT_WIN_W -#define HOME_HOME_BTN_X_MAX _HOME_HOME_BTN_X_MAX/ROOT_WIN_W -#define HOME_CHOOSER_CAPTION_Y_MIN _HOME_CHOOSER_CAPTION_Y_MIN/ROOT_WIN_H -#define HOME_CHOOSER_CAPTION_Y_MAX _HOME_CHOOSER_CAPTION_Y_MAX/ROOT_WIN_H - -#define HOME_PG_INDEX_X_MIN _HOME_PG_INDEX_X_MIN/ROOT_WIN_W -#define HOME_PG_INDEX_X_MAX _HOME_PG_INDEX_X_MAX/ROOT_WIN_W - -#define SIGNAL_MENU_BTN_CLICKED "menu_clicked" -#define SIGNAL_HOME_BTN_CLICKED "home_clicked" -#define SIGNAL_CHOOSER_CAPTION_ACTIVATE "chooser,caption,activate" -#define SIGNAL_CHOOSER_CAPTION_DEACTIVATE "chooser,caption,deactivate" - -#define GROUP_HOME_LY "home_ly" -#define PART_CONTENT "content" -#define PART_INDEX "index" -#define PART_EDIT_BG "edit_bg" -#define PART_NEXT_PAGE_INDICE "next_page_indice" -#define PART_PREV_PAGE_INDICE "prev_page_indice" -#define PART_EVENT_BLOCKER "part_event_blocker" -#define PART_CHOOSER_CAPTION_RIGHT_LABEL "chooser_caption_right_label" -#define PART_CHOOSER_CAPTION_LEFT_LABEL "chooser_caption_left_label" -#define PART_CHOOSER_CAPTION_MIDDLE_LABEL "chooser_caption_middle_label" - -#define SIGNAL_EDIT_BG_ON "edit_bg_on" -#define SIGNAL_EDIT_BG_OFF "edit_bg_off" -#define SIGNAL_NEXT_PAGE_INDICE_SHOW "next_page_show" -#define SIGNAL_PREV_PAGE_INDICE_SHOW "prev_page_show" -#define SIGNAL_INDICE_HIDE "page_indice_hide" - -#define SIGNAL_BLOCK_EVENTS "block_home_events" -#define SIGNAL_UNBLOCK_EVENTS "unblock_home_events" - -/*this signals is used for change page on reposition action */ -#define SIGNAL_NEXT_PAGE_CHANGE "next_page_change" -#define SIGNAL_PREV_PAGE_CHANGE "prev_page_change" - -/*these signals change states of bottom buttons (menu and home/all apps) */ -#define SIGNAL_BOTTOM_BUTTONS_HOME_STATE_SET "menu_icon_home_state_set" -#define SIGNAL_BOTTOM_BUTTONS_ALL_APPS_STATE_SET "menu_icon_all_apps_state_set" -#define SIGNAL_BOTTOM_BUTTONS_HOME_EDIT_STATE_SET "menu_icon_home_edit_state_set" -#define SIGNAL_BOTTOM_BUTTONS_ALL_APPS_EDIT_STATE_SET "menu_icon_edit_state_set" - -/*========================== LIVEBOX EDC CONFIG ==============================*/ -#define _LIVEBOX_X_MARGIN 6 -#define _LIVEBOX_X_MIN _LIVEBOX_X_MARGIN -#define _LIVEBOX_X_MAX (ROOT_WIN_W - _LIVEBOX_X_MARGIN) - -#define _LIVEBOX_EDIT_X_MARGIN 30 -#define _LIVEBOX_EDIT_Y_MARGIN 30 -#define _LIVEBOX_EDIT_X_MIN _LIVEBOX_EDIT_X_MARGIN -#define _LIVEBOX_EDIT_X_MAX (ROOT_WIN_W - _LIVEBOX_EDIT_X_MARGIN) -#define _LIVEBOX_EDIT_Y_MIN _LIVEBOX_EDIT_X_MARGIN -/*square area of screen width size is required */ -#define _LIVEBOX_EDIT_Y_MAX (ROOT_WIN_W - _LIVEBOX_EDIT_X_MARGIN) - -#define _LIVEBOX_ADD_PAGE_BUTTON_SIZE_HALF 60 -#define _LIVEBOX_ADD_PAGE_BUTTON_X_MIN \ - (ROOT_WIN_W / 2 - _LIVEBOX_ADD_PAGE_BUTTON_SIZE_HALF) -#define _LIVEBOX_ADD_PAGE_BUTTON_X_MAX \ - (ROOT_WIN_W / 2 + _LIVEBOX_ADD_PAGE_BUTTON_SIZE_HALF) -#define _LIVEBOX_ADD_PAGE_BUTTON_Y_MIN \ - (ROOT_WIN_W / 2 - _LIVEBOX_ADD_PAGE_BUTTON_SIZE_HALF) -#define _LIVEBOX_ADD_PAGE_BUTTON_Y_MAX \ - (ROOT_WIN_W / 2 + _LIVEBOX_ADD_PAGE_BUTTON_SIZE_HALF) - -#define LIVEBOX_REMOVE_BUTTON_SIZE 48 -#define LIVEBOX_SLIDER_BUTTON_SIZE 12 -#define LIVEBOX_SLIDER_FRAME_OFFSET_1 5 -#define LIVEBOX_SLIDER_FRAME_OFFSET_2 8 - -#define LIVEBOX_REMOVE_LB_BUTTON_SIZE 24 -#define LIVEBOX_REMOVE_LB_OFFSET_X 9 -#define LIVEBOX_REMOVE_LB_OFFSET_Y 8 - -#define LIVEBOX_REPOSITION_BG_BORDER 10 -#define LIVEBOX_REPOSITION_BG_COLOR 162 -#define LIVEBOX_REPOSITION_SHADOW_COLOR 96 - -#define LIVEBOX_X_MIN _LIVEBOX_X_MIN/ROOT_WIN_W -#define LIVEBOX_X_MAX _LIVEBOX_X_MAX/ROOT_WIN_W - -#define LIVEBOX_EDIT_X_MIN _LIVEBOX_EDIT_X_MIN/ROOT_WIN_W -#define LIVEBOX_EDIT_X_MAX _LIVEBOX_EDIT_X_MAX/ROOT_WIN_W -#define LIVEBOX_EDIT_Y_MIN _LIVEBOX_EDIT_Y_MIN/ROOT_WIN_W -#define LIVEBOX_EDIT_Y_MAX _LIVEBOX_EDIT_Y_MAX/ROOT_WIN_W - -#define LIVEBOX_ADD_PAGE_BUTTON_X_MIN _LIVEBOX_ADD_PAGE_BUTTON_X_MIN/ROOT_WIN_W -#define LIVEBOX_ADD_PAGE_BUTTON_X_MAX _LIVEBOX_ADD_PAGE_BUTTON_X_MAX/ROOT_WIN_W -#define LIVEBOX_ADD_PAGE_BUTTON_Y_MIN _LIVEBOX_ADD_PAGE_BUTTON_Y_MIN/ROOT_WIN_W -#define LIVEBOX_ADD_PAGE_BUTTON_Y_MAX _LIVEBOX_ADD_PAGE_BUTTON_Y_MAX/ROOT_WIN_W - -#define LIVEBOX_RESIZE_FRAME_REL_1 \ - (1.0 * LIVEBOX_SLIDER_FRAME_OFFSET_1 / LIVEBOX_SLIDER_BUTTON_SIZE) -#define LIVEBOX_RESIZE_FRAME_REL_2 \ - (1.0 * LIVEBOX_SLIDER_FRAME_OFFSET_2 / LIVEBOX_SLIDER_BUTTON_SIZE) - -/*========================== APP ICON CONFIG =================================*/ -#define FOLDER_ICON_MAX_MINIATURES 4 - -#define ICON_CONTAINER_W 132 -#define ICON_CONTAINER_H 159 - -#define ICON_BADGE_W 30 -#define ICON_BADGE_H 30 - -#define _ICON_Y_MIN 8 -#define _ICON_Y_MAX 96 -#define _ICON_X_MIN 22 -#define _ICON_X_MAX 110 - -#define _ICON_NAME_X_MIN 6 -#define _ICON_NAME_X_MAX 126 -#define _ICON_NAME_Y_MIN 98 -#define _ICON_NAME_Y_MAX 156 -#define _ICON_NAME_EDIT_Y_MAX 144 - -#define _ICON_UNINSTALL_BTN_X_MAX 60 -#define _ICON_UNINSTALL_BTN_Y_MAX 60 - -#define ICON_Y_MIN _ICON_Y_MIN/ICON_CONTAINER_H -#define ICON_Y_MAX _ICON_Y_MAX/ICON_CONTAINER_H -#define ICON_X_MIN _ICON_X_MIN/ICON_CONTAINER_W -#define ICON_X_MAX _ICON_X_MAX/ICON_CONTAINER_W - -#define ICON_NAME_X_MIN _ICON_NAME_X_MIN/ICON_CONTAINER_W -#define ICON_NAME_X_MAX _ICON_NAME_X_MAX/ICON_CONTAINER_W -#define ICON_NAME_Y_MIN _ICON_NAME_Y_MIN/ICON_CONTAINER_H -#define ICON_NAME_Y_MAX _ICON_NAME_Y_MAX/ICON_CONTAINER_H -#define ICON_NAME_EDIT_Y_MAX _ICON_NAME_EDIT_Y_MAX/ICON_CONTAINER_H - -#define ICON_UNINSTALL_BTN_X_MAX _ICON_UNINSTALL_BTN_X_MAX/ICON_CONTAINER_W -#define ICON_UNINSTALL_BTN_Y_MAX _ICON_UNINSTALL_BTN_Y_MAX/ICON_CONTAINER_H - -#define ICON_BADGE_CHECKBOX_REL1_X 0.6588 -#define ICON_BADGE_CHECKBOX_REL1_Y 0.0498 -#define ICON_BADGE_CHECKBOX_REL2_X 0.9412 -#define ICON_BADGE_CHECKBOX_REL2_Y 0.2886 - -#define GROUP_ICON_LY "app_icon_layout" -#define PART_ICON_CONTENT "icon_content" -#define PART_ICON_NAME "icon_name" - -#define SIGNAL_PRESS_SOURCE "icon_content_touch" - -#define SIGNAL_ICON_PRESS "icon,pressed" -#define SIGNAL_UNINSTALL_BUTTON_SHOW "uninstall_button,show" -#define SIGNAL_UNINSTALL_BUTTON_HIDE "uninstall_button,hide" -#define SIGNAL_UNINSTALL_BUTTON_CLICKED "uninstall_button,clicked" -#define SIGNAL_CHECKBOX_SHOW_UNCHECKED "checkbox,show,unchecked" -#define SIGNAL_CHECKBOX_SHOW_CHECKED "checkbox,show,checked" -#define SIGNAL_CHECKBOX_SHOW_DIMMED "checkbox,show,dimmed" -#define SIGNAL_CHECKBOX_HIDE "checkbox,hide" -#define SIGNAL_CHECKBOX_CHECKED "checkbox,checked" -#define SIGNAL_CHECKBOX_UNCHECKED "checkbox,unchecked" -#define SIGNAL_CHECKBOX_BLOCK "checkbox,block" -#define SIGNAL_CHECKBOX_UNBLOCK "checkbox,unblock" -#define SIGNAL_LABEL_SHOW "label,show" -#define SIGNAL_LABEL_HIDE "label,hide" -#define SIGNAL_BADGE_SHOW "badge,show" -#define SIGNAL_BADGE_HIDE "badge,hide" -#define SIGNAL_BADGE_FOLDER_SHOW "folder,badge,show" -#define SIGNAL_BADGE_FOLDER_HIDE "folder,badge,hide" -#define SIGNAL_ICON_CLICKED "icon_clicked" -#define SIGNAL_EDIT_MODE_ON "edit_mode_on" -#define SIGNAL_EDIT_MODE_OFF "edit_mode_off" -#define SIGNAL_EDIT_MODE_BLACK_ON "edit_mode_black_on" -#define SIGNAL_EDIT_MODE_BLACK_OFF "edit_mode_black_off" -#define SIGNAL_CHOOSE_MODE_ON "choose_mode_on" -#define SIGNAL_CHOOSE_MODE_OFF "choose_mode_off" -#define SIGNAL_FRAME_POSSIBLE_SHOW "show_frame_possible" -#define SIGNAL_FRAME_IMPOSSIBLE_SHOW "show_frame_impossible" -#define SIGNAL_FRAME_HIDE "hide_frame" -#define SIGNAL_EMPTY_BG_SHOW "empty_bg" -#define SIGNAL_BLACK_TEXT "label,text,black" -#define PART_CAPTION_MENU_CENTER_LABEL_NAME "chooser_caption_middle_label" -#define PART_CAPTION_MENU_LEFT_LABEL "chooser_caption_left_label" -#define PART_CAPTION_MENU_RIGHT_LABEL "chooser_caption_right_label" - -/*========================== INDEX ELEMENT CONFIG ============================*/ -#define INDEX_MAX_PAGE_COUNT 7 -#define SIGNAL_SET_CURRENT "set_current" -#define SIGNAL_SET_DEFAULT "set_default" -#define INDICE_SIZE_SETTER "indice_size_setter" - -#define INDEX_IMAGE IMAGE_DIR"/core_page_indicator_horizontal.png" -#define INDEX_EDJE EDJE_DIR"/index_element.edj" -#define GROUP_INDEX_ELEMENT "index_element" -#define PART_INDEX_ELEMENT "element" - -#define INDEX_ELEMENT_CONTAINER_WIDTH 38.0 -#define INDEX_ELEMENT_CONTAINER_HEIGHT 38.0 - -#define INDEX_CURRENT_SIZE 0.03 -#define INDEX_NORMAL_SIZE 0.015 -#define INDEX_CURRENT_ALPHA 255 -#define INDEX_NORMAL_ALPHA 100 - -/*========================== APP_GRID.EDC CONFIG =============================*/ -#define GROUP_APP_GRID "app_grid_ly" -#define GROUP_APP_GRID_ITEM_CONTAINER "app_grid_item_container" - -#define PART_APP_GRID_BG "app_grid_bg" -#define PART_APP_GRID_EDIT_BG "app_grid_edit_bg" -#define PART_APP_GRID_CONTENT "app_grid_content" -#define PART_APP_GRID_ITEM "app_grid_item" - -#define PART_APP_GRID_SIZE_SETTER "size_setter" - -#define ANIMATION_RESIZE_TIME 0.2 - -/*========================== FOLDER.EDC CONFIG ===============================*/ -#define MINIATURE_COL_1_MIN 0.18 -#define MINIATURE_COL_1_MAX 0.48 -#define MINIATURE_COL_2_MIN 0.52 -#define MINIATURE_COL_2_MAX 0.82 -#define MINIATURE_ROW_1_MIN 0.18 -#define MINIATURE_ROW_1_MAX 0.48 -#define MINIATURE_ROW_2_MIN 0.52 -#define MINIATURE_ROW_2_MAX 0.82 -#define MINIATURE_CENTER_MIN 0.35 -#define MINIATURE_CENTER_MAX 0.65 - -#define FOLDER_HEIGHT 569 - -#define _NAME_Y_MIN 0 -#define _NAME_Y_MAX 62 - -#define _SEPARATOR_Y_MIN 62 -#define _SEPARATOR_Y_MAX 64 - -#define _CONTENT_Y_MIN 53 -#define _CONTENT_Y_MAX 635 - -#define _INDEX_Y_MIN 355 -#define _INDEX_Y_MAX 421 - -#define FOLDER_NAME_Y_MIN _NAME_Y_MIN/FOLDER_HEIGHT -#define FOLDER_NAME_Y_MAX _NAME_Y_MAX/FOLDER_HEIGHT - -#define FOLDER_SEPARATOR_Y_MIN _SEPARATOR_Y_MIN/FOLDER_HEIGHT -#define FOLDER_SEPARATOR_Y_MAX _SEPARATOR_Y_MAX/FOLDER_HEIGHT - -#define FOLDER_CONTENT_Y_MIN _CONTENT_Y_MIN/FOLDER_HEIGHT -#define FOLDER_CONTENT_Y_MAX _CONTENT_Y_MAX/FOLDER_HEIGHT - -#define INDEX_Y_MIN _INDEX_Y_MIN/FOLDER_3_R_IND_HEIGHT -#define INDEX_Y_MAX _INDEX_Y_MAX/FOLDER_3_R_IND_HEIGHT - -#define GROUP_FOLDER_ICON_LAYOUT "folder_icon_layout" -#define GROUP_FOLDER_ADD_ICON "folder_add_icon" -#define GROUP_FOLDER_WINDOW "folder_window" -#define GROUP_FOLDER_POPUP "folder_popup" -#define PART_FOLDER_NAME "folder_name_entry" -#define PART_FOLDER_CONTENT "folder_content" -#define PART_FOLDER_UNNAMED_TEXT "Unnamed folder" - -#define SIGNAL_CLEAR_BTN_SHOW "clear_btn_show" -#define SIGNAL_CLEAR_BTN_HIDE "clear_btn_hide" -#define SIGNAL_CLEAR_BTN_CLICKED "clear_btn_clicked" -#define SIGNAL_ENTRY_BLOCK_ON "folder_entry,block,on" -#define SIGNAL_ENTRY_BLOCK_OFF "folder_entry,block,off" - -#define SIGNAL_BG_CLICKED "bg_clicked" - -#define SIGNAL_FOLDER_PANEL_OPEN "folder_open" -#define SIGNAL_FOLDER_PANEL_CLOSE "folder_close" -#define SIGNAL_FOLDER_ANIM_DONE "anim_done" -#define SIGNAL_FOLDER_UNNAMED_TEXT_SHOW "unnamed_text_show" -#define SIGNAL_FOLDER_UNNAMED_TEXT_HIDE "unnamed_text_hide" - -#define FOLDER_1_ROW_H_REL 0.25875 -#define FOLDER_2_ROW_H_REL 0.42375 -#define FOLDER_3_ROW_H_REL 0.59125 - -#define FOLDER_ROW_W_REL 0.7 -#define FOLDER_POPUP_W_REL 0.9118 -#define FOLDER_POPUP_X_REL 0.0441 - -#define FOLDER_GRID_W_REL 0.9 -#define FOLDER_GRID_H_REL 0.6 -#define FOLDER_ITEM_MARGIN 0.04 - -#define FOLDER_LEFT_MARGIN 0.07 -#define FOLDER_RIGHT_MARGIN 0.93 - -#define FOLDER_WINDOW_W home_screen_get_root_width() -#define FOLDER_WINDOW_H home_screen_get_root_height() - -#define FOLDER_ROW_APPS 3 -#define FOLDER_COL_APPS 3 - -#define POPUP_SHIFT 15 -#define KEYPAD_SPACE 5 -#define DEFAULT_FOLDER_NAME "Unnamed folder" - -/*========================== ALL PAGES EDC ===================================*/ -#define GROUP_ALL_PAGES "page_edit_view" -#define GROUP_GRID_ITEM "grid_item" -#define GROUP_THUMB "thumb" - -#define PART_LAYOUT_CONTENT "content" -#define PART_GRID_ITEM_CONTENT "grid_item_content" -#define PART_THUMB_CONTENT "page_thumbnail" - -#define SIGNAL_BG_HIDE "bg_hide" -#define SIGNAL_BG_NORMAL "bg_normal" -#define SIGNAL_BG_REPOSITON "bg_reposition" -#define SIGNAL_REMOVE_BUTTON_CLICKED "remove_button_clicked" -#define SIGNAL_THUMBNAIL_CLICKED "thumbnail_clicked" -#define SIGNAL_ADD_ICON_SHOW "add_icon_show" -#define SIGNAL_REMOVE_BUTTON_SHOW "remove_button_show" -#define SIGNAL_REMOVE_BUTTON_HIDE "remove_button_hide" -#define SIGNAL_REMOVE_BUTTON_HIDE_INSTANT "remove_button_hide_instant" - -#define BADGE_REL1_X 0.060 -#define BADGE_REL1_Y 0.118 -#define BADGE_REL2_X 0.250 -#define BADGE_REL2_Y 0.284 - -#define ROW_SHIFT 0.45 -#define COL_SHIFT 0.32 -#endif /* CONF_H_ */ +#define HOME_ANIMATION_TIME 0.3 +#define HOME_FOLDR_ANIMATION_TIME 0.1 +#define MAX_FILE_PATH_LEN 1024 +#define HOME_EDIT_SCROLL_MOVE_TIME 1 + +extern double __conf_get_resolution_scale_h(); +extern double __conf_get_resolution_scale_w(); +extern int __conf_get_window_h(); +extern int __conf_get_window_w(); + +#define INDICATOR_H ((45) * (__conf_get_resolution_scale_h())) + +#define WINDOW_H __conf_get_window_h() +#define WINDOW_W __conf_get_window_w() + +#define APPS_VIEW_PADDING_TOP INDICATOR_H + ((28) * (__conf_get_resolution_scale_h())) +#define APPS_VIEW_W ((720) * (__conf_get_resolution_scale_w())) +#define APPS_VIEW_H ((1060) * (__conf_get_resolution_scale_h())) +#define APPS_VIEW_ANIMATION_DELTA ((100) * (__conf_get_resolution_scale_h())) + +#define APPS_VIEW_ICON_IMAGE ((118) * (__conf_get_resolution_scale_w())) + +#define CLUSTER_VIEW_W ((720) * (__conf_get_resolution_scale_w())) +#define CLUSTER_VIEW_H ((1150) * (__conf_get_resolution_scale_h())) +#define CLUSTER_W CLUSTER_VIEW_W +#define CLUSTER_H CLUSTER_W +#define CLUSTER_ALL_PAGE_W ((320) * (__conf_get_resolution_scale_w())) +#define CLUSTER_ALL_PAGE_H CLUSTER_ALL_PAGE_W +#define CLUSTER_ALL_PAGE_GAP_H ((100) * (__conf_get_resolution_scale_h())) +#define CLUSTER_ALL_PAGE_GAP_W ((16) * (__conf_get_resolution_scale_w())) +#define CLUSTER_ALL_PAGE_PADDING_SIDE ((32) * (__conf_get_resolution_scale_w())) +#define CLUSTER_ALL_PAGE_PADDING_TOP ((60) * (__conf_get_resolution_scale_h())) +#define CLUSTER_DELETE_BUTTON_W ((60) * (__conf_get_resolution_scale_w())) +#define CLUSTER_DELETE_BUTTON_H CLUSTER_DELETE_BUTTON_W +#define CLUSTER_EDIT_LEFT_SCROLL_REGION ((72) * (__conf_get_resolution_scale_w())) +#define CLUSTER_EDIT_RIGHT_SCROLL_REGION (CLUSTER_VIEW_W - CLUSTER_EDIT_LEFT_SCROLL_REGION) + +#define CLUSTER_ROW 4 +#define CLUSTER_COL 4 +#define CLUSTER_HOME_PAGE 0 +#define CLUSTER_MAX_PAGE 6 + +#define PAGE_INDICATOR_PADDING_BOTTON ((16) * (__conf_get_resolution_scale_h())) +#define PAGE_INDICATOR_H ((76) * (__conf_get_resolution_scale_h())) +#define PAGE_INDICATOR_W ((720) * (__conf_get_resolution_scale_w())) +#define PAGE_INDICATOR_GAP 4 +#define PAGE_INDICATOR_X 0 +#define PAGE_INDICATOR_UNIT ((40) * (__conf_get_resolution_scale_w())) + +#define ALLPAGE_PREVIEW_PADDING_MID ((12) * (__conf_get_resolution_scale_w())) +#define ALLPAGE_PREVIEW_PADDING_TOP ((18) * (__conf_get_resolution_scale_h())) +#define ALLPAGE_PREVIEW_LIST_ITEM_W ((720) * (__conf_get_resolution_scale_w())) +#define ALLPAGE_PREVIEW_LIST_ITEM_H ((388) * (__conf_get_resolution_scale_h())) +#define ALLPAGE_PREVIEW_4X4_W ((300) * (__conf_get_resolution_scale_w())) +#define ALLPAGE_PREVIEW_4X4_H ALLPAGE_PREVIEW_4X4_W +#define ALLPAGE_PREVIEW_4X2_W ((300) * (__conf_get_resolution_scale_w())) +#define ALLPAGE_PREVIEW_4X2_H ((ALLPAGE_PREVIEW_4X4_W/2) * (__conf_get_resolution_scale_h())) +#define ALLPAGE_MOVE_GAP 0.15 + +#define APPS_FOLDER_MAX_ITEM 9 + +#define LONG_PRESS_TIME 0.75 + +void conf_set_resolution_scale(int win_width, int win_height); + +#endif /* __CONF_H__ */ diff --git a/inc/data_model.h b/inc/data_model.h deleted file mode 100644 index 3d51287..0000000 --- a/inc/data_model.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef DATA_MODEL_H_ -#define DATA_MODEL_H_ - -#include -#include "app_mgr.h" -#include "tree.h" - -typedef enum { - REPOSITION_SIDE_TO_LEFT, - REPOSITION_SIDE_TO_RIGHT -} reposition_side_t; - -/** - * @brief gets data model of the application - */ -extern Tree_node_t *data_model_get_data(void); - -/** - * @brief gets data model for the all apps view. - */ -extern Tree_node_t *data_model_get_all_apps(void); - -/** - * @brief gets data model for the home view. - */ -extern Tree_node_t *data_model_get_home(void); - -/* - * @brief Get applications from app manager - */ -extern void data_model_load_app_mgr(void); - -/* - * @brief Get applications from database - */ -extern Eina_Bool data_model_load_db(void); - -/* - * @brief free entire memory allocated for model structure - * and nodes data - */ -extern void data_model_free(void); - -/** - * @brief Creates folder in the data model/ - */ -extern Tree_node_t *data_model_create_folder(app_item_t *node); - -/** - * @brief Appends an item into the folder. - */ -extern void data_model_append_node_to_folder(Tree_node_t *folder, - Tree_node_t *node); - -/** - * @brief Removes empty pages from the all apps view in the data model. - */ -extern void data_model_free_empty_pages(Tree_node_t *folder_or_some_other_root); - -/* - * @brief Delete folder and move apps to all apps - */ -extern void data_model_delete_folder(Tree_node_t *node); - -/** - * @brief Append an newly installed application to the data model. - */ -extern Tree_node_t *data_model_install_application( - app_mgr_item_t *app_mgr_item); - -/** - * @brief Uninstall an application - */ -extern void data_model_uninstall_application(Tree_node_t *node); - -/* - * @brief set checked state to all icons - */ -extern void data_model_check_all_apps(Tree_node_t *node, bool checked); - -/** - * @brief returns count of checked applications in the all apps edit mode view. - */ -extern int data_model_get_app_check_state(void); - -/** - * @brief change position of an application - */ -extern void data_model_reposition_item(Tree_node_t *node, - Tree_node_t *destinations_parent, Tree_node_t *destination, - reposition_side_t side, int page_limit); - -/** - * @brief set the view type of the data models items - */ -extern void data_model_set_view_mode(homescreen_view_t view); - -/** - * @brief iterates over the whole tree and applies func_cb over each node - * @param node - tree node, pass NULL if You want - * to start from the root of the model tree - * @param func_cb - function to call on each node - * @param data - data - to be passed to func_cb - * @details [long description] - */ -extern void data_model_iterate(Tree_node_t *node, tree_browse_cb_t func_cb, - void *data); - -/** - * @brief This one takes pages abstraction into account. - * Iterates through pages, and it's items. - * @param node - tree node, pass NULL if You want - * to start from the root of the model tree - * @param item_func - function to call on each item - * @param page_func - function to call on each page - * @param data - data - to be passed to func_cb - */ -extern void data_model_iterate_pages(Tree_node_t *node, - tree_browse_cb_t page_func, tree_browse_cb_t item_func, void *data); - -/** - * @brief sorts in place using sort_compare_function - */ -extern void data_model_sort(Eina_Compare_Cb sort_compare_function); - -/** - * @brief Creates new page - * @details Creates new page node, adds it to the tree structure and - * returns the created page - * @return new page node - */ -extern Tree_node_t *data_model_add_widget_page(void); - -/** - * @brief Creates new widget and adds it to @p page - * @param page Page the new widget will be added to - * @param widget_id Created widget - * @param col column to put widget in - * @param row row to put widget in - * @param col_span column span of widget - * @param row_span row span of widget - * @return New widget node - */ -extern Tree_node_t *data_model_add_widget(Tree_node_t *page, - const char *widget_id, int col, int row, int col_span, int row_span, - const char *content_info); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void data_model_reposition_widget(Tree_node_t *page_node, - Tree_node_t *obj_node); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void data_model_resize_widget(Tree_node_t *item_node, int col, int row, - int col_span, int row_span); - -extern void data_model_update_content_info(Tree_node_t *item_node, const char *content_info); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void data_model_insert_after(Tree_node_t *prev_node, - Tree_node_t *item_node); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void data_model_del_item(Tree_node_t *node); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void data_model_update_item(Tree_node_t *node); - -/** - * @brief Unpin a repositioned node from the folder. - * - * @param folder_node Folder node pointer. - * @param node repositioned node pointer. - */ -extern void data_model_detach_from_folder(Tree_node_t *folder_node, - Tree_node_t *node); - -/** - * @brief Search node with package name. - * - * @param package name - * @return node or NULL - */ -Tree_node_t *data_model_search_package(const char* pkg_str); - - -#endif /* DATA_MODEL_H_ */ diff --git a/inc/db/db.h b/inc/db/db.h deleted file mode 100644 index be9e17c..0000000 --- a/inc/db/db.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DB_H__ -#define __DB_H__ - -#include "app_item.h" -#include "util.h" - -typedef struct -{ - int id; - app_item_type_t type; - char *appid; - - int first_id; - int next_id; - - int x; - int y; - int w; - int h; - - char *content_info; -} db_item_t; - -/** - * @brief Create database table - */ -extern bool db_create_tables(void); - -/** - * @brief Get the applications list from the database - * @param apps Eina_List pointer - */ -extern bool db_get_apps(Eina_List **apps); - -/** - * @brief Frees the application list - * @param apps Pointer to Eina_List. - */ -extern void db_free_apps(Eina_List *apps); - -/** - * @brief Updates the database - * @param updated item - * @param insert flag. - */ -extern bool db_update_apps(db_item_t item, bool insert); - -#endif /* __DB_H__ */ diff --git a/inc/dynamic_index.h b/inc/dynamic_index.h deleted file mode 100644 index fdd47af..0000000 --- a/inc/dynamic_index.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef DYNAMIC_INDEX_H_ -#define DYNAMIC_INDEX_H_ - -#include -#include - -#include "page_scroller.h" -#include "conf.h" - -typedef struct { - Evas_Object *scroller; - Evas_Object *box; - Evas_Object *indices[INDEX_MAX_PAGE_COUNT]; - int page_count; - int page_width; - int page_current; - int x_current; -} dynamic_index_t; - -/** - * @brief Creates new dynamic index object - * @param page_scroller Evas_Object pointer to elm_scroller widget - */ -dynamic_index_t *dynamic_index_new(Evas_Object *page_scroller); - -/** - * @brief Removes dynamic inxed object - * @param dynamic_index Pointer to dynamic_index_t type. - */ -void dynamic_index_del(dynamic_index_t *dynamic_index); - -/** - * @brief Clears content and set current index. - * @details [long description] - * - * @param dynamic_index [description] - */ -void dynamic_index_reload(dynamic_index_t *dynamic_index, int idx, int page_count); - -#endif /* DYNAMIC_INDEX_H_ */ diff --git a/inc/edc_conf.h b/inc/edc_conf.h new file mode 100755 index 0000000..2c00eb3 --- /dev/null +++ b/inc/edc_conf.h @@ -0,0 +1,164 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __EDC_CONF_H__ +#define __EDC_CONF_H__ + +#define GROUP_HOME_LY "home_ly" +#define HOME_BG "home_bg" +#define HOME_CONTENT "part_content" + +#define HOME_BUTTON "home_btn" +#define MENU_BUTTON "menu_btn" + +#define SIGNAL_MENU_BTN_CLICKED "menu_btn_clicked" +#define SIGNAL_HOME_BTN_CLICKED "home_btn_clicked" +#define SIGNAL_SOURCE "source" + +#define SIGNAL_BTN_SHOW_HOME_STATE "btn_show_home_state" +#define SIGNAL_BTN_SHOW_APPS_STATE "btn_show_apps_state" +#define SIGNAL_BTN_HIDE_HOME_STATE "btn_hide_home_state" +#define SIGNAL_BTN_HIDE_APPS_STATE "btn_hide_apps_state" +#define SIGNAL_HOME_BTN_ICON_SHOW "home_btn_icon_show" +#define SIGNAL_HOME_BTN_ICON_HIDE "home_btn_icon_hide" +#define SIGNAL_APPS_BTN_ICON_SHOW "apps_btn_icon_show" +#define SIGNAL_APPS_BTN_ICON_HIDE "apps_btn_icon_hide" + +#define GROUP_HOME_BTN_LY "home_btn_ly" + +// cluster +#define SIZE_SETTER "size_setter" +#define CLUSTER_BOX "cluster_box" +#define CLUSTER_BG "cluster_bg" +#define CLUSTER_ADD_PAGE "cluster_add_page" +#define CLUSTER_ALL_PAGE_MODE_ON "cluster_all_page_on" +#define CLUSTER_ALL_PAGE_MODE_OFF "cluster_all_page_off" +#define CLUSTER_PAGE_DELETE_BUTTON "cluster_delete_page" +#define CLUSTER_ALLPAGE_GRID "cluster_all_page_grid" +#define SIGNAL_CLUSTER_EDIT_STATE "cluster_edit_state" +#define SIGNAL_CLUSTER_NORMAL_STATE "cluster_normal_state" +#define SIGNAL_CLUSTER_PICKUP_STATE "cluster_pickup_state" + +#define GROUP_PAGE_INDICATOR_UNIT "page_indicator_unit" +#define SIGNAL_PAGE_IDICATOR_ROTATION_CHANGE "rotation,changed" +#define SIGNAL_PAGE_IDICATOR_DEFAULT "default,set" +#define SIGNAL_PAGE_IDICATOR_CURRENT "current,set" + +#define GROUP_CLUSTER_PAGE_LY "cluster_page_ly" +#define GROUP_CLUSTER_ALLPAGE_LY "cluster_allpage_ly" +#define GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY "cluster_allpage_thumbnail_ly" +#define CLUSTER_ALLPAGE_THUMBNAIL_IMAGE "cluster_allpage_thumbnail_image" +#define CLUSTER_ALLPAGE_DELETE_BUTTON "cluster_allpage_delete_button" +#define CLUSTER_ALLPAGE_ADD_BUTTON "cluster_allpage_add_button" +#define CLUSTER_ALLPAGE_DRAG_IMAGE "cluster_allpage_drag_image" +#define SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED "allpage_delete_button_clicked" +#define SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW "allpage_delete_button_show" +#define SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE "allpage_delete_button_hide" +#define SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED "allpage_add_button_clicked" +#define SIGNAL_ALLPAGE_ADD_BUTTON_SHOW "allpage_add_button_show" +#define SIGNAL_ALLPAGE_ADD_BUTTON_HIDE "allpage_add_button_hide" +#define SIGNAL_ALLPAGE_DRAG_BG_SHOW "allpage_drag_bg_show" +#define SIGNAL_ALLPAGE_DRAG_BG_HIDE "allpage_drag_bg_hide" + +// apps view +#define GROUP_APPS_LY "apps_ly" +#define APPS_APPS_VIEW_BG "apps_view_bg" + +#define GROUP_APPS_BG_LY "apps_bg_ly" +#define GROUP_APPS_CHOOSER_BTN_LY "apps_chooser_btn_ly" + +#define APPS_CHOOSER_LEFT_LABEL "apps_chooser_left_label" +#define APPS_CHOOSER_MIDDLE_LABEL "apps_chooser_middle_label" +#define APPS_CHOOSER_RIGHT_LABEL "apps_chooser_right_label" + +#define SIGNAL_CHOOSER_BUTTON_SHOW "chooser_button_show" +#define SIGNAL_CHOOSER_BUTTON_HIDE "chooser_button_hide" + +#define ANIMATION_RESIZE_TIME 0.3 +#define SIGNAL_SET_BLACK_TEXT "set_black_text" +#define SIGNAL_EDIT_MODE_ON_ANI "edit_on_ani" +#define SIGNAL_EDIT_MODE_ON "edit_on" +#define SIGNAL_EDIT_MODE_OFF_ANI "edit_off_ani" +#define SIGNAL_EDIT_MODE_OFF "edit_off" +#define SIGNAL_CHOOSER_MODE_ON "chooser_on" +#define SIGNAL_CHOOSER_MODE_OFF "chooser_off" +#define SIGNAL_CHOOSER_LEFT_BTN_CLICKED "chooser_left_btn_clicked" +#define SIGNAL_CHOOSER_RIGHT_BTN_CLICKED "chooser_right_btn_clicked" +#define SIGNAL_CHECK_CHECK_BOX "check" +#define SIGNAL_UNCHECK_CHECK_BOX "uncheck" +#define SIGNAL_CHANGED_CHECK_BOX "changed_checkbox_state" + +#define SIGNAL_APPS_VIEW_HIDE "apps_bg_hide" +#define SIGNAL_APPS_VIEW_SHOW "apps_bg_show" +#define SIGNAL_APPS_VIEW_ANIM "apps_bg_anim" +#define APPS_VIEW_COL 4 +#define APPS_VIEW_ROW 5 + +#define APPS_VIEW_BG_OPACITY 70 + +#define GROUP_APP_ICON_LY "icon_ly" +#define APPS_ICON_CONTENT "icon_content" +#define APPS_ICON_CONTENT_TOUCH "icon_touch" +#define APPS_ICON_NAME "icon_name" +#define APPS_ICON_BADGE_TEXT "badge_text" +#define SIGNAL_ICON_DISABLE "icon_disable" +#define SIGNAL_ICON_ENABLE "icon_enable" +#define SIGNAL_BADGE_SHOW "badge_show" +#define SIGNAL_BADGE_HIDE "badge_hide" + +#define SIGNAL_ICON_CLICKED "icon_clicked" + +#define GROUP_FOLDER_ICON_LY "folder_ly" +#define SIGNAL_FRAME_POSSIBLE_SHOW "frame_possible_show" +#define SIGNAL_FRAME_IMPOSSIBLE_SHOW "frame_impossible_show" + +#define APPS_ICON_UNINSTALL_BUTTON "uninstall_btn" +#define SIGNAL_UNINSTALL_BUTTON_SHOW_ANI "uninstall_btn_show_ani" +#define SIGNAL_UNINSTALL_BUTTON_SHOW "uninstall_btn_show" +#define SIGNAL_UNINSTALL_BUTTON_HIDE_ANI "uninstall_btn_hide_ani" +#define SIGNAL_UNINSTALL_BUTTON_HIDE "uninstall_btn_hide" +#define SIGNAL_UNINSTALL_BUTTON_CLICKED "uninstall_btn_click" + +#define GROUP_APPS_FOLDER_POPUP_LY "apps_folder_popup_ly" +#define APPS_FOLDER_BG "apps_folder_bg" +#define APPS_FOLDER_COL 3 +#define APPS_FOLDER_ROW 3 +#define APPS_FOLDER_TITLE "apps_folder_title" +#define APPS_FOLDER_SEPARATOR "apps_folder_separator" +#define APPS_FOLDER_CONTAINER "apps_folder_container" +#define APPS_FOLDER_PLUS_ICON "apps_folder_plus" +#define SIGNAL_APPS_FOLDER_HIDE "apps_folder_hide" +#define SIGNAL_APPS_FOLDER_SHOW "apps_folder_show" +#define SIGNAL_APPS_FOLDER_SET_PLUS_ICON "apps_folder_set_plus_icon" +#define SIGNAL_APPS_FOLDER_HIDE_PLUS_ICON "apps_folder_hide_plus_icon" +#define SIGNAL_APPS_FOLDER_CLICKED_PLUS_ICON "apps_folder_clicked_plus_icon" + +#define GROUP_WIDGET_LY "widget_ly" +#define WIDGET_CONTENT "widget_content" +#define WIDGET_DELETE_BUTTON "widget_delete_button" +#define SIGNAL_DELETE_BUTTON_SHOW_ANI "delete_button_show_ani" +#define SIGNAL_DELETE_BUTTON_HIDE_ANI "delete_button_hide_ani" +#define SIGNAL_DELETE_BUTTON_SHOW "delete_button_show" +#define SIGNAL_DELETE_BUTTON_HIDE "delete_button_hide" +#define SIGNAL_DELETE_BUTTON_CLICKED "delete_button_clicked" + +#define ADD_WIDGET_VIEWER_CONFORMANT_FRAME "add_widget_viewer_conformant_frame" +#define ADD_WIDGET_VIEWER_CONTENT_FRAME "add_widget_viewer_content_frame" +#define ADD_WIDGET_VIEWER_PREVIEW "add_widget_viewer_preview" +#define ADD_WIDGET_VIEWER_PREVIEW_ICON "add_widget_viewer_preview_ICON" +#define SIGNAL_PREVIEW_CLICKED "preview_clicked" + +#endif /* __EDC_CONF_H__ */ diff --git a/inc/folder_panel.h b/inc/folder_panel.h deleted file mode 100644 index ab8450a..0000000 --- a/inc/folder_panel.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __FOLDER_PANEL_H__ -#define __FOLDER_PANEL_H__ - -#include -#include "homescreen-efl.h" -#include "app_item.h" -#include "dynamic_index.h" -#include "tree.h" - -typedef struct { - Eina_List *miniatures; - Evas_Object *folder_scroller; -} folder_data_t; - -typedef enum { - FOLDER_PANEL_CHECKED_NONE = 0, - FOLDER_PANEL_CHECKED_ANY, - FOLDER_PANEL_CHECKED_ALL, -} folder_checked_t; - -/** - * @brief Initializes folder module - */ -void folder_panel_init_module(void); - -/** - * @brief Frees all data initialized before. - */ -void folder_panel_deinit_module(void); - -/** - * @brief Creates folder panel. - * @param data folder parent in data model - * @return app_item_t pointer - */ -extern app_item_t *folder_panel_create(Tree_node_t *data); - -/** - * @brief Ignores folder click action if ignore is true. -*/ -extern void folder_panel_set_click_ignore_state(bool ignore); - -/** - * @brief Enables or disables folder entry editing. - * @param state the state to put folder entry in - */ -extern void folder_panel_enable_entry(bool state); - -/** - * @brief Attaches icon object to grid of currently opened folder. - * @param icon - app_item_t->layout - */ -extern Elm_Object_Item *folder_panel_attach_to_grid(Evas_Object *icon, - folder_data_t *folder_data); - -/** - * @brief Shows folder panel layout on screen - * @param folder pointer to app_item_t object - * @param keypad_show imf keyboard visibility flatg - * - * @return true if no errors. - */ -extern bool folder_panel_open_folder(app_item_t *folder, bool keypad_show); - -/** - * @brief Closes folder panel view. - */ -extern void folder_panel_close_folder(void); - -/** - * @brief Cancels appending new items into the folder by add icon press. - */ -extern void folder_panel_cancel_add_icon(void); - -/** - * @brief Returns folder visibility state - * @return true if folder is visible otherwise returns false - */ -extern bool folder_panel_is_folder_visible(void); - -/** - * @brief Shows checkboxes on the folder icon. - */ -extern folder_checked_t folder_panel_set_content_checked(Tree_node_t *node); - -/** - * @brief Function returns pointer to data node of the opened folder - * @return Tree_Node_t pointer. - */ -extern Tree_node_t *folder_panel_get_opened_folder_node(void); - -/** - * @brief Function returns pointer to app_item of opened folder - */ -extern const app_item_t *folder_panel_get_opened_folder_item(void); - -/** - * @brief Return number of items inserted into the folder. - */ -extern int folder_panel_get_items_count(Tree_node_t *folder); - -/** - * @brief Removes empty folder after reposition. - */ -extern void folder_panel_remove_empty_folder(Tree_node_t *folder); - -/** - * @brief Return folder popup geometry - * - * @param x position - * @param y position - * @param w width - * @param h height - */ -extern void folder_panel_get_folder_geometry(int *x, int *y, int *w, int *h); - -/** - * @brief Function close entry input panel connected with folder name entry - * widget - */ -extern void folder_panel_hide_input_panel(void); - -#endif /* FOLDER_PANEL_H_ */ diff --git a/inc/homescreen-efl.h b/inc/homescreen-efl.h old mode 100644 new mode 100755 index 18cf35f..2534331 --- a/inc/homescreen-efl.h +++ b/inc/homescreen-efl.h @@ -20,161 +20,27 @@ #include #include -#include -#include - -#include "conf.h" -#include "app_item.h" -#include "tree.h" - #if !defined(PACKAGE) #define PACKAGE "org.tizen.homescreen-efl" #endif - typedef enum { - HOMESCREEN_VIEW_HOME = 0, - HOMESCREEN_VIEW_HOME_EDIT, - HOMESCREEN_VIEW_HOME_ALL_PAGES, - HOMESCREEN_VIEW_HOME_ADD_VIEWER, - HOMESCREEN_VIEW_ALL_APPS, - HOMESCREEN_VIEW_ALL_APPS_EDIT, - HOMESCREEN_VIEW_ALL_APPS_CHOOSE, - HOMESCREEN_VIEW_UNKNOWN, + HOMESCREEN_VIEW_HOME = 0, + //HOMESCREEN_VIEW_HOME_EDIT, + //HOMESCREEN_VIEW_HOME_ALL_PAGES, + //HOMESCREEN_VIEW_HOME_ADD_VIEWER, + HOMESCREEN_VIEW_APPS, + //HOMESCREEN_VIEW_APPS_EDIT, + //HOMESCREEN_VIEW_APPS_CHOOSE, + HOMESCREEN_VIEW_UNKNOWN, } homescreen_view_t; +Evas_Object *homescreen_efl_get_win(void); -typedef enum { - INDICE_NEXT_PAGE_ON = 0, - INDICE_PREV_PAGE_ON, - INDICE_OFF, -} indice_type_t; - -/** - * @return returns screen width - */ -extern int home_screen_get_root_width(void); - -/** - * @return returns screen height - */ -extern int home_screen_get_root_height(void); - -/** - * @brief Returns homescreen window pointer. - * @return Evas_Object pointer to elm_win widget or NULL if falsse - */ -extern Evas_Object *home_screen_get_win(void); - -/** - * @brief Returns elm_win main layout. - * @details Function returns pointer to elm_layout widget with is a parent - * for other views used in home - * @return Evas_Object pointer to elm_layout widget - */ -extern Evas_Object *home_screen_get_layout(void); - -/** - * @brief Returns homescreen view type - * @details Possible types : - * - *HOMESCREEN_VIEW_HOME, - *HOMESCREEN_VIEW_HOME_EDIT, - *HOMESCREEN_VIEW_HOME_ALL_PAGES, - *HOMESCREEN_VIEW_ALL_APPS, - *HOMESCREEN_VIEW_ALL_APPS_EDIT, - *HOMESCREEN_VIEW_ALL_APPS_CREATE_FOLDER, - *HOMESCREEN_VIEW_UNKNOWN, - * - * @return homescreen_view_t value - */ -extern homescreen_view_t home_screen_get_view_type(void); - -/** - * @brief set homescreen view type - * @param view homescreen_view_t type - */ -extern void home_screen_set_view_type(homescreen_view_t view); - -/** - * @brief Function sets indice state - * @details During page switching left or right side of the screen should be - * highlighted. This function is repsponsible for this logic. - * - * @param indice type of performed action - */ -extern void home_screen_set_indice_state(indice_type_t indice); - -/** - * @brief Update the view after application uninstall - */ -extern void home_screen_mvc_item_uninstall_cb(Tree_node_t *item); - -/** - * @brief Update view after folder name change - */ -extern void home_screen_mvc_update_view(void); - -/** - * @brief Update view after move an item into the folder - */ -extern void home_screen_mvc_drag_item_to_folder_cb(Tree_node_t *dragged_item, - Tree_node_t *folder); - -/** - * @brief home branch test function - * @details Function for debug purpose only. Displays - * the data stored in home branch of the data model tree - */ -extern void home_screen_print_tree(void); - -/** - * @brief Function updates the view after drag an item from the folder. - */ -extern void home_screen_mvc_drag_item_from_folder_cb(void); - -/** - * @brief Multi resolution support function for texts in edje. - * - * @param layout Elm_Layout Pointer - */ -extern void home_screen_mvc_set_ly_scale(Evas_Object *layout); +void homescreen_efl_hw_menu_key_release(void); +void homescreen_efl_hw_home_key_release(void); +void homescreen_efl_hw_back_key_release(void); -/** - * @brief Close all apps choose view. - * - */ -extern void home_screen_close_all_apps_choose_view(void); - -/** - * @brief Register gesture state change callback. - * - * @details Function adds callback of type Elm_Gesture_Type - * to main homescreen gui gesture layer. - * - * @param[in] idx The gesture you want to track state of. - * @param[in] cb_type The event the callback tracks (START, MOVE, END, ABORT). - * @param[in] cb The callback itself. - * @param[in] data Custom data to be passed. - * - * @return 0 on success otherwise negative value on failure - */ -extern int home_screen_gesture_cb_set(Elm_Gesture_Type idx, Elm_Gesture_State cb_type, - Elm_Gesture_Event_Cb cb, void *data); - -/** - * @brief Unregister gesture state change callback. - * - * @details Function unregisters callback on Elm_Gesture_Type - * from main homescreen gui gesture layer. - * - * @param[in] idx The gesture you want to track state of. - * @param[in] cb_type The event the callback tracks (START, MOVE, END, ABORT). - * @param[in] cb The callback itself. - * @param[in] data Custom data to be passed. - * - * @return 0 on success otherwise negative value on failure - */ -extern int home_screen_gesture_cb_unset(Elm_Gesture_Type idx, Elm_Gesture_State cb_type, - Elm_Gesture_Event_Cb cb, void *data); +void homescreen_efl_btn_show(homescreen_view_t view_t); +void homescreen_efl_btn_hide(homescreen_view_t view_t); -#endif /* __homescreen-efl_H__ */ +#endif /* __HOMESCREEN_EFL_H__ */ diff --git a/inc/hw_key.h b/inc/hw_key.h new file mode 100755 index 0000000..7d57f67 --- /dev/null +++ b/inc/hw_key.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __HW_KEY_H__ +#define __HW_KEY_H__ + +void hw_key_register(void); +void hw_key_unregister(void); + +#endif /* __HW_KEY_H__ */ diff --git a/inc/livebox/grid_item_resize.h b/inc/livebox/grid_item_resize.h deleted file mode 100644 index 9e84cb4..0000000 --- a/inc/livebox/grid_item_resize.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRID_ITEM_RESIZE_H_ -#define GRID_ITEM_RESIZE_H_ - -#include -#include -#include - -#include "../util.h" -#include "livebox_utils.h" -#include "../conf.h" - -/** - * @brief Adds callbacks to livebox_container - * @param livebox_scroller scroller with livebox_container - * @param livebox_container Layout created with file: livebox_container.edj, - * with grid as its main part - * @return true on success - */ -extern bool grid_item_init_resize_callbacks(Evas_Object *livebox_scroller, - Evas_Object *livebox_container); - -/** - * @brief Set the resize sliders on @p page based on @p livebox geometry - */ -extern void grid_item_set_resize_livebox_sliders(Evas_Object *livebox, - Evas_Object *page); - -/** - * @brief Set the visibility of resize frame - * @param page Page containing the frame - * @param visible Visibility of the frame - */ -extern void grid_item_set_resize_sliders_visibility(Evas_Object *page, - bool visible); - -#endif /* GRID_ITEM_RESIZE_H_ */ diff --git a/inc/livebox/grid_reposition.h b/inc/livebox/grid_reposition.h deleted file mode 100644 index b090d06..0000000 --- a/inc/livebox/grid_reposition.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRID_REPOSITION_H_ -#define GRID_REPOSITION_H_ - -#include - -/** - * @brief Returns the grid that the repositioned object will be packed to - * @return origination elm_grid or NULL on error - */ -extern Evas_Object *grid_reposition_get_current_grid(void); - -/** - * @brief Returns the currently repositioned object - * @return origination elm_grid or NULL on error or if there is no - * repositioned object -*/ -extern Evas_Object *grid_reposition_get_repositioned_item(void); - -/** - * @brief Initialize the reposition process - * @details - * Function call order: - * @code - * grid_reposition_init() - * -> grid_reposition_start() -> grid_reposition_move() -> grid_reposition_end() - * @endcode - * - * grid_reposition_move() should be called on mouse move - * - * @param grid - * @param repositioned_item - */ -extern void grid_reposition_init(Evas_Object *grid, Evas_Object - *repositioned_item); - -/** - * @brief Start the reposition process - * @details Check the grid_reposition_init() function - * - */ -extern void grid_reposition_start(void); - -/** - * @brief Move the repositioned object - * @details Check the grid_reposition_init() function - * @param mouse_x - * @param mouse_y - */ -extern void grid_reposition_move(int mouse_x, int mouse_y); - -/** - * @brief End the reposition object - * @details Check the grid_reposition_init() function - */ -extern void grid_reposition_end(void); - -/** - * @brief Sets the grid that the repostioned object will be dropped to - * @param grid must be elm_grid - */ -extern void grid_reposition_set_current_grid(Evas_Object *grid); - -#endif /* GRID_REPOSITION_H_ */ diff --git a/inc/livebox/livebox_animator.h b/inc/livebox/livebox_animator.h deleted file mode 100644 index c2a358a..0000000 --- a/inc/livebox/livebox_animator.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef LIVEBOX_ANIMATOR_H_ -#define LIVEBOX_ANIMATOR_H_ - -struct _Anim_Data; - -typedef void (*Anim_Grid_End)(struct _Anim_Data **ad); - -typedef struct _Anim_Data { - double anim_time; - Evas_Object *obj; - Ecore_Pos_Map map; - double map_var_1; - double map_var_2; - Eina_Rectangle *geometry_start; - Eina_Rectangle *geometry_end; - Anim_Grid_End on_end; - Ecore_Animator *animator; - bool anim_is_running; -} Anim_Data_t; - -/** - * @brief Delete an animator - * @param ad Animator to delete - */ -extern void livebox_animator_del_grid(Anim_Data_t **ad); - -/** - * @brief creates a grid animator and starts it - * @details Animator will be performed on grid item. It works by packing - * an item to grid's virtual resolution. - * Notice that the animated item has to be packed to a grid before the - * animation starts - * @param obj object to animate - * @param anim_time animation time - * @param map animator mapping method - * @param map_var_1 value used by map - * @param map_var_2 value used by map - * @param geometry_start animator start position - * @param geometry_end animator end position - * @param on_end callback called on end of animation - * @param ad_out created animator object - */ -extern void livebox_animator_play_grid_pack_set(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out); - -/** - * @brief creates a geometry animator and starts it - * @details object position and size will be animated - * @param obj object ot animate - * @param anim_time animation time - * @param map animator mapping method - * @param map_var_1 value used by map - * @param map_var_2 value used by map - * @param geometry_start animator start position - * @param geometry_end animator end position - * @param on_end callback called on end of animation - * @param ad_out created animator object - */ -extern void livebox_animator_play_geometry_set(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out); - -#endif /* LIVEBOX_ANIMATOR_H_ */ diff --git a/inc/livebox/livebox_panel.h b/inc/livebox/livebox_panel.h deleted file mode 100644 index dd7a92a..0000000 --- a/inc/livebox/livebox_panel.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LIVEBOX_PANEL_H__ -#define __LIVEBOX_PANEL_H__ - -#include -#include "tree.h" - -/** - * @brief creates main livebox view - * @details Creates the livebox scroller and adds pages with liveboxes to it - * @param parent Layout where the livebox panel will be added - * @return Created livebox view or NULL on error - */ -extern Evas_Object *livebox_panel_create(Evas_Object *parent); - -/** - * @brief [brief description] - * @details [long description] - */ -extern void livebox_panel_fill(void); - -/** - * - */ -void livebox_panel_update_dynamic_index(void); - - -/** - * @brief Creates dynamic index for livebox panel - */ -extern void livebox_panel_create_dynamic_index(void); - -/** - * @brief Sets livebox panel and its dynamic index to layout - * @note @p layout has to have "content" and "index" parts - * @param layout layout to add widgets to - */ -extern void livebox_panel_set_content(Evas_Object *layout); - -/** - * @brief Unsets livebox panel and its dynamic index from layout - * @note @p layout has to have "content" and "index" parts - * @param layout layout to remove widgets from - */ -extern void livebox_panel_unset_content(Evas_Object *layout); - -/** - * @brief Create empty livebox scroller - * @return The created scroller or null on error - */ -extern Evas_Object *livebox_panel_create_scroller(void); - -/** - * @brief destroys the livebox scroller and all of it pages - */ -extern void livebox_panel_destroy(void); - -/** - * Adds new livebox to @p page - * @param node widget representation in data structure - * @param page Page where livebox will be added - * @param livebox_pkgname livebo pkgname - * @param pos_x position in grid - * @param pos_y position in grid - * @param width width of livebox in grid - * @param height height of livebox in grid - */ -void livebox_panel_add_livebox(Tree_node_t *node, Evas_Object *page, - const char *livebox_pkgname, int pos_x, int pos_y, - int width, int height, - char *content_info); - -/** - * @brief Creates new livebox page - * @param node page representation in data structure - * @param livebox_scroller - * @return new empty page - */ -extern Evas_Object *livebox_panel_add_page(Tree_node_t *node, - Evas_Object *livebox_scroller); - -/** - * @brief adds an empty page (page layout is described in @p - * livebox_container.edc to the @p livebox_scroller - * @param livebox_scroller Scroller to which thepage is added - * @return TRUE on success FALSE otherwise - */ -extern bool livebox_panel_add_empty_page(Evas_Object *livebox_scroller); - -/** - * @brief Creates an empty page but doesn't add it to the scoller - * @param node page node in the data model - * @param livebox_scroller Scroller to which the page can be appended - * @return - */ -extern Evas_Object *livebox_panel_create_empty_page(Tree_node_t *node, - Evas_Object *livebox_scroller); - -/** - * @brief Changes the view mode of the livebox page - * @param turn_on True - edit mode on False - edit mode off - */ -extern void livebox_panel_set_edit_mode_layout(bool turn_on); - -/** - * @brief Changes the view mode of the livebox scroller - * @param close True - edit mode off False - edit mode on - */ -extern void livebox_panel_change_edit_mode_state(bool close); - -/** - * @brief Destroys given livebox page and all its content - * @param livebox_scroller_page page to destroy - */ -extern void livebox_panel_destroy_page(Evas_Object *livebox_scroller_page); - -/** - * @brief Function sets the reposition data - * @param x mouse position x - * @param y mouse position y - */ -extern void livebox_panel_move_mouse_cb(int x, int y); - -/** - * @brief sets the pages geometry based on scroller geometry that consits them - */ -extern void livebox_panel_refresh_content_size(void); - -/** - * @brief Returns list of all pages in livebox panel - * @return Eina_List pointer of all livebox pages - */ -extern Eina_List *livebox_panel_get_pages(void); - -/** - * @brief Gets the livebox dynamic index - * @return Pointer to dynamic index box - */ -extern Evas_Object *livebox_panel_get_index(void); - -/** - * @brief Gets the livebox panel elm_scroller widget - * @return Pointer to elm_scroller with livebox pages - */ -extern Evas_Object *livebox_panel_get(void); - -/** - * @brief Function return true if add page is visible. - */ -extern bool livebox_panel_check_if_add_page_is_visible(void); - -/** - * @brief hide and shows add page button - * @param visible true - show false -hide - */ -void livebox_panel_add_page_visible_state_set(bool visible); - -/** - * @brief Returns true if 'add_page' is the curently selected livebox page - */ -extern bool livebox_panel_is_add_page_selected(void); - -/** - * Gets the current livebox page - * @return Current scroller page - */ -extern Evas_Object *livebox_scroller_get_page(void); - -/** - * Returns the last page of the livebox_scroller - * @return last page or NULL on error - */ -Evas_Object *livebox_scroller_get_last_page(void); - -/** - * Check if a new widget page can be added. Shows a popup if not - * @return true if page can be added, false if not - */ -extern bool livebox_panel_can_add_page(void); - -/** - * Looks for empty space to put new widget to - * - * @param span_w widget size - * @param span_h widget height - * @param pos_x position to put new widget - * @param pos_y position to put new widget - * @return Index of page where new widget can be placed - */ -extern int livebox_panel_find_empty_space(int span_w, int span_h, - int *pos_x, int *pos_y); - -/** - */ -extern void livebox_panel_resumed(void); - -/** - */ -extern void livebox_panel_paused(void); - -#endif diff --git a/inc/livebox/livebox_utils.h b/inc/livebox/livebox_utils.h deleted file mode 100644 index 25eae56..0000000 --- a/inc/livebox/livebox_utils.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef UTILS_H_ -#define UTILS_H_ - -#include - -#include "../util.h" -#include "../conf.h" - -/** - * @brief Check interection between @p rect and list items bounding - * Eina_Rectangles - * @details Check interection between @p rect and list items bounding - * Eina_Rectangle. - * If current list item == @p obj the intersection check won't be performed. - * By standard the @p rect is the @p obj bounding rectangle. - * So this helps to avoid interesction check with obj itself - * @param rect rectangle - * @param obj filter object. Can be NULL - * @param list of objects - * @return TRUE if intersection was found ELSE otherwise - */ -extern bool livebox_utils_check_rect_list_grid_interesction( - Eina_Rectangle *rect, Evas_Object *obj, Eina_List *list); - -/** - * @brief Returns the list of liveboxes on grid - * @details Function returns liveboxes put on @p grid but but without the - * @a shadow object - * @param grid - * @return list of liveboxes. Has to be freed - */ -extern Eina_List *livebox_utils_get_liveboxes_on_gird(Evas_Object *grid); - -/** - * @brief Returns the list of liveboxes on page - * @details Page is a layout described by "livebox_container.edc" Which - * contains a elm_grid object. All objects in the grid are returned. - * @param obj livebox page - * @return list of liveboxes. Has to be freed - */ -extern Eina_List *livebox_utils_get_liveboxes_on_page_list(Evas_Object *obj); - - -/** - * @brief Returns the livebox container that contains the selected livebox - * @return Livebox container - */ -extern Evas_Object *livebox_utils_get_selected_livebox_layout(void); - -/** - * @brief Returns the that previously contained the selected livebox. - * Used when livebox in repositioned to different container - * @return Livebox container - */ -extern Evas_Object *livebox_utils_get_prev_livebox_layout(void); - -/** - * @brief Returns the selected livebox - * @return selected livebox - */ -extern Evas_Object *livebox_utils_selected_livebox_get(void); - -/** - * @brief Sets the selected livebox - * @note Use this when livebox is selected - * @param livebox Selected livebox - * @param layout livbox container holding the selected livebox - */ -extern void livebox_utils_set_selected_livebox(Evas_Object *livebox, - Evas_Object *layout); - -/** - * @brief Crate the shadow visible when a object is repositioned - * @param parent Shadow parent - */ -extern void livebox_utils_create_shadow(Evas_Object *parent); - -/** - * @brief Pack the shadow object to given container based on livebox position - * @note Used in reposition - * @param livebox item repositioned using drag&drop - * @param page container where the shadow will be packed - */ -extern void livebox_utils_set_shadow_pack(Evas_Object *livebox, - Evas_Object *page); - -/** - * @brief Shadow is repacked from one livebox_container to different one - * @details Shadow object is unpacked from its current grid and packed to grid - * in page_to livebox_container - * @param livebox livebox item repositioned using drag&drop - * @param page_to livebo_container where the shadow will be packed - */ -extern void livebox_utils_repack_shadow(Evas_Object *livebox, - Evas_Object *page_to); - -/** - * @brief Sets the visiblity of the shadow object - * @param visible TRUE shadow will be visible - */ -extern void livebox_utils_set_shadow_visibility(bool visible); - -/** - * @brief Creates the clipper for the shadow object - * @details The clipper is added to the @p livebox_container and is clipped - * by the shadow object. - * This way only the part of the clipper will be visible where the repositioned - * livebox can be dropped - * @param livebox_container Layout containing the clipper - */ -extern void livebox_utils_create_grid_shadow_clipper(Evas_Object* - livebox_container); - -/** - * @brief Returns position fitting given grid - * @details The input parameteters should be given in virtual coordinates of - * a grid. If the item coordinates don't fit the grid they will be modified - * properly. - * @code - * if(obj_x < 0) - * { - * *out_x = 0; - * } - * - * if obj_x + obj_w > grid_width - * { - * *out_x = grid_width - obj_w - * } - * @endcode - * - * @param[in] obj_x - * @param[in] obj_y - * @param[in] obj_w - * @param[in] obj_h - * @param[out] out_x - * @param[out] out_y - */ -extern void livebox_utils_normalize_grid_pos(int obj_x, int obj_y, int obj_w, - int obj_h, int *out_x, int *out_y); - -/** - * @brief Returns the grid put into the @p container widget - * @param container The container wodth grid - * @return Grid object or NULL on error - */ -extern Evas_Object *livebox_utils_get_livebox_container_grid(Evas_Object *container); - -/** - * @brief Returns the shadow object - * @return shadow object - */ -extern Evas_Object *livebox_utils_get_shadow(void); - -/** - * @brief unpacks the grid object from the grid its currently packed to - */ -extern void livebox_utils_shadow_unpack(void); - -/** - * @brief Transforms the @p livebox geometry to @p grid virtual coordinates - * @param[in] livebox object to read the geometry from - * @param[in] grid elm_grid which virtual coordinates will be used - * @param[out] out_x @p livebox transformed horizontal position - * @param[out] out_y @p livebox transformed vertical position - * @param[out] out_w @p livebox transformed width - * @param[out] out_h @p livebox transformed height - */ -extern void livebox_utils_convert_size_to_grid_coord(Evas_Object *livebox, - Evas_Object *grid, int *out_x, int *out_y, int *out_w, int *out_h); - -/** - * @brief Sets the packing of @p item_to_pack to the @p grid - * @details The @p livebox object is used to determine the position of @p - * item_to_pack in the @p grid. - * Note that the @p item_to_pack has to be packet in the gird allready - * @param livebox Position of this object will be used to determine the - * position of @p item_to_pack in the @p grid - * @param item_to_pack Object to be packed to the @p grid - * @param grid The grid object. Must be elm_grid - */ -extern void livebox_utils_set_grid_object_pack(Evas_Object *livebox, - Evas_Object *item_to_pack, Evas_Object *grid); - -/** - * @brief Repacks @p item_to_pack from @p grid_from to @p grid_to - * @details The @p livebox object is used to determine the position of @p - * item_to_pack in the @p grid_to. - * The item_to_pack will be unpacked from @p grid_from and @p packed to @p - * grid_to - * - * @param livebox ivebox Position of this object will be used to determine - * the position of @p item_to_pack in the @p grid_to - * @param item_to_pack Repacked item - * @param grid_from Source grid - * @param grid_to D Destination grid - */ -extern void livebox_utils_repack_grid_object(Evas_Object *livebox, - Evas_Object *item_to_pack, Evas_Object *grid_from, - Evas_Object *grid_to); - -/** - * @brief Transforms virtual @ grid virtual coordinates to screen coordinates - * @param grid elm_grid - * @param x Horizontal position in @p grid - * @param y Vertical position in @p grid - * @param w Width in @p grid - * @param h Height in @p grid - * @return Eina_Rectangle containing the postion transformed - * to screen coordinates - */ -extern Eina_Rectangle *livebox_utils_convert_virtual_grid_geo_to_screen( - Evas_Object *grid, int x, int y, int w, int h); - -/** - * @brief Returns the bounding rectangle of the @p obj object - * @details Bounding rectangle contains (x position, y position, width, height) - * of the @p obj - * @param obj to get the bounding rectangle from - * @return Bounding rectangle - */ -extern Eina_Rectangle *livebox_utils_get_widget_rectangle(Evas_Object *obj); - -/** - * @brief Returns the bounding rectangle of the @p obj object in grid virtual - * coordinates - * @details Bounding rectangle contains (x position, y position, width, height) - * of the @p obj. - * @p Obj has to be packed into a grid. - * @param obj to get the bounding rectangle from - * @return Bounding rectangle - */ -extern Eina_Rectangle *livebox_utils_get_grid_widget_rectangle( - Evas_Object *obj); - -/** - * @brief get the current cursor position - * @param mx position x - * @param my position y - */ -extern void livebox_utils_get_cursor_pos(int *mx, int *my); - - -#endif /* UTILS_H_ */ diff --git a/inc/livebox/livebox_widget.h b/inc/livebox/livebox_widget.h deleted file mode 100644 index 2c346a6..0000000 --- a/inc/livebox/livebox_widget.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef LIVEBOX_WIDGET_H_ -#define LIVEBOX_WIDGET_H_ - -#include -#include - -typedef struct { - char *pkg_id; - char *widget_id; - int is_prime; - int width; - int height; -} widget_info_t; - -/** - * @brief Initializes the widget module. - */ -extern void livebox_widget_init(void); - -/** - * @brief Frees all data initialized for widget module. - */ -extern void livebox_widget_fini(void); - -/** - * @brief Gets the widgets list from the widget service - * @return Eina_List pointer - */ -extern Eina_List *livebox_widget_get_list(void); - -/** - * @brief Cretes new widget and add it to the parent. - * - * @param pkg_name char pointer to package name of the widget - * @param parent pointer to parent Evas_Object - * @param content info - * - * @return pointer to created widget's Evas_Object - */ -extern Evas_Object *livebox_widget_add(const char *pkg_name, Evas_Object *parent, char *content_info); - -/** - * @brief Removes the widget and its data. - * - * @param Widget's Evas_Object pointer. - */ -extern void livebox_widget_del(Evas_Object *widget); - -/** - * @brief Gets the widget size. - * - * @param size type - * @param x - x size in pixels. - * @param y - y size in pixels. - */ -extern void livebox_widget_get_dimensions(int size, int *x, int *y); - -/** - * @brief Gets the available sizes of the widget - * @param widget Evas_Object pointer to the widget object. - * @param cnt number of available widget sizes - * @param size_list sizes list. - */ -extern void livebox_widget_get_size_available(Evas_Object *widget, int *cnt, int **size_list); - - -/** - * @brief Blocks the mouse_up event for given widget - * @param widget widget to block events for - */ -extern void livebox_widget_set_event_blocking(Evas_Object *widget); - -/** - */ -extern void livebox_widget_viewer_paused(void); - -/** - */ -extern void livebox_widget_viewer_resumed(void); - -#endif /* LIVEBOX_WIDGET_H_ */ diff --git a/inc/livebox_all_pages.h b/inc/livebox_all_pages.h deleted file mode 100644 index c8fd5b6..0000000 --- a/inc/livebox_all_pages.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef LIVEBOX_ALL_PAGES_H_ -#define LIVEBOX_ALL_PAGES_H_ - -#include -#include - -/** - * @brief Shows all pages panel - * @return Pointer to all_pages layout - */ -extern Evas_Object *livebox_all_pages_show(void); - -/** - * @brief Hides all pages layout - * @param page_index if this value is bigger than 0 it closes the all pages view and sets page index as current home page - */ -extern void livebox_all_pages_hide(void); - -/** - * @brief Check if page at index is an add_page - * @param index page index - * @return true if given index indicates add page - */ -extern bool livebox_all_pages_is_add_icon_page(int index); - -/** - * @brief Function used for moves page thumb during reposition. - * @param x int value of x mouse position - * @param y int value of y mouse position - */ -extern void livebox_all_pages_move_item(int x, int y); - -/** - * @brief Set item to proper position - * - */ -extern void livebox_all_pages_up_item(void); - - - -#endif /* LIVEBOX_ALL_PAGES_H_ */ diff --git a/inc/menu.h b/inc/menu.h new file mode 100755 index 0000000..2394da4 --- /dev/null +++ b/inc/menu.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MENU_H__ +#define __MENU_H__ + +#include +#include + +typedef enum { + MENU_DEFAULT = -1, + MENU_CLUSTER_EDIT = 0, + MENU_CLUSTER_ADD_WIDGET, + MENU_CLUSTER_CHANGE_WALLPAPER, + MENU_CLUSTER_ALL_PAGES, + MENU_APPS_EDIT, + MENU_APPS_CREATE_FOLDER, + MENU_MAX +} menu_item_t; + +void menu_show(Eina_Hash* hash_table); +void menu_hide(void); +bool menu_is_show(void); +void menu_change_state_on_hw_menu_key(Eina_Hash* hash_table); + +#endif /* __MENU_H__ */ diff --git a/inc/mouse.h b/inc/mouse.h old mode 100644 new mode 100755 index d792ce1..9146c3f --- a/inc/mouse.h +++ b/inc/mouse.h @@ -14,23 +14,23 @@ * limitations under the License. */ -#ifndef MOUSE_H_ -#define MOUSE_H_ - -#include - -#include "util.h" - -/** - * @brief Registers all mouse related callbacks. - */ -extern void mouse_register(void); - -/** - * @brief Unregisters all mouse related callbacks. - */ -extern void mouse_unregister(void); - - - -#endif /* MOUSE_H_ */ +#ifndef __MOUSE_H__ +#define __MOUSE_H__ + +#define MOUSE_MOVE_MIN_DISTANCE 100 + +typedef struct { + bool pressed; + bool long_pressed; + Evas_Coord down_x; + Evas_Coord down_y; + Evas_Coord move_x; + Evas_Coord move_y; + Evas_Coord up_x; + Evas_Coord up_y; + int offset_x; + int offset_y; + Ecore_Timer *long_press_timer; +} mouse_info_t; + +#endif /* __MOUSE_H__ */ diff --git a/inc/page_indicator.h b/inc/page_indicator.h new file mode 100755 index 0000000..fcbdaa4 --- /dev/null +++ b/inc/page_indicator.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PAGE_INDICATOR_H__ +#define __PAGE_INDICATOR_H__ + +#include +#include + +#define PAGE_INDICATOR_MAX_PAGE_COUNT 7 + +typedef struct { + Evas_Object *scroller; + Evas_Object *box; + Evas_Object *unit[PAGE_INDICATOR_MAX_PAGE_COUNT]; + + int page_count; + int x; + int y; + int w; + int h; + int current_page; +} page_indicator_t; + +page_indicator_t * page_indictor_create(Evas_Object *scroller); +void page_indicator_set_page_count(page_indicator_t *page_indicator, int count); +void page_indicator_scroller_resize(page_indicator_t *page_indicator, int width, int height); +void page_indicator_set_current_page(page_indicator_t *page_indicator, int page_number); +void page_indicator_show(page_indicator_t *page_indicator); +void page_indicator_hide(page_indicator_t *page_indicator); + +#endif /* __PAGE_INDICATOR_H__ */ diff --git a/inc/page_scroller.h b/inc/page_scroller.h deleted file mode 100644 index 8a56298..0000000 --- a/inc/page_scroller.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef PAGE_SCROLLER_H_ -#define PAGE_SCROLLER_H_ - - -#include -#include -#include - -/** - * @brief Creates new elm_scroller widget and sets standart parameters used in - * homescreen application. - * @param page_width page width. - * @param page_height page height. - * - * @return Pointer to created elm_scroller widget/ - */ -extern Evas_Object *page_scroller_create(int page_width, int page_height); - -/** - * @brief Removes all data connected with the page scroller object. - * - * @param page_scroller Page scroller pointer. - */ -extern void page_scroller_destroy(Evas_Object *page_scroller); - -/** - * @brief Add new page to the page scroller - * - * @param page_scroller Page scroller Evas_Object pointer. - * @param page Page Evas_Object pointer. - * - * @return true if no errors. - */ -extern bool page_scroller_add_page(Evas_Object *page_scroller, - Evas_Object *page); - -/** - * @brief Removes the page from the page scroller. - * @param page_scroller Page scroller object pointer. - * @param page Page which will be removed. - */ -extern void page_scroller_remove_page(Evas_Object *page_scroller, - Evas_Object *page); - -/** - * @brief Gets the page from the given page scroller. - * @param page_scroller Pointer to elm_scroller widget. - * @param n page number. - * - * @return Page Evas_Object pointer. - */ -extern Evas_Object *page_scroller_get_page(Evas_Object *page_scroller, int n); - -/** - * @brief Gets all pages inserted in the page scroller list. - * @param page_scroller Pointer to page scroller Evas_Object - * @return List of all pages. - */ -extern Eina_List *page_scroller_get_all_pages(Evas_Object *page_scroller); - -/** - * @brief Blocks page scroller movement. - * - * @param page_scroller Pointer to page scroller widget. - * @return true if no errors. - */ -extern bool page_scroller_freeze(Evas_Object *page_scroller); - -/** - * @brief Unblocks page scroller movement. - * - * @param page_scroller Pointer to page scroller Evas_Object. - * @return true if no errors. - */ -extern bool page_scroller_unfreeze(Evas_Object *page_scroller); - -/** - * @brief Returns elm_scroller pointer from page scroller layout. - * - * @param page_scroller Page scroller Evas_Object pointer. - * @return elm_scroller pointer or NULL if errors occurred. - */ -extern Evas_Object *page_scroller_get_scroller(Evas_Object *page_scroller); - -/** - * @brief Unpack all pages from the page scroller widget. - * @param page_scroller Page scroller Evas_Object. - * @return List of all pages (Evas_Objects) - */ -extern Eina_List *page_scroller_unpack_pages(Evas_Object *page_scroller); - -/** - * @brief Pack all pages into the page scroller widget. - * - * @param page_scroller Pointer to page scroller widget. - * @param page_list List of pages to pack. - */ -extern void page_scroller_pack_pages(Evas_Object *page_scroller, - Eina_List *page_list); - -/** - * @brief Gets page thumbnail (proxy object) - * - * @param page Pointer to page scroller page. - * @param int width of miniature - * @param int height of miniature - * @return Page copy (miniature) or NULL if errors occurred. - */ -extern Evas_Object *page_scroller_get_page_thumbnail(Evas_Object *page, - unsigned int w, unsigned int h); - -/** - * @brief Gets the elm_box pointer from the Page_Scroller Evas_Object. - * - * @param page_scroller Pointer to Page Scroller Evas_Object - * @return elm_box pointer placed in the Page scroller widget. - */ -extern Evas_Object *page_scroller_obtain_box(Evas_Object *page_scroller); - -/** - * @brief Get total number of pages - * @param page_scroller Elm_scroller pointer - * @return pages count if ok, -1 if error - */ - -extern int page_scroller_get_page_count(Evas_Object *page_scroller); -/** - * @brief Get current page - * @return current page number or -1 if something went wrong - */ -extern int page_scroller_get_current_page(Evas_Object *page_scroller); - -/** - * @brief Set current page of the scroller - * @param page_scroller Pointer to elm_scroller - * @param idx index of page - * @return true if success - */ -extern bool page_scroller_set_current_page(Evas_Object *page_scroller, int idx); - -/** - * @brief Shows page without animation - * - * @param page_scroller elm_scroller_pointer - * @param idx page index - */ -void page_scroller_show_page(Evas_Object *page_scroller, int idx); -#endif /* PAGE_SCROLLER_H_ */ diff --git a/inc/popup.h b/inc/popup.h old mode 100644 new mode 100755 index bb0c83d..1b37328 --- a/inc/popup.h +++ b/inc/popup.h @@ -14,63 +14,18 @@ * limitations under the License. */ -#ifndef POPUP_H_ -#define POPUP_H_ - -#include - -#include "app_icon.h" - -typedef enum { - ORDER_MANUALLY = 0, - ORDER_ALPHABETICAL = 1 -} order_mode_t; +#ifndef __POPUP_H__ +#define __POPUP_H__ typedef enum { - POPUP_TWO_BUTTONS, - POPUP_INFO, -} popup_type_t; + POPUP_DEFAULT = -1, + POPUP_CLUSTER_PAGE_FULL = 0, + POPUP_CLUSTER_DELETE_PAGE, + POPUP_MAX +} popup_t; -typedef struct { - popup_type_t type; - char *popup_title_text; - char *popup_content_text; - char *popup_confirm_text; - char *popup_cancel_text; - Elm_Popup_Orient orientation; - double visible_time; -} popup_data_t; - -typedef void (*popup_confirm_cb)(void *data); -typedef void (*popup_cancel_cb)(void *data); - -/** - * @brief Allocates a structure for initialze popup widet - * @return Pointer to popup data. It must be freed manually. - */ -popup_data_t *popup_create_data(void); - -/** - * @brief Frees p_data structure memory and its members - * @return - */ -void popup_data_free(popup_data_t *p_data); - -/** - * @brief Function shows popup window on the screen - * @param data popup_data_t struct which is used for initialize popup with - * its content. - *popup_confirm_cb - function called when confirm button will be clicked. - * popup_cancel_cb - function called when cancel button will be clicked. - * cb_data - data used in callback functions. - */ -void popup_show(popup_data_t *data, popup_confirm_cb confirm_cb, - popup_cancel_cb cancel_cb, void *cb_data); - -/** - * @brief Hide popup and remove all data - * @returns EINA_TRUE if popup is visible otherwise EINA_FALSE - */ -Eina_Bool popup_destroy(void); +void popup_show(popup_t type, int btn_count, Evas_Smart_Cb btn_func[3], void *func_data[3]); +void popup_hide(void); +bool popup_is_show(void); -#endif /* POPUP_H_ */ +#endif /* __POPUP_H__ */ diff --git a/inc/tree.h b/inc/tree.h deleted file mode 100644 index d39648b..0000000 --- a/inc/tree.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _TREE_H_ -#define _TREE_H_ - -#include -#include "app_item.h" - -#define TREE_NODE_FOREACH(parent, node) \ -for (node = parent->first; node != NULL; node = node->next) - -/* - * data - data bind to node - * parent - parent node - * next - next sibling - * prev - previous sibling - * first - first child - * last - last child - */ -typedef struct _tree_node { - app_item_t *data; - struct _tree_node *parent; - - unsigned int count; - struct _tree_node *next; - struct _tree_node *prev; - - struct _tree_node *first; - struct _tree_node *last; -} Tree_node_t; - - -/* - * @brief signature of callback function for tree_in_depth_browse() function - */ -typedef bool(*tree_browse_cb_t)(Tree_node_t*, Tree_node_t*, void*); - - -/* - * @brief Creates new tree node - * @details All node fields are initialized with \0 - */ -bool tree_node_new(Tree_node_t **node); - -/* - * @brief Detatch node - */ -bool tree_node_detatch(Tree_node_t *node); - -/* - * @brief Append child node to parent node - */ -bool tree_node_append(Tree_node_t *parent, Tree_node_t *node); - -/* - * @brief Append node to tree after relative node - */ -bool tree_node_append_relative(Tree_node_t *node, Tree_node_t *relative); - -/* - * @brief Prepend child node to parent node - */ -bool tree_node_prepend(Tree_node_t *parent, Tree_node_t *node); - -/* - * @brief Prepend node to tree before relative node - */ -bool tree_node_prepend_relative(Tree_node_t *node, Tree_node_t *relative); - -/* - * @brief Browse the tree in-depth - */ -bool tree_in_depth_browse(Tree_node_t *node, tree_browse_cb_t func_cb, - void *data); - -/* - * Updates a node with new values - */ -void tree_node_update(Tree_node_t *node); - -/* - * @brief frees memory of a single node in a safe manner. Returns count and - * pointers to children of the node. - * Updates nodes parent and siblings. Nodes children become - * detached from the tree. - * @param node[IN] - node to free - * @param first_child - nodes first child - * @param last_child - nodes last child - * @param child_count - nodes children count - */ -void tree_node_free(Tree_node_t *node, Tree_node_t **first_child, - Tree_node_t **last_child, int *child_count); - -#endif diff --git a/inc/util.h b/inc/util.h old mode 100644 new mode 100755 index 1b2f620..25828ec --- a/inc/util.h +++ b/inc/util.h @@ -14,90 +14,31 @@ * limitations under the License. */ -#ifndef __HOME_SCREEN_UTIL_H__ -#define __HOME_SCREEN_UTIL_H__ +#ifndef __UTIL_H__ +#define __UTIL_H__ #include -#include -#include + +#ifndef __MODULE__ +#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#endif #ifdef LOG_TAG #undef LOG_TAG #endif #define LOG_TAG "HOMESCREEN_EFL" -#define BUF_SIZE 64 - -/* Multi-language */ -#ifndef _ -#define _(str) gettext(str) -#endif - -/* Build */ -#define HAPI __attribute__((visibility("hidden"))) -#define DAPI __attribute__((visibility("default"))) - -#define COUNT_OF(x) \ -((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) - -#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) - -#if !defined(LOGD) -#define LOGD(fmt, arg...) dlog_print(DLOG_DEBUG, LOG_TAG, "%s: %s[%d]\t " #fmt "\n", __FILENAME__, __func__, __LINE__, ##arg) -#endif - -#if !defined(LOGW) -#define LOGW(fmt, arg...) dlog_print(DLOG_WARN, LOG_TAG, "%s: %s[%d]\t " #fmt "\n", __FILENAME__, __func__, __LINE__, ##arg) -#endif - -#if !defined(LOGE) -#define LOGE(fmt, arg...) dlog_print(DLOG_ERROR, LOG_TAG, "%s: %s[%d]\t " #fmt "\n", __FILENAME__, __func__, __LINE__, ##arg) -#endif - -#if !defined(LOGI) -#define LOGI(fmt, arg...) dlog_print(DLOG_ERROR, LOG_TAG, "%s: %s[%d]\t " #fmt "\n", __FILENAME__, __func__, __LINE__, ##arg) -#endif - -/** - * @brief Creates elm_layout widget and load edje file to it. - * - * @param win Homescreen efl window pointer. - * @param edje_filename name of the edje file - * @param edje_group group name from the edje file - * @return elm_layout Evas_Object pointer. - */ -extern Evas_Object *util_create_edje_layout( - Evas_Object *win, const char* edje_filename, const char* edje_group); - -/*DBG callbacks set. Please use it if new objects are not visible .etc*/ -extern void tst_resize_cb(void *data, Evas *e, Evas_Object *obj, void *ei); -extern void tst_show_cb(void *data, Evas *e, Evas_Object *obj, void *ei); -extern void tst_hide_cb(void *data, Evas *e, Evas_Object *obj, void *ei); -extern void tst_move_cb(void *data, Evas *e, Evas_Object *obj, void *ei); -extern void tst_del_cb(void *data, Evas *e, Evas_Object *obj, void *ei); +#define LOG_(prio, tag, fmt, arg...) \ + ({ do { \ + dlog_print(prio, tag, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg);\ + } while (0); }) +#define LOGD(format, arg...) LOG_(DLOG_DEBUG, LOG_TAG, format, ##arg) +#define LOGI(format, arg...) LOG_(DLOG_INFO, LOG_TAG, format, ##arg) +#define LOGW(format, arg...) LOG_(DLOG_WARN, LOG_TAG, format, ##arg) +#define LOGE(format, arg...) LOG_(DLOG_ERROR, LOG_TAG, format, ##arg) +#define LOGF(format, arg...) LOG_(DLOG_FATAL, LOG_TAG, format, ##arg) - -/** - * @brief Function returns Eina list of evas objects visible in gengrid - * - * @param gengrid Evas_Object pointer to elm_gengrid - * @return Eina_List pointer which Evas_Objects - */ -extern Eina_List *elm_gengrid_get_evas_objects_from_items(Evas_Object *gengrid); - -/** - * @brief Function returns pointer to elm_object_item placed in gengrid - * at specified position - * @param gengrid Pointer to elm_gengrid_widget; - * @param idx - * @return Pointer to elm_object_item - */ -Elm_Object_Item *elm_gengrid_get_item_at_index(Evas_Object *gengrid, int idx); - -/* - * @brief Application sub-directories type. - */ enum app_subdir { APP_DIR_DATA, APP_DIR_CACHE, @@ -110,19 +51,8 @@ enum app_subdir { APP_DIR_EXTERNAL_SHARED_DATA, }; -/** - * @brief Returns absolute path to resource file located in applications directory. - * - * @param subdir type of subdirectory - * @param relative path of resource from starting from "data" dir. - * eg. for DATA_DIR subdir and relative "database.db" => "/home/owner/apps/org.tizen.homescreen-efl/data/database.db" - * @return absolute path string. - */ const char *util_get_file_path(enum app_subdir dir, const char *relative); -/** - * @brief Convinience macros - */ #define util_get_data_file_path(x) util_get_file_path(APP_DIR_DATA, (x)) #define util_get_cache_file_path(x) util_get_file_path(APP_DIR_CACHE, (x)) #define util_get_res_file_path(x) util_get_file_path(APP_DIR_RESOURCE, (x)) @@ -133,4 +63,4 @@ const char *util_get_file_path(enum app_subdir dir, const char *relative); #define util_get_external_cache_file_path(x) util_get_file_path(APP_DIR_EXTERNAL_CACHE, (x)) #define util_get_external_shared_data_file_path(x) util_get_file_path(APP_DIR_EXTERNAL_SHARED_DATA, (x)) -#endif /* __HOME_SCREEN_UTIL_H__ */ +#endif /* __UTIL_H__ */ diff --git a/inc/view.h b/inc/view.h new file mode 100755 index 0000000..b73b612 --- /dev/null +++ b/inc/view.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_H__ +#define __VIEW_H__ + +typedef enum { + VIEW_STATE_NORMAL = 0, + VIEW_STATE_EDIT, + VIEW_STATE_CHOOSER, + VIEW_STATE_ADD_VIEWER, + VIEW_STATE_ALL_PAGE, + VIEW_STATE_UNKNOWN, +} view_state_t; + +#endif /* __VIEW_H__ */ diff --git a/inc/option_menu.h b/inc/widget_viewer.h old mode 100644 new mode 100755 similarity index 53% rename from inc/option_menu.h rename to inc/widget_viewer.h index 2755ea9..7ae4a06 --- a/inc/option_menu.h +++ b/inc/widget_viewer.h @@ -14,32 +14,18 @@ * limitations under the License. */ -#ifndef OPTION_MENU_H_ -#define OPTION_MENU_H_ +#ifndef __WIDGET_VIEWER_H__ +#define __WIDGET_VIEWER_H__ +#include +#include +#include -#include +#include "cluster_data.h" -/** - * @brief Shows option menu with proper entries. - * @return true on success. - */ -extern bool option_menu_show(void); - -/** - * @brief Hides option menu popup. - */ -extern void option_menu_hide(void); - -/** - * @brief Handle hardware button actions. - */ -extern void option_menu_change_state_on_hw_menu_key(void); - -/** - * @brief Updates caption menu at the top of the screen. - */ -extern void option_menu_update_on_item_selected(void); +void widget_viewer_init(Evas_Object *win); +void widget_viewer_fini(void); +Evas_Object *widget_viewer_add_widget(Evas_Object *parent, widget_data_t *item, int *widget_width, int *widget_height); -#endif /* OPTION_MENU_H_ */ +#endif /* __WIDGET_VIEWER_H__ */ diff --git a/org.tizen.homescreen-efl.manifest b/org.tizen.homescreen-efl.manifest deleted file mode 100644 index 75b0fa5..0000000 --- a/org.tizen.homescreen-efl.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packaging/org.tizen.homescreen-efl.spec b/packaging/org.tizen.homescreen-efl.spec deleted file mode 100644 index 928e9b9..0000000 --- a/packaging/org.tizen.homescreen-efl.spec +++ /dev/null @@ -1,91 +0,0 @@ -Name: org.tizen.homescreen-efl -Summary: Homescreen-Efl -Version: 0.0.1 -Release: 0.1 -Group: Applications/Core Applications -License: Flora-1.1 -Source0: %{name}-%{version}.tar.gz - -%if "%{?tizen_profile_name}" == "wearable" -ExcludeArch: %{arm} %ix86 x86_64 -%endif - -%if "%{?tizen_profile_name}" == "tv" -ExcludeArch: %{arm} %ix86 x86_64 -%endif - -BuildRequires: cmake -BuildRequires: edje-tools -BuildRequires: gettext-tools -BuildRequires: coreutils -BuildRequires: hash-signer -BuildRequires: pkgconfig(appsvc) -BuildRequires: pkgconfig(badge) -BuildRequires: pkgconfig(capi-appfw-application) -BuildRequires: pkgconfig(capi-system-info) -BuildRequires: pkgconfig(capi-appfw-package-manager) -BuildRequires: pkgconfig(capi-appfw-app-manager) -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(elementary) -BuildRequires: pkgconfig(shortcut) -BuildRequires: pkgconfig(syspopup-caller) -BuildRequires: pkgconfig(widget_viewer) -BuildRequires: pkgconfig(widget_service) -BuildRequires: pkgconfig(sqlite3) -BuildRequires: pkgconfig(db-util) -BuildRequires: pkgconfig(notification) -BuildRequires: pkgconfig(capi-system-system-settings) -BuildRequires: pkgconfig(widget_service) -BuildRequires: pkgconfig(widget_viewer_evas) -BuildRequires: pkgconfig(shortcut) -BuildRequires: pkgconfig(capi-appfw-preference) -BuildRequires: pkgconfig(libtzplatform-config) - -%description -Tizen Homescreen Reference Implementation - -%prep -%setup -q - -%build - -%define _pkg_dir %{TZ_SYS_RO_APP}/%{name} -%define _pkg_shared_dir %{_pkg_dir}/shared -%define _pkg_data_dir %{_pkg_dir}/data -%define _sys_icons_dir %{_pkg_shared_dir}/res -%define _sys_packages_dir %{TZ_SYS_RO_PACKAGES} -%define _sys_license_dir %{TZ_SYS_SHARE}/license - -cd CMake -cmake . -DINSTALL_PREFIX=%{_pkg_dir} \ - -DSYS_ICONS_DIR=%{_sys_icons_dir} \ - -DSYS_PACKAGES_DIR=%{_sys_packages_dir} -make %{?jobs:-j%jobs} -cd - - -%install -cd CMake -%make_install -cd - - -%define tizen_sign 1 -%define tizen_sign_base %{_pkg_dir} -%define tizen_sign_level public -%define tizen_author_sign 1 -%define tizen_dist_sign 1 -mkdir -p %{buildroot}%{_sys_license_dir} -cp LICENSE %{buildroot}%{_sys_license_dir}/homescreen-efl -%find_lang homescreen-efl - -%files -f homescreen-efl.lang -%manifest %{name}.manifest -%defattr(-,root,root,-) -%{_pkg_dir}/bin/homescreen-efl -%{_pkg_dir}/res/edje/*.edj -%{_pkg_dir}/res/images/*.png -%{_pkg_dir}/res/images/livebox/*.png -%{_sys_icons_dir}/homescreen-efl.png -%{_sys_packages_dir}/%{name}.xml -%{_sys_license_dir}/homescreen-efl -%{_pkg_dir}/author-signature.xml -%{_pkg_dir}/signature1.xml diff --git a/project_def.prop b/project_def.prop old mode 100644 new mode 100755 index f5074e9..ec85acc --- a/project_def.prop +++ b/project_def.prop @@ -9,7 +9,8 @@ type = app profile = mobile-3.0 # C Sources -USER_SRCS = src/tree.c src/db/db.c src/homescreen-efl.c src/popup.c src/livebox/livebox_widget.c src/dynamic_index.c src/app_mgr.c src/all_apps.c src/layout.c src/app_grid.c src/livebox_all_pages.c src/livebox/livebox_panel.c src/data_model.c src/option_menu.c src/key.c src/app_icon.c src/mouse.c src/folder_panel.c src/livebox/grid_reposition.c src/livebox/livebox_utils.c src/livebox/livebox_animator.c src/livebox/grid_item_resize.c src/app_item.c src/page_scroller.c src/util.c src/add_viewer/add_viewer.c src/add_viewer/list_view.c src/add_viewer/view.c src/add_viewer/widget.c +USER_SRCS = src/apps_data.c src/homescreen-efl.c src/popup.c src/cluster_page.c src/cluster_db.c src/cluster_view.c src/widget_viewer.c src/page_indicator.c src/cluster_data.c src/conf.c src/add_widget_viewer/add_widget_data.c src/apps_view.c src/menu.c src/hw_key.c src/add_widget_viewer/add_widget_viewer.c src/apps_db.c src/apps_package_manager.c src/util.c +USER_SRCS_ABS = # EDC Sources USER_EDCS = @@ -49,7 +50,7 @@ USER_LIB_DIRS = USER_LIB_DIRS_ABS = # EDC Resource Path -USER_EDCS_IMAGE_DIRS = res/images +USER_EDCS_IMAGE_DIRS = edje/images USER_EDCS_IMAGE_DIRS_ABS = USER_EDCS_SOUND_DIRS = edje/sounds USER_EDCS_SOUND_DIRS_ABS = @@ -59,8 +60,8 @@ USER_EDCS_FONT_DIRS_ABS = # EDC Flags USER_EXT_EDC_KEYS = EDC0 -USER_EXT_EDC0_EDCS = res/edje/folder_entry.edc res/edje/livebox_layout.edc res/edje/page_edit_util.edc res/edje/icon.edc res/edje/livebox_container.edc res/edje/folder.edc res/edje/home.edc res/edje/page_edit.edc res/edje/app_grid.edc res/edje/index_element.edc res/edje/preview.edc res/edje/color_classes.edc -USER_EXT_EDC0_EDCS_IMAGE_DIRS = res/images +USER_EXT_EDC0_EDCS = res/edje/widget.edc res/edje/apps_folder_icon.edc res/edje/apps_folder_popup.edc res/edje/apps_view.edc res/edje/page_indicator_unit.edc res/edje/apps_view_bg.edc res/edje/cluster_allpage_thumbnail.edc res/edje/home_btn.edc res/edje/home.edc res/edje/apps_chooser_btn.edc res/edje/add_widget_viewer.edc res/edje/app_icon.edc res/edje/cluster_page.edc res/edje/cluster_allpage.edc +USER_EXT_EDC0_EDCS_IMAGE_DIRS = edje/images USER_EXT_EDC0_EDCS_IMAGE_DIRS_ABS = USER_EXT_EDC0_EDCS_SOUND_DIRS = edje/sounds USER_EXT_EDC0_EDCS_SOUND_DIRS_ABS = diff --git a/res/edje/add_widget_viewer.edc b/res/edje/add_widget_viewer.edc new file mode 100755 index 0000000..0ce6449 --- /dev/null +++ b/res/edje/add_widget_viewer.edc @@ -0,0 +1,302 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +images { + image: "preview_bg_4x2.png" COMP; + image: "preview_bg_4x4.png" COMP; +} + +styles { + style { + name: "leaf,font"; + base: "font=Tizen text_class=T024 font_size=38 align=left color=#AAAAAA color_class=T024 ellipsis=1.0"; + tag: "br" "\n"; + tag: "hilight" "+ font=Tizen:style=Bold"; + tag: "b" "+ font=Tizen:style=Bold"; + tag: "tab" "\t"; + } +} + +collections { + group { + name: "elm/genlist/item/widget,leaf/default"; + + data.item: "contents" "size_setter elm.icon"; + data.item: "texts" "elm.text"; + + parts { + part { + name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + part { + name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.044 0.046; to: SIZE_SETTER; } + rel2 { relative: 0.894 0.159; to: SIZE_SETTER; } + align: 0.0 0.0; + text { style: "leaf,font"; } + } + } + part { + name: "elm.icon"; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.044 0.180; to: SIZE_SETTER; } + rel2 { relative: 0.894 0.954; to: SIZE_SETTER; } + align: 0.0 0.0; + } + } + } + } + + group { + name: ADD_WIDGET_VIEWER_CONFORMANT_FRAME; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + } + + part { + name: "content"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + } + } + + group { + name: ADD_WIDGET_VIEWER_CONTENT_FRAME; + parts { + part { + name: "content"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 0.0 0.0; + visible: 0; + } + description { + state: "show,normal" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "index"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.00 0.0;} + rel2 { relative: 1.00 1.00; } + visible: 0; + } + description { + state: "show,normal" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "loading"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.25 0.40; } + rel2 { relative: 0.75 0.60; } + color: 100 100 200 200; + visible: 0; + } + + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "loading,txt"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to, "loading"; } + rel2 { relative: 1.0 1.0; to, "loading"; } + text { + font: "Tizen:style=Bold"; + text_class: "tizen"; + align: 0.5 0.5; + size: 26; + text: "Loading"; + } + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "loading,on"; + source: ADD_WIDGET_VIEWER_CONTENT_FRAME; + signal: "loading,on"; + action: STATE_SET "show" 0.0; + target: "loading"; + target: "loading,txt"; + } + program { + name: "loading,off"; + source: ADD_WIDGET_VIEWER_CONTENT_FRAME; + signal: "loading,off"; + action: STATE_SET "default" 0.0; + target: "loading"; + target: "loading,txt"; + } + program { + name: "show,normal"; + signal: "display,normal"; + source: "container"; + action: STATE_SET "show,normal" 0.0; + target: "content"; + } + program { + name: "show,normal,index"; + signal: "display,index"; + source: "container"; + action: STATE_SET "show,normal" 0.0; + target: "index"; + } + } + } + + group { + name: ADD_WIDGET_VIEWER_PREVIEW; + parts { + part { + name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + part { + name: "bg"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: SIZE_SETTER; } + rel2 { relative: 1.0 1.0; to: SIZE_SETTER; } + color: 61 185 204 178; + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color: 255 0 121 212; + } + } + part { + name: ADD_WIDGET_VIEWER_PREVIEW_ICON; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: SIZE_SETTER; } + rel2 { relative: 1.0 1.0; to: SIZE_SETTER; } + } + } + part { + name: "icon,touch"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: ADD_WIDGET_VIEWER_PREVIEW_ICON; } + rel2 { relative: 1.0 1.0; to: ADD_WIDGET_VIEWER_PREVIEW_ICON; } + color: 0 0 0 0; + } + } + } + programs { + program { + name: "icon,clicked"; + signal: "mouse,clicked,1"; + source: "icon,touch"; + action: SIGNAL_EMIT SIGNAL_PREVIEW_CLICKED SIGNAL_SOURCE; + } + program { + name: "icon,down"; + source: "icon,touch"; + signal: "mouse,down,1"; + action: STATE_SET "pressed" 0.0; + target: "bg"; + } + program { + name: "icon,up"; + source: "icon,touch"; + signal: "mouse,up,1"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } + } +} + diff --git a/res/edje/app_grid.edc b/res/edje/app_grid.edc deleted file mode 100644 index b349f2c..0000000 --- a/res/edje/app_grid.edc +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -collections { - group { - name: GROUP_APP_GRID; - parts { - //We want to have animations and don't take care about gengrid size from code. - //Because of that we must to add a part into the layout which set the size of the elm_layout - //widget properly. - part { - name: PART_APP_GRID_SIZE_SETTER; - type: SWALLOW; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 1.0;} - } - } - part { - name: PART_APP_GRID_BG; - type: RECT; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: PART_APP_GRID_SIZE_SETTER;} - rel2 {relative: 1.0 1.0; to: PART_APP_GRID_SIZE_SETTER;} - color: 0 0 0 45; - visible: 1; - } - description { - state: "hidden" 0.0; //Used in the folder - inherit: "default" 0.0; - visible: 0; - } - } - part { - name: PART_APP_GRID_EDIT_BG; - type: RECT; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: PART_APP_GRID_CONTENT;} - rel2 {relative: 1.0 1.0; to: PART_APP_GRID_CONTENT;} - color: 20 20 20 0; - visible: 1; - } - description { - state: "edit" 0.0; - inherit: "default" 0.0; - color: 20 20 20 40; - } - description { - state: "hidden" 0.0; //Used in the folder - inherit: "default" 0.0; - visible: 0; - } - } - part { - name: PART_APP_GRID_CONTENT; - type: SWALLOW; - description { - state: "default" 0.0; - align: 0.5 0.5; - rel1 {relative: 0.0 CONTENT_Y_MIN; to: PART_APP_GRID_SIZE_SETTER;} - rel2 {relative: 1.0 CONTENT_APP_Y_MAX; to: PART_APP_GRID_SIZE_SETTER;} - } - description { - state: "edit" 0.0; - inherit: "default" 0.0; - rel1.relative: 0.05 CONTENT_Y_MIN; - rel2.relative: 0.95 0.9; - } - } - } - programs { - program { - name: "bg_edit_mode_on"; - signal: SIGNAL_EDIT_MODE_ON; - source: SIGNAL_SOURCE; - action: STATE_SET "edit" 0.0; - target: PART_APP_GRID_CONTENT; - target: PART_APP_GRID_EDIT_BG; - transition: DECELERATE ANIMATION_RESIZE_TIME; - } - program { - name: "bg_edit_mode_off"; - signal: SIGNAL_EDIT_MODE_OFF; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_APP_GRID_CONTENT; - target: PART_APP_GRID_EDIT_BG; - transition: DECELERATE ANIMATION_RESIZE_TIME; - } - program { - name: "bg_choose_mode_off"; - signal: SIGNAL_CHOOSE_MODE_OFF; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_APP_GRID_CONTENT; - transition: DECELERATE ANIMATION_RESIZE_TIME; - } - program { - name: "bg_choose_mode_on"; - signal: SIGNAL_CHOOSE_MODE_ON; - source: SIGNAL_SOURCE; - action: STATE_SET "edit" 0.0; - target: PART_APP_GRID_CONTENT; - transition: DECELERATE ANIMATION_RESIZE_TIME; - } - program { - name: "bg_hidden"; - signal: SIGNAL_APP_GRID_BG_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "hidden" 0.0; - target: PART_APP_GRID_BG; - target: PART_APP_GRID_EDIT_BG; - } - } - } - group { - name: GROUP_APP_GRID_ITEM_CONTAINER; - parts { - part { - name: PART_APP_GRID_ITEM; - type: SWALLOW; - description { - state: "default" 0.0; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - } - } - } - } -} \ No newline at end of file diff --git a/res/edje/app_icon.edc b/res/edje/app_icon.edc new file mode 100755 index 0000000..dec6804 --- /dev/null +++ b/res/edje/app_icon.edc @@ -0,0 +1,543 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +images { + image: "../res/images/app_press_117.png" COMP; + image: "../res/images/btn_delete_nor.png" COMP; + image: "../res/images/btn_delete_press.png" COMP; + image: "../res/images/icon_badge_container.png" COMP; + image: "../res/images/core_check_bg.png" COMP; + image: "../res/images/core_check_bg_stroke.png" COMP; + image: "../res/images/core_check_icon.png" COMP; + image: "../res/images/folder_appicon_bg.png" COMP; +} + +styles { + style{ + name: "icon_label"; + base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=12 wrap=mixed"; + } + style{ + name: "icon_label_edit"; + base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=10 wrap=mixed"; + } +} +collections { + group { name: GROUP_APP_ICON_LY; + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + } + } + part { name: APPS_ICON_CONTENT; + type: SWALLOW; + description { + state: "default" 0.0; + rel1{relative: 0.16 0; to: SIZE_SETTER;} + rel2{relative: 0.84 0.6; to: SIZE_SETTER;} + align: 0.5 0.5; + } + } //APPS_ICON_CONTENT + + part { name: APPS_ICON_CONTENT_TOUCH; + type: IMAGE; + mouse_events: 1; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: APPS_ICON_CONTENT;} + rel2{relative: 1.0 1.0; to: APPS_ICON_CONTENT;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + color: 0 0 0 0; + image { + normal: "../res/images/app_press_117.png"; + } + } + description{ + state: "icon_touched" 0.0; + inherit: "default" 0.0; + color: 0 0 0 250; + } + } //APPS_ICON_CONTENT_TOUCH + + part { name: "app_icon_disable"; + type: IMAGE; + mouse_events: 1; + repeat_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: APPS_ICON_CONTENT;} + rel2{relative: 1.0 1.0; to: APPS_ICON_CONTENT;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + color: 0 0 0 0; + image { + normal: "../res/images/folder_appicon_bg.png"; + } + visible: 0; + } + description{ + state: "disable" 0.0; + inherit: "default" 0.0; + color: 0 0 0 150; + visible: 1; + } + } //APPS_ICON_CONTENT_TOUCH + + part { name: APPS_ICON_NAME; + type: TEXTBLOCK; + mouse_events: 1; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1{relative: 0.04 0.63; to: SIZE_SETTER;} + rel2{relative: 0.95 0.98; to: SIZE_SETTER;} + color: 255 255 255 255; + text { + style: "icon_label"; + align: 0.5 0.0; + } + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + rel1{relative: 0.04 0.61 ; to: SIZE_SETTER;} + rel2{relative: 0.95 0.90; to: SIZE_SETTER;} + text { + style: "icon_label_edit"; + } + } + description { + state: "black_text" 0.0; + inherit: "default" 0.0; + color: 0 0 0 255; + } + description { + state: "black_edit" 0.0; + inherit: "black_text" 0.0; + text { + style: "icon_label_edit"; + } + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 0 0 0 50; + } + }//APPS_ICON_NAME + part + { + name: "icon_badge"; + type: IMAGE; + scale: 0; + description + { + state: "default" 0.0; + rel1{relative: 0.0 0.0; offset: -10 -1; to: APPS_ICON_BADGE_TEXT;} + rel2{relative: 1.0 1.0; offset: 13 1; to: APPS_ICON_BADGE_TEXT;} + visible: 0; + image + { + normal: "../res/images/icon_badge_container.png"; + } + } + description + { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part + { + name: APPS_ICON_BADGE_TEXT; + type: TEXT; + scale: 1; + description + { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + color: 255 255 255 255; + rel1{relative: 0.95 -0.05; to: APPS_ICON_CONTENT;} + rel2{relative: 0.95 -0.05; to: APPS_ICON_CONTENT;} + align: 1.0 0.0; + text + { + font: "arial"; + size: 12; + text_class: "ATO002"; + min: 1 1; + max: 1 1; + } + } + description + { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { //APPS_ICON_UNINSTALL_BUTTON + name: APPS_ICON_UNINSTALL_BUTTON; + type: IMAGE; + scale: 0; + description { + state: "default" 0.0; + rel1{relative: -0.1 -0.1; to: APPS_ICON_CONTENT;} + rel2{relative: 0.4 0.4; to: APPS_ICON_CONTENT;} + color: 255 255 255 0; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/btn_delete_nor.png"; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + image { + normal: "../res/images/btn_delete_press.png"; + } + visible: 1; + } + }//APPS_ICON_UNINSTALL_BUTTON + + part { //"icon_checkbox_bg"; + name: "icon_checkbox_bg"; + type: IMAGE; + scale: 0; + description { + state: "default" 0.0; + rel1{relative: 0.6 -0.1; to: APPS_ICON_CONTENT;} + rel2{relative: 1.1 0.4; to: APPS_ICON_CONTENT;} + color: 61 184 204 120; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/core_check_bg.png"; + } + } + description { + state: "blank" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "checked" 0.0; + inherit: "default" 0.0; + color: 61 184 204 120; + visible: 1; + } + }//"icon_checkbox_bg" + part { //"icon_checkbox_border"; + name: "icon_checkbox_border"; + type: IMAGE; + scale: 0; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: "icon_checkbox_bg";} + rel2{relative: 1.0 1.0; to: "icon_checkbox_bg";} + color: 255 255 255 0; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/core_check_bg_stroke.png"; + } + } + description { + state: "blank" 0.0; + inherit: "default" 0.0; + color: 61 184 204 255; + visible: 1; + } + description { + state: "checked" 0.0; + inherit: "default" 0.0; + color: 61 184 204 120; + visible: 1; + } + }//"icon_checkbox_border" + part { //"icon_checkbox" + name: "icon_checkbox"; + type: IMAGE; + scale: 0; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: "icon_checkbox_bg";} + rel2{relative: 1.0 1.0; to: "icon_checkbox_bg";} + color: 255 255 255 120; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/core_check_icon.png"; + } + } + description { + state: "blank" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "checked" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "icon_checkbox_touch"; + type:RECT; + scale:0; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + rel1{relative: 0.0 -0.1; to: APPS_ICON_CONTENT;} + rel2{relative: 1.2 1.0; to: APPS_ICON_CONTENT;} + color: 255 255 255 0; + visible: 0; + } + description { + state: "blank" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "checked" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "icon_touch_program"; + signal: "mouse,down,1"; + source: APPS_ICON_CONTENT_TOUCH; + action: STATE_SET "icon_touched" 0.0; + target: APPS_ICON_CONTENT_TOUCH; + transition: LINEAR 0.1; + } + program { + name: "icon_touch_release_program"; + signal: "mouse,up,1"; + source: APPS_ICON_CONTENT_TOUCH; + action: STATE_SET "default" 0.0; + target: APPS_ICON_CONTENT_TOUCH; + transition: LINEAR 0.1; + } + program { + name: "icon_clicked_program"; + signal :"mouse,clicked,1"; + source: APPS_ICON_CONTENT_TOUCH; + action: SIGNAL_EMIT SIGNAL_ICON_CLICKED SIGNAL_SOURCE; + } + program { + name: "set_black_text"; + signal: SIGNAL_SET_BLACK_TEXT; + source: SIGNAL_SOURCE; + action: STATE_SET "black_text" 0.0; + target: APPS_ICON_NAME; + } + program { + name: "bg_edit_mode_on_ani"; + signal: SIGNAL_EDIT_MODE_ON_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: APPS_ICON_NAME; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "bg_edit_mode_on"; + signal: SIGNAL_EDIT_MODE_ON; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: APPS_ICON_NAME; + } + program { + name: "bg_edit_mode_off_ani"; + signal: SIGNAL_EDIT_MODE_OFF_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_ICON_NAME; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "bg_edit_mode_off"; + signal: SIGNAL_EDIT_MODE_OFF; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_ICON_NAME; + } + program { + name: "uninstall_button_show_ani"; + signal: SIGNAL_UNINSTALL_BUTTON_SHOW_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "uninstall_button_show"; + signal: SIGNAL_UNINSTALL_BUTTON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + } + program { + name: "uninstall_button_hide_ani"; + signal: SIGNAL_UNINSTALL_BUTTON_HIDE_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "uninstall_button_hide"; + signal: SIGNAL_UNINSTALL_BUTTON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + } + program { + name: "uninstall_button_clicked"; + signal: "mouse,clicked,1"; + source: APPS_ICON_UNINSTALL_BUTTON; + action: SIGNAL_EMIT SIGNAL_UNINSTALL_BUTTON_CLICKED SIGNAL_SOURCE; + } + program { + name: "uninstall_button_mouse_down"; + signal: "mouse,down,1"; + source: APPS_ICON_UNINSTALL_BUTTON; + action: STATE_SET "press" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "uninstall_button_mouse_up"; + signal: "mouse,up,1"; + source: APPS_ICON_UNINSTALL_BUTTON; + action: STATE_SET "show" 0.0; + target: APPS_ICON_UNINSTALL_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + + program{ + name: "checkbox_show"; + signal:SIGNAL_CHOOSER_MODE_ON; + source:SIGNAL_SOURCE; + action:STATE_SET "blank" 0.0; + target:"icon_checkbox_bg"; + target:"icon_checkbox_border"; + target:"icon_checkbox_touch"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program{ + name: "checkbox_hide"; + signal:SIGNAL_CHOOSER_MODE_OFF; + source:SIGNAL_SOURCE; + action:STATE_SET "default" 0.0; + target:"icon_checkbox_bg"; + target:"icon_checkbox_border"; + target:"icon_checkbox"; + target:"icon_checkbox_touch"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + + //Set default value of check box. + program{ + name: "checkbox_check"; + signal:SIGNAL_CHECK_CHECK_BOX; + source:SIGNAL_SOURCE; + action:STATE_SET "checked" 0.0; + target:"icon_checkbox"; + } + //Set default value of check box. + program{ + name: "checkbox_uncheck"; + signal:SIGNAL_UNCHECK_CHECK_BOX; + source:SIGNAL_SOURCE; + action:STATE_SET "blank" 0.0; + target:"icon_checkbox"; + } + program { + name: "checkbox_clicked"; + signal:"mouse,clicked,1"; + source:"icon_checkbox_touch"; + script { + emit(SIGNAL_CHANGED_CHECK_BOX, SIGNAL_SOURCE); //signal for C listener + } + } + program { + name: "icon_badge_show"; + signal: SIGNAL_BADGE_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: "icon_badge"; + target: APPS_ICON_BADGE_TEXT; + } + program { + name: "icon_badge_hide"; + signal: SIGNAL_BADGE_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: "icon_badge"; + target: APPS_ICON_BADGE_TEXT; + } + program { + name: "icon_disable"; + signal: SIGNAL_ICON_DISABLE; + source: SIGNAL_SOURCE; + action: STATE_SET "disable" 0.0; + target: "app_icon_disable"; + target: APPS_ICON_NAME; + } + program { + name: "icon_enable"; + signal: SIGNAL_ICON_ENABLE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_ICON_NAME; + target: "app_icon_disable"; + } + } + } +} \ No newline at end of file diff --git a/res/edje/apps_chooser_btn.edc b/res/edje/apps_chooser_btn.edc new file mode 100755 index 0000000..ae1eb95 --- /dev/null +++ b/res/edje/apps_chooser_btn.edc @@ -0,0 +1,183 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + images { + } + group { name: GROUP_APPS_CHOOSER_BTN_LY; + parts { + part { + name: "chooser_spacer"; + type: SPACER; + scale: 0; + mouse_events: 0; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.0625; + } + } + part { + name: APPS_CHOOSER_LEFT_LABEL; + type: TEXT; + scale: 1; + description + { + color: 255 255 255 255; + state: "default" 0.0; + visible: 0; + text + { + align: 0.25 0.90; + size: 11; + text: "CANCEL"; + } + rel1 { relative: 0.0 0.0;to: "chooser_spacer"; } + rel2 { relative: 0.33 1.0;to: "chooser_spacer"; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "chooser_left_clickable_space"; + type: RECT; + mouse_events: 1; + scale: 0; + description + { + state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + rel1 { relative: 0.0 0.0; to: APPS_CHOOSER_LEFT_LABEL; } + rel2 { relative: 1.0 1.0; to: APPS_CHOOSER_LEFT_LABEL; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: APPS_CHOOSER_MIDDLE_LABEL; + type: TEXT; + scale: 1; + description + { + state: "default" 0.0; + visible: 0; + color: 255 255 255 255; + text + { + align: 0.5 0.90; + text: "0 Selected"; + size: 16; + } + rel1 { relative: 0.30 0.0;to: "chooser_spacer"; } + rel2 { relative: 0.70 1.0;to: "chooser_spacer"; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: APPS_CHOOSER_RIGHT_LABEL; + type: TEXT; + scale: 1; + description + { + state: "default" 0.0; + visible: 0; + color: 255 255 255 255; + text + { + align: (1.0 - 0.25) 0.90; + size: 11; + text: "DONE"; + } + rel1 { relative: 0.66 0.0;to: "chooser_spacer"; } + rel2 { relative: 1.0 1.0;to: "chooser_spacer"; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "chooser_right_clickable_space"; + type: RECT; + mouse_events: 1; + scale: 0; + description + { + state: "default" 0.0; + visible: 0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0;to: APPS_CHOOSER_RIGHT_LABEL; } + rel2 { relative: 1.0 1.0;to: APPS_CHOOSER_RIGHT_LABEL; } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "chooser_btn_show"; + signal: SIGNAL_CHOOSER_BUTTON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: APPS_CHOOSER_LEFT_LABEL; + target: "chooser_left_clickable_space"; + target: APPS_CHOOSER_MIDDLE_LABEL; + target: APPS_CHOOSER_RIGHT_LABEL; + target: "chooser_right_clickable_space"; + } + program { + name: "chooser_btn_hide"; + signal: SIGNAL_CHOOSER_BUTTON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: APPS_CHOOSER_LEFT_LABEL; + target: "chooser_left_clickable_space"; + target: APPS_CHOOSER_MIDDLE_LABEL; + target: APPS_CHOOSER_RIGHT_LABEL; + target: "chooser_right_clickable_space"; + } + program { + name: "chooser_left_click"; + signal: "mouse,down,1"; + source: "chooser_left_clickable_space"; + action: SIGNAL_EMIT SIGNAL_CHOOSER_LEFT_BTN_CLICKED SIGNAL_SOURCE; + } + program { + name: "chooser_right_click"; + signal: "mouse,clicked,1"; + source: "chooser_right_clickable_space"; + action: SIGNAL_EMIT SIGNAL_CHOOSER_RIGHT_BTN_CLICKED SIGNAL_SOURCE; + } + } + } +} \ No newline at end of file diff --git a/res/edje/apps_folder_icon.edc b/res/edje/apps_folder_icon.edc new file mode 100755 index 0000000..71dbf4d --- /dev/null +++ b/res/edje/apps_folder_icon.edc @@ -0,0 +1,336 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +images { + image: "../res/images/folder_appicon_bg.png" COMP; + image: "../res/images/folder_appicon_bg_possible.png" COMP; + image: "../res/images/folder_appicon_bg_impossible.png" COMP; + image: "../res/images/folder_appicon_empty_bg.png" COMP; +} +collections { + group { name: GROUP_FOLDER_ICON_LY; + parts { + part { + name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; } + rel2{relative: 1.0 1.0; } + align: 0.5 0.5; + } + } + part { + name: "folder_icon_bg_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: SIZE_SETTER;} + rel2{relative: 1.0 1.0; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/folder_appicon_empty_bg.png"; + } + } + description { + state: "item_count_1" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg.png"; + } + } + description { + state: "item_count_2" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg.png"; + } + } + description { + state: "item_count_3" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg.png"; + } + } + description { + state: "item_count_4" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg.png"; + } + } + } + part { + name: "folder_icon_image_possible"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: SIZE_SETTER;} + rel2{relative: 1.0 1.0; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/folder_appicon_bg_possible.png"; + } + visible: 0; + } + description { + state: "frame_possible" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg_possible.png"; + } + visible: 1; + } + description { + state: "frame_impossible" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/folder_appicon_bg_impossible.png"; + } + visible: 1; + } + } + part{ + name :"icon_0"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1{relative: 0.325 0.325; to: SIZE_SETTER;} + rel2{relative: 0.675 0.675; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + visible: 0; + } + description { + state: "item_count_1" 0.0; + rel1{relative: 0.325 0.325; to: SIZE_SETTER;} + rel2{relative: 0.675 0.675; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_2" 0.0; + rel1{relative: 0.135 0.325; to: SIZE_SETTER;} + rel2{relative: 0.485 0.675; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_3" 0.0; + rel1{relative: 0.185 0.185; to: SIZE_SETTER;} + rel2{relative: 0.485 0.485; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_4" 0.0; + rel1{relative: 0.185 0.185; to: SIZE_SETTER;} + rel2{relative: 0.485 0.485; to: SIZE_SETTER;} + visible: 1; + } + } + part{ + name :"icon_1"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1{relative: 0.488 0.325; to: SIZE_SETTER;} + rel2{relative: 0.838 0.675; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + visible: 0; + } + + description { + state: "item_count_1" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_2" 0.0; + rel1{relative: 0.488 0.325; to: SIZE_SETTER;} + rel2{relative: 0.838 0.675; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_3" 0.0; + rel1{relative: 0.515 0.185; to: SIZE_SETTER;} + rel2{relative: 0.815 0.485; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_4" 0.0; + rel1{relative: 0.515 0.185; to: SIZE_SETTER;} + rel2{relative: 0.815 0.485; to: SIZE_SETTER;} + visible: 1; + } + } + part{ + name :"icon_2"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1{relative: 0.185 0.515; to: SIZE_SETTER;} + rel2{relative: 0.485 0.815; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + visible: 0; + } + description { + state: "item_count_1" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_2" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_3" 0.0; + rel1{relative: 0.185 0.515; to: SIZE_SETTER;} + rel2{relative: 0.485 0.815; to: SIZE_SETTER;} + visible: 1; + } + description { + state: "item_count_4" 0.0; + rel1{relative: 0.185 0.515; to: SIZE_SETTER;} + rel2{relative: 0.485 0.815; to: SIZE_SETTER;} + visible: 1; + } + } + part{ + name :"icon_3"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1{relative: 0.515 0.515; to: SIZE_SETTER;} + rel2{relative: 0.815 0.815; to: SIZE_SETTER;} + aspect: 1.0 1.0; + aspect_preference: BOTH; + visible: 0; + } + description { + state: "item_count_1" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_2" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_3" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "item_count_4" 0.0; + rel1{relative: 0.515 0.515; to: SIZE_SETTER;} + rel2{relative: 0.815 0.815; to: SIZE_SETTER;} + visible: 1; + } + } + programs + { + program { + name: "set_item_count_1"; + signal: "set_item_count_1"; + source: SIGNAL_SOURCE; + action: STATE_SET "item_count_1" 0.0; + target: "icon_0"; + target: "icon_1"; + target: "icon_2"; + target: "icon_3"; + target: "folder_icon_bg_image"; + transition: DECELERATE 0.2; + } + + program { + name: "set_item_count_2"; + signal: "set_item_count_2"; + source: SIGNAL_SOURCE; + action: STATE_SET "item_count_2" 0.0; + target: "icon_0"; + target: "icon_1"; + target: "icon_2"; + target: "icon_3"; + target: "folder_icon_bg_image"; + transition: DECELERATE 0.2; + } + + program { + name: "set_item_count_3"; + signal: "set_item_count_3"; + source: SIGNAL_SOURCE; + action: STATE_SET "item_count_3" 0.0; + target: "icon_0"; + target: "icon_1"; + target: "icon_2"; + target: "icon_3"; + target: "folder_icon_bg_image"; + transition: DECELERATE 0.2; + } + program { + name: "set_item_count_4"; + signal: "set_item_count_4"; + source: SIGNAL_SOURCE; + action: STATE_SET "item_count_4" 0.0; + target: "icon_0"; + target: "icon_1"; + target: "icon_2"; + target: "icon_3"; + target: "folder_icon_bg_image"; + transition: DECELERATE 0.2; + } + program { + name: "set_item_count_0"; + signal: "set_item_count_0"; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: "icon_0"; + target: "icon_1"; + target: "icon_2"; + target: "icon_3"; + target: "folder_icon_bg_image"; + } + + program { + name: "show,bg,possible"; + signal: SIGNAL_FRAME_POSSIBLE_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "frame_possible" 0.0; + target: "folder_icon_image_possible"; + } + program { + name: "show,bg,impossible"; + signal: SIGNAL_FRAME_IMPOSSIBLE_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "frame_impossible" 0.0; + target: "folder_icon_image_possible"; + } + } + } +} diff --git a/res/edje/apps_folder_popup.edc b/res/edje/apps_folder_popup.edc new file mode 100755 index 0000000..d1f3c83 --- /dev/null +++ b/res/edje/apps_folder_popup.edc @@ -0,0 +1,218 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +#define MAKE_TILE(num_x,num_y)\ + part{ name: "icon_"num_x"_"num_y;\ + type : SWALLOW;\ + description {\ + state : "default" 0.0;\ + fixed : 1 1;\ + rel1 {\ + relative: num_y/APPS_FOLDER_COL num_x/APPS_FOLDER_ROW ;\ + to: APPS_FOLDER_CONTAINER;\ + }\ + rel2 {\ + relative :(num_y+1)/APPS_FOLDER_COL (num_x+1)/APPS_FOLDER_ROW ;\ + to: APPS_FOLDER_CONTAINER;\ + }\ + align: 0.0 0.0;\ + }\ + } +images { + image: "../res/images/folder_popup_bg.png" COMP; + image: "../res/images/btn_add_nor.png" COMP; + image: "../res/images/btn_add_press.png" COMP; +} + +collections { + group { name: GROUP_APPS_FOLDER_POPUP_LY; + script { + public plus_x; + public plus_y; + + public message(Msg_Type:type, id, ...) { + if (type == MSG_FLOAT_SET) + { + set_float(plus_x, getfarg(2)); + set_float(plus_y, getfarg(3)); + send_message(type, id, getfarg(2), getfarg(3)); + } + } + } + parts { + part { name: SIZE_SETTER; + type: RECT; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + align: 0.0 0.0; + color: 0 0 0 100; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + } + } + part { name: APPS_FOLDER_BG; + type: IMAGE; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 {relative: 0.04 0.2; to:SIZE_SETTER;} + rel2 {relative: 0.96 0.8; to:SIZE_SETTER;} + image { + normal: "../res/images/folder_popup_bg.png"; + border: 5 5 5 5; + } + color: 255 255 255 255; + } + } + part { name: APPS_FOLDER_TITLE; + type: SWALLOW; + mouse_events: 1; + repeat_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1 {relative: 0.08 0.02; to:APPS_FOLDER_BG;} + rel2 {relative: 0.92 0.12; to:APPS_FOLDER_BG;} + color: 255 255 255 255; + } + } + part { name: APPS_FOLDER_SEPARATOR; + type: RECT; + mouse_events: 1; + repeat_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1 {relative: 0.08 0.12; to:APPS_FOLDER_BG;} + rel2 {relative: 0.92 0.125; to:APPS_FOLDER_BG;} + color: 77 231 255 255; + } + } + part { name: APPS_FOLDER_CONTAINER; + type: SPACER; + mouse_events: 1; + repeat_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1 {relative: 0.08 0.15; to:APPS_FOLDER_BG;} + rel2 {relative: 0.92 0.96; to:APPS_FOLDER_BG;} + } + } + MAKE_TILE(0,0) + MAKE_TILE(0,1) + MAKE_TILE(0,2) + MAKE_TILE(1,0) + MAKE_TILE(1,1) + MAKE_TILE(1,2) + MAKE_TILE(2,0) + MAKE_TILE(2,1) + MAKE_TILE(2,2) + part { name: APPS_FOLDER_PLUS_ICON; + type: IMAGE; + mouse_events: 1; + repeat_events: 0; + description { state: "default" 0.0; + aspect: 1.0 1.0; + rel1 { + relative: (0 + 0.16 / APPS_FOLDER_COL) 0 ; + to: APPS_FOLDER_CONTAINER; + } + rel2 { + relative :(1 - 0.16)/APPS_FOLDER_COL (1 - 0.4)/APPS_FOLDER_ROW; + to: APPS_FOLDER_CONTAINER; + } + image { + normal: "../res/images/btn_add_nor.png"; + } + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + image { + normal: "../res/images/btn_add_press.png"; + } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name:"bg_touched"; + signal: "mouse,clicked,1"; + source: SIZE_SETTER; + action: SIGNAL_EMIT SIGNAL_APPS_FOLDER_HIDE SIGNAL_SOURCE; + } + program { + name: "set_plus_btn"; + signal: SIGNAL_APPS_FOLDER_SET_PLUS_ICON; + source: SIGNAL_SOURCE; + script { + custom_state(PART:APPS_FOLDER_PLUS_ICON, "default", 0.0); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL1, ((get_float(plus_y) + 0.16) / APPS_FOLDER_COL), (get_float(plus_x)) / APPS_FOLDER_ROW); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL2, (((get_float(plus_y)) + 0.84) / APPS_FOLDER_COL), (((get_float(plus_x)) + 0.6) / APPS_FOLDER_ROW)); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_IMAGE, get_image_id("../res/images/btn_add_nor.png")); + set_state(PART:APPS_FOLDER_PLUS_ICON, "custom", 0.0); + } + } + program { + name: "set_plus_btn_up"; + signal: "mouse,up,1"; + source: APPS_FOLDER_PLUS_ICON; + script { + custom_state(PART:APPS_FOLDER_PLUS_ICON, "default", 0.0); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL1, ((get_float(plus_y) + 0.16) / APPS_FOLDER_COL), (get_float(plus_x)) / APPS_FOLDER_ROW); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL2, (((get_float(plus_y)) + 0.84) / APPS_FOLDER_COL), (((get_float(plus_x)) + 0.6) / APPS_FOLDER_ROW)); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_IMAGE, get_image_id("../res/images/btn_add_nor.png")); + set_state(PART:APPS_FOLDER_PLUS_ICON, "custom", 0.0); + } + } + program { + name: "set_plus_btn_down"; + signal: "mouse,down,1"; + source: APPS_FOLDER_PLUS_ICON; + script { + custom_state(PART:APPS_FOLDER_PLUS_ICON, "press", 0.0); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL1, ((get_float(plus_y) + 0.16) / APPS_FOLDER_COL), (get_float(plus_x)) / APPS_FOLDER_ROW); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_REL2, (((get_float(plus_y)) + 0.84) / APPS_FOLDER_COL), (((get_float(plus_x)) + 0.6) / APPS_FOLDER_ROW)); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_IMAGE, get_image_id("../res/images/btn_add_press.png")); + set_state(PART:APPS_FOLDER_PLUS_ICON, "custom", 0.0); + } + } + + program { + name: "set_plus_btn_clicked"; + signal: "mouse,clicked,1"; + source: APPS_FOLDER_PLUS_ICON; + action: SIGNAL_EMIT SIGNAL_APPS_FOLDER_CLICKED_PLUS_ICON SIGNAL_SOURCE; + } + program { + name: "hide_plus_icon"; + signal: SIGNAL_APPS_FOLDER_HIDE_PLUS_ICON; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: APPS_FOLDER_PLUS_ICON; + } + } + } +} \ No newline at end of file diff --git a/res/edje/apps_view.edc b/res/edje/apps_view.edc new file mode 100755 index 0000000..52f9981 --- /dev/null +++ b/res/edje/apps_view.edc @@ -0,0 +1,143 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +#define MAKE_TILE(num_x,num_y)\ + part{ name: "icon_"num_x"_"num_y;\ + type : SWALLOW;\ + description {\ + state : "default" 0.0;\ + fixed : 1 1;\ + rel1 {\ + relative :num_y/APPS_VIEW_COL num_x/APPS_VIEW_ROW ;\ + to: SIZE_SETTER;\ + }\ + rel2 {\ + relative :(num_y+1)/APPS_VIEW_COL (num_x+1)/APPS_VIEW_ROW ;\ + to: SIZE_SETTER;\ + }\ + align: 0.0 0.0;\ + }\ + description {\ + state: "edit" 0.0;\ + inherit: "default" 0.0;\ + rel1 {\ + relative :0.04+(num_y/APPS_VIEW_COL)*0.9 0.05+(num_x/APPS_VIEW_ROW)*0.9 ;\ + to: SIZE_SETTER;\ + }\ + rel2 {\ + relative :0.04+((num_y+1)/APPS_VIEW_COL)*0.9 0.05+((num_x+1)/APPS_VIEW_ROW)*0.09 ;\ + to: SIZE_SETTER;\ + };\ + }\ + } + +collections { + images { + } + group { name: GROUP_APPS_LY; + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + } + } + MAKE_TILE(0,0); + MAKE_TILE(0,1); + MAKE_TILE(0,2); + MAKE_TILE(0,3); + MAKE_TILE(1,0); + MAKE_TILE(1,1); + MAKE_TILE(1,2); + MAKE_TILE(1,3); + MAKE_TILE(2,0); + MAKE_TILE(2,1); + MAKE_TILE(2,2); + MAKE_TILE(2,3); + MAKE_TILE(3,0); + MAKE_TILE(3,1); + MAKE_TILE(3,2); + MAKE_TILE(3,3); + MAKE_TILE(4,0); + MAKE_TILE(4,1); + MAKE_TILE(4,2); + MAKE_TILE(4,3); + } + programs { + program { + name: "bg_edit_mode_on"; + signal: SIGNAL_EDIT_MODE_ON_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: "icon_0_0"; + target: "icon_0_1"; + target: "icon_0_2"; + target: "icon_0_3"; + target: "icon_1_0"; + target: "icon_1_1"; + target: "icon_1_2"; + target: "icon_1_3"; + target: "icon_2_0"; + target: "icon_2_1"; + target: "icon_2_2"; + target: "icon_2_3"; + target: "icon_3_0"; + target: "icon_3_1"; + target: "icon_3_2"; + target: "icon_3_3"; + target: "icon_4_0"; + target: "icon_4_1"; + target: "icon_4_2"; + target: "icon_4_3"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "bg_edit_mode_off"; + signal: SIGNAL_EDIT_MODE_OFF_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: "icon_0_0"; + target: "icon_0_1"; + target: "icon_0_2"; + target: "icon_0_3"; + target: "icon_1_0"; + target: "icon_1_1"; + target: "icon_1_2"; + target: "icon_1_3"; + target: "icon_2_0"; + target: "icon_2_1"; + target: "icon_2_2"; + target: "icon_2_3"; + target: "icon_3_0"; + target: "icon_3_1"; + target: "icon_3_2"; + target: "icon_3_3"; + target: "icon_4_0"; + target: "icon_4_1"; + target: "icon_4_2"; + target: "icon_4_3"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + } + } +} \ No newline at end of file diff --git a/res/edje/apps_view_bg.edc b/res/edje/apps_view_bg.edc new file mode 100755 index 0000000..6c28134 --- /dev/null +++ b/res/edje/apps_view_bg.edc @@ -0,0 +1,137 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + group { name: GROUP_APPS_BG_LY; + script { + public rel1; + public rel2; + public alpha; + + public message(Msg_Type:type, id, ...) { + if (type == MSG_FLOAT_SET) + { + set_float(rel1, getfarg(2)); + set_float(rel2, getfarg(3)); + set_float(alpha, getfarg(4)); + send_message(type, id, getfarg(2), getfarg(3), getfarg(4)); + } + } + } + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + visible: 1; + } + } + part { name: APPS_APPS_VIEW_BG; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + color: 0 0 0 APPS_VIEW_BG_OPACITY; + rel1 {relative: 0.0 0.0; to:SIZE_SETTER;} + rel2 {relative: 1.0 1.0; to:SIZE_SETTER;} + visible: 0; + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + visible: 1; + rel1 {relative: 0.06 0.09; to:SIZE_SETTER;} + rel2 {relative: 0.94 0.86; to:SIZE_SETTER;} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + map { + on: 1; + perspective_on: 1; + smooth: 1; + alpha: 1; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + map { + on: 1; + perspective_on: 1; + smooth: 1; + alpha: 1; + } + } + } + } + programs { + program { + name: "apps_bg_hide"; + signal: SIGNAL_APPS_VIEW_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: APPS_APPS_VIEW_BG; + } + program { + name: "apps_bg_show"; + signal: SIGNAL_APPS_VIEW_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: APPS_APPS_VIEW_BG; + } + program { + name: "rotation,changed"; + signal: SIGNAL_APPS_VIEW_ANIM; + source: SIGNAL_SOURCE; + script { + custom_state(PART:APPS_APPS_VIEW_BG, "show", 0.0); + //set_state_val(PART:APPS_APPS_VIEW_BG, STATE_REL1, 0, get_float(rel1)); + //set_state_val(PART:APPS_APPS_VIEW_BG, STATE_REL2, 0, get_float(rel2)); + set_state_val(PART:APPS_APPS_VIEW_BG, STATE_COLOR, 0, 0, 0, round(get_float(alpha))); + set_state(PART:APPS_APPS_VIEW_BG, "custom", 0.0); + } + } + program { + name: "bg_edit_mode_on"; + signal: SIGNAL_EDIT_MODE_ON_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: APPS_APPS_VIEW_BG; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "bg_edit_mode_off"; + signal: SIGNAL_EDIT_MODE_OFF_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: APPS_APPS_VIEW_BG; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + } + } +} \ No newline at end of file diff --git a/res/edje/cluster_allpage.edc b/res/edje/cluster_allpage.edc new file mode 100755 index 0000000..2bae1b7 --- /dev/null +++ b/res/edje/cluster_allpage.edc @@ -0,0 +1,41 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" +collections { + group { name: GROUP_CLUSTER_ALLPAGE_LY; + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + } + } + part { name: CLUSTER_ALLPAGE_GRID; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1{relative: 0.0 0.0; to: SIZE_SETTER;} + rel2{relative: 1.0 1.0; to: SIZE_SETTER;} + } + } + } + } +} \ No newline at end of file diff --git a/res/edje/cluster_allpage_thumbnail.edc b/res/edje/cluster_allpage_thumbnail.edc new file mode 100755 index 0000000..1ed1f04 --- /dev/null +++ b/res/edje/cluster_allpage_thumbnail.edc @@ -0,0 +1,239 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + images { + image: "../res/images/btn_delete_nor.png" COMP; + image: "../res/images/btn_delete_press.png" COMP; + image: "../res/images/all_page_add.png" COMP; + image: "../res/images/all_page_add_press.png" COMP; + image: "../res/images/all_page_drag.png" COMP; + } + group { name: GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY; + parts { + part { name: "bg"; + type: RECT; + description { + state: "default" 0.0; + align: 0 0; + color: 0 0 0 50; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + } + part { name: CLUSTER_ALLPAGE_ADD_BUTTON; + type: IMAGE; + description { + state: "default" 0.0; + rel1{relative: 0.375 0.375; to: "bg";} + rel2{relative: 0.625 0.625; to: "bg";} + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/all_page_add.png"; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + image { + normal: "../res/images/all_page_add_press.png"; + } + visible: 1; + } + } + part { name: "cluster_allpage_add_button_touch_rect"; + type: RECT; + description { + state: "default" 0.0; + rel1{relative: 0.0 0.0; to: "bg";} + rel2{relative: 1.0 1.0; to: "bg";} + visible: 0; + color: 0 0 0 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: CLUSTER_ALLPAGE_THUMBNAIL_IMAGE; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + } + } + part { name: CLUSTER_ALLPAGE_DRAG_IMAGE; + type: IMAGE; + description { + state: "default" 0.0; + rel1{relative: -0.03 -0.03; to: CLUSTER_ALLPAGE_THUMBNAIL_IMAGE;} + rel2{relative: 1.03 1.03; to: CLUSTER_ALLPAGE_THUMBNAIL_IMAGE;} + color: 255 255 255 150; + visible: 0; + image { + normal: "../res/images/all_page_drag.png"; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: CLUSTER_ALLPAGE_DELETE_BUTTON; + type: IMAGE; + description { + state: "default" 0.0; + rel1{relative: 0.031 0.031; to: CLUSTER_ALLPAGE_THUMBNAIL_IMAGE;} + rel2{relative: 0.218 0.218; to: CLUSTER_ALLPAGE_THUMBNAIL_IMAGE;} + color: 255 255 255 0; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/btn_delete_nor.png"; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + image { + normal: "../res/images/btn_delete_press.png"; + } + visible: 1; + } + } + } + programs { + program { + name: "delete_button_clicked"; + signal: "mouse,clicked,1"; + source: CLUSTER_ALLPAGE_DELETE_BUTTON; + action: SIGNAL_EMIT SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED SIGNAL_SOURCE; + } + program { + name: "delete_button_mouse_down"; + signal: "mouse,down,1"; + source: CLUSTER_ALLPAGE_DELETE_BUTTON; + action: STATE_SET "press" 0.0; + target: CLUSTER_ALLPAGE_DELETE_BUTTON; + } + program { + name: "delete_button_mouse_up"; + signal: "mouse,up,1"; + source: CLUSTER_ALLPAGE_DELETE_BUTTON; + action: STATE_SET "show" 0.0; + target: CLUSTER_ALLPAGE_DELETE_BUTTON; + } + program { + name: "delete_button_show"; + signal: SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: CLUSTER_ALLPAGE_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "delete_button_hide"; + signal: SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: CLUSTER_ALLPAGE_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "add_button_clicked"; + signal: "mouse,clicked,1"; + source: "cluster_allpage_add_button_touch_rect"; + action: SIGNAL_EMIT SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED SIGNAL_SOURCE; + } + program { + name: "add_button_mouse_down"; + signal: "mouse,down,1"; + source: "cluster_allpage_add_button_touch_rect"; + action: STATE_SET "press" 0.0; + target: CLUSTER_ALLPAGE_ADD_BUTTON; + } + program { + name: "add_button_mouse_up"; + signal: "mouse,up,1"; + source: "cluster_allpage_add_button_touch_rect"; + action: STATE_SET "show" 0.0; + target: CLUSTER_ALLPAGE_ADD_BUTTON; + } + program { + name: "add_button_show"; + signal: SIGNAL_ALLPAGE_ADD_BUTTON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: CLUSTER_ALLPAGE_ADD_BUTTON; + target: "cluster_allpage_add_button_touch_rect"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "add_button_hide"; + signal: SIGNAL_ALLPAGE_ADD_BUTTON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: CLUSTER_ALLPAGE_ADD_BUTTON; + target: "cluster_allpage_add_button_touch_rect"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "drag_show"; + signal: SIGNAL_ALLPAGE_DRAG_BG_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: CLUSTER_ALLPAGE_DRAG_IMAGE; + } + program { + name: "drag_hide"; + signal: SIGNAL_ALLPAGE_DRAG_BG_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: CLUSTER_ALLPAGE_DRAG_IMAGE; + } + } + } +} \ No newline at end of file diff --git a/res/edje/cluster_page.edc b/res/edje/cluster_page.edc new file mode 100755 index 0000000..b79fe67 --- /dev/null +++ b/res/edje/cluster_page.edc @@ -0,0 +1,85 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + images { + image: "../res/images/btn_delete_nor.png" COMP; + image: "../res/images/btn_delete_press.png" COMP; + } + group { name: GROUP_CLUSTER_PAGE_LY; + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + } + } + part { name: CLUSTER_BG; + type: RECT; + description { + state: "default" 0.0; + align: 0 0; + visible: 0; + color : 0 0 0 0; + rel1{relative: 0.0 0.0; to: SIZE_SETTER;} + rel2{relative: 1.0 1.0; to: SIZE_SETTER;} + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + color : 0 0 0 50; + visible: 1; + rel1{relative: 0.05 0.05; to: SIZE_SETTER;} + rel2{relative: 0.95 0.95; to: SIZE_SETTER;} + } + } + part { name: CLUSTER_BOX; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1{relative: 0.0 0.0; to: CLUSTER_BG;} + rel2{relative: 1.0 1.0; to: CLUSTER_BG;} + } + } + } + programs { + program { + name: "edit_mode_on"; + signal: SIGNAL_EDIT_MODE_ON; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: SIZE_SETTER; + target: CLUSTER_BG; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "edit_mode_off"; + signal: SIGNAL_EDIT_MODE_OFF; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: SIZE_SETTER; + target: CLUSTER_BG; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + } + } +} \ No newline at end of file diff --git a/res/edje/color_classes.edc b/res/edje/color_classes.edc deleted file mode 100644 index de2453b..0000000 --- a/res/edje/color_classes.edc +++ /dev/null @@ -1,43 +0,0 @@ -/* -* Samsung API -* Copyright (c) 2009-2015 Samsung Electronics Co., Ltd. -* -* Licensed under the Apache License, Version 2.0 (the License); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/license/ -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an AS IS BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -color_classes { - color_class { - name: "ATO001"; - color: 22 22 22 255; - } - color_class { - name: "B041"; - color: 255 255 255 255; - } - color_class { - name: "B0223"; - color: 0 0 0 0; - } - color_class { - name: "B052L1"; - color: 0 0 0 0; - } - color_class { - name: "B052L1P"; - color: 0 0 0 0; - } - color_class { - name: "B052L1D"; - color: 0 0 0 0; - } -} diff --git a/res/edje/folder.edc b/res/edje/folder.edc deleted file mode 100644 index bc85dc9..0000000 --- a/res/edje/folder.edc +++ /dev/null @@ -1,619 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -images { - image: "folder_appicon_bg.png" COMP; - image: "folder_appicon_bg_possible.png" COMP; - image: "folder_appicon_bg_impossible.png" COMP; - image: "folder_appicon_empty_bg.png" COMP; - image: "folder_popup_bg.png" COMP; - image: "btn_input_clear.png" COMP; - image: "btn_add_nor.png" COMP; - image: "btn_add_press.png" COMP; -} - -collections { - - group { - name: GROUP_FOLDER_ICON_LAYOUT; - parts { - part { - name: "folder_bg"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0;} - rel2{relative: 1.0 1.0;} - } - description - { - state: "manage_state" 0.0; - inherit: "default" 0.0; - } - } - - part { - name: "folder_icon_exterior"; - type: IMAGE; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "folder_bg";} - rel2{relative: 1.0 1.0; to: "folder_bg";} - aspect: 1.0 1.0; - aspect_preference: BOTH; - image { - normal: "folder_appicon_bg.png"; - } - } - description { - state: "frame_possible" 0.0; - inherit: "default" 0.0; - image { - normal: "folder_appicon_bg_possible.png"; - } - } - description { - state: "frame_impossible" 0.0; - inherit: "default" 0.0; - image { - normal: "folder_appicon_bg_impossible.png"; - } - } - } - - part - { - name: "folder_icon_interior"; - type: IMAGE; - mouse_events: 1; - scale: 1; - description - { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "folder_bg";} - rel2{relative: 1.0 1.0; to: "folder_bg";} - aspect: 1.0 1.0; - aspect_preference: BOTH; - visible: 0; - image - { - normal: "folder_appicon_empty_bg.png"; - } - } - description - { - state: "empty_folder" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - name: "miniature_0"; - type: SWALLOW; - description { - state: "default" 0.0; - rel1{relative: MINIATURE_CENTER_MIN MINIATURE_CENTER_MIN; to: "folder_icon_exterior";} - rel2{relative: MINIATURE_CENTER_MAX MINIATURE_CENTER_MAX; to: "folder_icon_exterior";} - } - description { - state: "apps_1" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_CENTER_MIN MINIATURE_CENTER_MIN;} - rel2{relative: MINIATURE_CENTER_MAX MINIATURE_CENTER_MAX;} - } - description { - state: "apps_2" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_1_MIN MINIATURE_CENTER_MIN;} - rel2{relative: MINIATURE_COL_1_MAX MINIATURE_CENTER_MAX;} - } - description { - state: "apps_4" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_1_MIN MINIATURE_ROW_1_MIN;} - rel2{relative: MINIATURE_COL_1_MAX MINIATURE_ROW_1_MAX;} - } - } - part { - name: "miniature_1"; - type: SWALLOW; - description { - state: "default" 0.0; - rel1{relative: MINIATURE_CENTER_MIN MINIATURE_CENTER_MIN; to: "folder_icon_exterior";} - rel2{relative: MINIATURE_CENTER_MAX MINIATURE_CENTER_MAX; to: "folder_icon_exterior";} - } - description { - state: "apps_2" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_2_MIN MINIATURE_CENTER_MIN;} - rel2{relative: MINIATURE_COL_2_MAX MINIATURE_CENTER_MAX;} - } - description { - state: "apps_4" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_2_MIN MINIATURE_ROW_1_MIN;} - rel2{relative: MINIATURE_COL_2_MAX MINIATURE_ROW_1_MAX;} - } - } - part { - name: "miniature_2"; - type: SWALLOW; - description { - state: "default" 0.0; - rel1{relative: MINIATURE_CENTER_MIN MINIATURE_CENTER_MIN; to: "folder_icon_exterior";} - rel2{relative: MINIATURE_CENTER_MAX MINIATURE_CENTER_MAX; to: "folder_icon_exterior";} - } - description { - state: "apps_4" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_1_MIN MINIATURE_ROW_2_MIN;} - rel2{relative: MINIATURE_COL_1_MAX MINIATURE_ROW_2_MAX;} - } - } - part { - name: "miniature_3"; - type: SWALLOW; - description { - state: "default" 0.0; - rel1{relative: MINIATURE_CENTER_MIN MINIATURE_CENTER_MIN; to: "folder_icon_exterior";} - rel2{relative: MINIATURE_CENTER_MAX MINIATURE_CENTER_MAX; to: "folder_icon_exterior";} - } - description { - state: "apps_4" 0.0; - inherit: "default" 0.0; - rel1{relative: MINIATURE_COL_2_MIN MINIATURE_ROW_2_MIN;} - rel2{relative: MINIATURE_COL_2_MAX MINIATURE_ROW_2_MAX;} - } - } - } - - programs { - program { - name: "folder_clicked_program"; - signal :"mouse,clicked,1"; - source: "icon_content"; - action: SIGNAL_EMIT SIGNAL_FOLDER_CLICKED SIGNAL_SOURCE; - //after: program with change the icon shadow state to clicked! - } - program { - name: "set,miniatures,1"; - signal: "set,miniatures,1"; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_icon_interior"; - after: "content_update_1"; - } - program { - name: "content_update_1"; - action: STATE_SET "apps_1" 0.0; - target: "miniature_0"; - transition: DECELERATE 0.2; - } - - program { - name: "set,miniatures,2"; - signal: "set,miniatures,2"; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_icon_interior"; - after: "content_update_2"; - } - program { - name: "content_update_2"; - action: STATE_SET "apps_2" 0.0; - target: "miniature_0"; - target: "miniature_1"; - transition: DECELERATE 0.2; - } - - program { - name: "set,miniatures,4"; - signal: "set,miniatures,4"; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_icon_interior"; - after: "content_update_4"; - } - program { - name: "content_update_4"; - action: STATE_SET "apps_4" 0.0; - target: "miniature_0"; - target: "miniature_1"; - target: "miniature_2"; - target: "miniature_3"; - transition: DECELERATE 0.2; - } - program { - name: "show,bg,possible"; - signal: SIGNAL_FRAME_POSSIBLE_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "frame_possible" 0.0; - target: "folder_icon_exterior"; - } - program { - name: "show,bg,impossible"; - signal: SIGNAL_FRAME_IMPOSSIBLE_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "frame_impossible" 0.0; - target: "folder_icon_exterior"; - } - program { - name: "show,bg,default"; - signal: SIGNAL_FRAME_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_icon_exterior"; - } - program { - name: "show,bg,empty"; - signal: SIGNAL_EMPTY_BG_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "empty_folder" 0.0; - target: "folder_icon_interior"; - } - program { - name: "hide,bg,empty"; - action: STATE_SET "default" 0.0; - target: "folder_icon_interior"; - } - } - } - - group { - name: GROUP_FOLDER_ADD_ICON; - parts { - part { - name: "bg"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0;} - rel2{relative: 1.0 1.0;} - } - description - { - state: "manage_state" 0.0; - inherit: "default" 0.0; - } - } - part - { - name: "add_icon"; - type: IMAGE; - scale: 1; - mouse_events: 1; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: "bg";} - rel2 {relative: 1.0 1.0; to: "bg";} - aspect: 1.0 1.0; - aspect_preference: BOTH; - image { - normal: "btn_add_nor.png"; - } - } - description - { - state: "pressed" 0.0; - inherit: "default" 0.0; - image { - normal: "btn_add_press.png"; - } - } - } - } - programs { - program { - name: "add_pressed"; - signal: "mouse,down,1"; - source: "add_icon"; - action: STATE_SET "pressed" 0.0; - target: "add_icon"; - transition: DECELERATE 0.2; - } - program { - name: "add_released"; - signal: "mouse,up,1"; - source: "add_icon"; - action: STATE_SET "default" 0.0; - target: "add_icon"; - transition: DECELERATE 0.2; - } - } - } - - group { - name: GROUP_FOLDER_WINDOW; - parts { - part { - name: "bg"; //this part should be rect because click on it should close the folder. - type: RECT; - mouse_events: 1; - repeat_events: 0; - description { - state: "default" 0.0; - color: 0 0 0 0; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - } - } - } - programs { - program { - name: "background_clicked_cb"; - signal: "mouse,clicked,1"; - source: "bg"; - action: SIGNAL_EMIT "bg_clicked" SIGNAL_SOURCE; - } - } - } - - group - { - name: GROUP_FOLDER_POPUP; - parts - { - part - { - name: "folder_bg"; - type: IMAGE; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 0.0;} - image { - normal: "folder_popup_bg.png"; - border: 5 5 5 5; - } - } - description { - state: "done"; - inherit: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 1.0;} - } - } - part - { - name: "separator"; - type: RECT; - description - { - state: "default" 0.0; - rel1 {relative: FOLDER_LEFT_MARGIN FOLDER_SEPARATOR_Y_MIN; to: "folder_bg";} - rel2 {relative: FOLDER_RIGHT_MARGIN FOLDER_SEPARATOR_Y_MAX; to: "folder_bg";} - color: 0 0 255 150; - } - } - part - { - name: PART_FOLDER_NAME; //align y 0.0 - type: SWALLOW; - description - { - state: "default" 0.0; - rel1 {relative: 0.15 FOLDER_NAME_Y_MIN; to: "folder_bg";} - rel2 {relative: 0.85 FOLDER_NAME_Y_MAX; to: "folder_bg";} - color: 0 0 0 0; - visible: 0; - } - description { - state: "done" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: PART_FOLDER_UNNAMED_TEXT; - type: TEXT; - mouse_events: 1; - repeat_events: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to: PART_FOLDER_NAME;} - rel2 { relative: 1.0 1.0; to: PART_FOLDER_NAME;} - color: 0 0 0 255; - visible: 0; - text { - text: ""; - size: 26; - } - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part - { - name: "folder_clear_text_btn"; - type: IMAGE; - description { - state: "default" 0.0; - rel1 {relative: 1.02 0.12; to: PART_FOLDER_NAME;} - rel2 {relative: 1.10 0.88; to: PART_FOLDER_NAME;} - aspect_preference: BOTH; - image - { - normal: "btn_input_clear.png"; - } - visible: 0; - } - description - { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - description - { - state: "dim" 0.0; - inherit: "visible"; - color: 20 20 20 255; - } - } - part - { - name: "folder_entry_block"; - type: RECT; - repeat_events: 0; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: PART_FOLDER_NAME;} - rel2 {relative: 1.0 1.0; to: PART_FOLDER_NAME;} - color: 0 0 0 0; - visible: 0; - } - description - { - state: "block_on" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part - { - name: PART_FOLDER_CONTENT; //align y 1.0 - type: SWALLOW; - description - { - state: "default"; - rel1 {relative: FOLDER_LEFT_MARGIN FOLDER_CONTENT_Y_MIN; to: "folder_bg";} - rel2 {relative: FOLDER_RIGHT_MARGIN FOLDER_CONTENT_Y_MAX; to: "folder_bg";} - color: 0 0 0 0; - } - } - } - programs - { - //Clear button programs - program - { - name: "clear_button_show"; - signal: SIGNAL_CLEAR_BTN_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: "folder_clear_text_btn"; - } - program - { - name: "clear_button_hide"; - signal: SIGNAL_CLEAR_BTN_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_clear_text_btn"; - } - program - { - name: "folder_entry_block_on"; - signal: SIGNAL_ENTRY_BLOCK_ON; - source: SIGNAL_SOURCE; - action: STATE_SET "block_on" 0.0; - target: "folder_entry_block"; - } - program - { - name: "folder_entry_block_off"; - signal: SIGNAL_ENTRY_BLOCK_OFF; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "folder_entry_block"; - } - program - { - name: "clear_btn_clicked"; - signal: "mouse,clicked,1"; - source: "folder_clear_text_btn"; - action: SIGNAL_EMIT SIGNAL_CLEAR_BTN_CLICKED SIGNAL_SOURCE; - } - program - { - name: "clear_btn_mouse_down"; - signal: "mouse,down,1"; - source: "folder_clear_text_btn"; - action: STATE_SET "dim" 0.0; - target: "folder_clear_text_btn"; - } - program - { - name: "clear_btn_mouse_up"; - signal: "mouse,up,1"; - source: "folder_clear_text_btn"; - action: STATE_SET "visible" 0.0; - target: "folder_clear_text_btn"; - } - //Animations - program { - name: "folder_open_animation"; - signal: SIGNAL_FOLDER_PANEL_OPEN; - source: SIGNAL_SOURCE; - action: STATE_SET "done" 0.0; - target: "folder_bg"; - after: "show_entry_program"; - transition: DECELERATE 0.3; - } - program { - name: "show_entry_program"; - action: STATE_SET "done" 0.0; - target: PART_FOLDER_NAME; - } - program { - name: "folder_close_animation_start"; - signal: SIGNAL_FOLDER_PANEL_CLOSE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_FOLDER_NAME; - after: "folder_close_animation"; - } - program { - name: "folder_close_animation"; - action: STATE_SET "default" 0.0; - target: "folder_bg"; - after: "folder_close_animation_done"; - transition: DECELERATE 0.3; - } - program { - name: "folder_close_animation_done"; - action: SIGNAL_EMIT SIGNAL_FOLDER_ANIM_DONE SIGNAL_SOURCE; - } - program { - name: "unnamed_text_show"; - signal: SIGNAL_FOLDER_UNNAMED_TEXT_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: PART_FOLDER_UNNAMED_TEXT; - } - program { - name: "unnamed_text_hide"; - signal: SIGNAL_FOLDER_UNNAMED_TEXT_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_FOLDER_UNNAMED_TEXT; - } - } - } -} diff --git a/res/edje/folder_entry.edc b/res/edje/folder_entry.edc deleted file mode 100644 index dae6e60..0000000 --- a/res/edje/folder_entry.edc +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -collections { - base_scale: 1.8; - group { - name: "elm/entry/base-single/default"; - styles { - style { name: "entry_single_textblock_style"; - base: "font=Tizen:style=Regular color=#00000000 align=center font_size=26 style=shadow shadow_color=#000000bf wrap=word"; - } - style { name: "entry_single_textblock_disabled_style"; - base: "font=Tizen:style=Regular color=#00000000 align=center font_size=26 style=shadow shadow_color=#000000bf wrap=word"; - } - } - data { - item: context_menu_orientation "horizontal"; - } - parts { - part { - name: "entry.swallow.background"; - type: SWALLOW; - scale: 1; - description { - state: "default" 0.0; - visible: 1; - rel1 { relative: 0 0; to: "elm.text"; } - rel2 { relative: 1 1; to: "elm.text"; } - } - } - } - parts { - part { - name: "elm.text"; - type: TEXTBLOCK; - mouse_events: 1; - scale: 1; - entry_mode: EDITABLE; - multiline: 0; - source: "elm/entry/selection/default"; - source4: "elm/entry/cursor/default"; - source5: "elm/entry/anchor/default"; - description { - state: "default" 0.0; - text { - style: "entry_single_textblock_style"; - min: 1 1; - max: 0 1; - ellipsis: -1; - } - } - description { - state: "disabled" 0.0; - inherit: "default" 0.0; - text { - style: "entry_single_textblock_disabled_style"; - } - } - } - } - programs { - program { - name: "focus"; - signal: "load"; - source: ""; - action: FOCUS_SET; - target: "elm.text"; - } - program { - name: "disable"; - signal: "elm,state,disabled"; - source: "elm"; - action: STATE_SET "disabled" 0.0; - target: "elm.text"; - } - program { - name: "enable"; - signal: "elm,state,enabled"; - source: "elm"; - action: STATE_SET "default" 0.0; - target: "elm.text"; - } - } - } - group { - name: "elm/entry/cursor/default"; - parts { - part { - name: "clip2"; - type: RECT; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1.to: "clip"; - rel2.to: "clip"; - visible: 0; - } - description { - state: "focused" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: "clip"; - type: RECT; - mouse_events: 0; - scale: 1; - clip_to: "clip2"; - description { - state: "default" 0.0; - rel1.offset: -10 0; - rel2.offset: 9 9; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - part { - name: "base"; - type: RECT; - mouse_events: 0; - scale: 1; - clip_to: "clip"; - description { - state: "default" 0.0; - min: 2 2; - align: 0.5 1.0; - color: 0 0 0 0; - } - } - part { - name: "glow"; - type: RECT; - mouse_events: 0; - scale: 1; - clip_to: "clip2"; - description { - state: "default" 0.0; - min: 4 0; - fixed: 1 0; - align: 0.5 0.5; - rel1 { - relative: 0.0 0.0; - offset: 0 2; - } - rel2 { - relative: 0.0 1.0; - offset: 0 -2; - } - color: 42 137 194 255; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - color: 0 0 0 0; - } - } - } - programs { - program { - name: "show"; - action: STATE_SET "hidden" 0.0; - in: 0.6 0.0; - target: "glow"; - after: "show4"; - } - program { - name: "show4"; - action: STATE_SET "default" 0.0; - in: 0.6 0.0; - target: "glow"; - after: "show"; - } - program { - name: "focused"; - signal: "elm,action,focus"; - source: "elm"; - action: STATE_SET "focused" 0.0; - target: "clip2"; - after: "show4"; - } - program { - name: "unfocused"; - signal: "elm,action,unfocus"; - source: "elm"; - action: STATE_SET "default" 0.0; - target: "clip2"; - after: "stop_glow"; - } - program { - name: "stop_glow"; - action: ACTION_STOP; - target: "show"; - target: "show4"; - } - } - } - group { name: "elm/entry/selection/default"; - parts { - part { - name: "bg"; - type: RECT; - scale: 1; - mouse_events: 0; - description { - state: "default" 0.0; - color: 138 183 223 128; - } - } - } - } - group { - name: "elm/entry/anchor/default"; - parts { - part { - name: "bg"; - type: RECT; - scale: 1; - mouse_events: 0; - description { - state: "default" 0.0; - color: 128 0 0 64; - } - } - } - } -} diff --git a/res/edje/home.edc b/res/edje/home.edc old mode 100644 new mode 100755 index 1f1ebf2..5398e9b --- a/res/edje/home.edc +++ b/res/edje/home.edc @@ -14,726 +14,24 @@ * limitations under the License. */ -#include "../../inc/conf.h" - -images { - image: "home_button_bg.png" COMP; - image: "home_icon_home.png" COMP; - image: "home_icon_menu.png" COMP; - image: "all_apps_icon_menu.png" COMP; - image: "home_icon_reorder.png" COMP; -} +#include "../../inc/edc_conf.h" collections { - group { - name: "home_ly"; - parts { - part { - name: "bg_spacer"; - type: SPACER; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - /* - * This is temporary fix due to strange elm_box bechaviour in the index swallow. - * Box has dynamic size which affects whole layout. - */ - min: 720 1280; - max: 720 1280; - } - } - part { - name: "content"; - type: SWALLOW; - mouse_events: 1; - repeat_events: 1; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: 0.0 0.0/*HOME_WGT_MIN_Y*/; - rel2.relative: 1.0 1.0/*HOME_WGT_MAX_Y*/; - } - } - - /*======================CHOOSER CAPTION=========================*/ - part { - name: "chooser_caption"; - type: SPACER; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: 0.0 HOME_CHOOSER_CAPTION_Y_MIN; - rel2.relative: 1.0 HOME_CHOOSER_CAPTION_Y_MAX; - } - } - part { - name: PART_CHOOSER_CAPTION_MIDDLE_LABEL; - type: TEXT; - scale: 1; - description - { - state: "default" 0.0; - visible: 0; - color: 255 255 255 255; - text - { - align: 0.5 0.90; - text:"999 selected"; - size: 36; - } - rel1 - { - relative: 0.30 0.0; - to: "chooser_caption"; - } - rel2 - { - relative: 0.70 1.0; - to: "chooser_caption"; - } - } - description { - state: "chooser_activated" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: PART_CHOOSER_CAPTION_LEFT_LABEL; - type: TEXT; - scale: 1; - description - { - color: 255 255 255 255; - state: "default" 0.0; - visible: 0; - text - { - align: 0.25 0.90; - size: 28; - text: "CANCEL"; - } - rel1 - { - relative: 0.0 0.0; - to: "chooser_caption"; - } - rel2 - { - relative: 0.33 1.0; - to: "chooser_caption"; - } - } - description { - state: "chooser_activated" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: "chooser_caption_left_clickable_space"; - type: RECT; - mouse_events: 1; - scale: 0; - description - { - state: "default" 0.0; - color: 0 0 0 0; - visible: 0; - rel1 - { - to: "chooser_caption_left_label"; - relative: 0.0 0.0; - } - rel2 - { - to: "chooser_caption_left_label"; - relative: 1.0 1.0; - } - } - description { - state: "chooser_activated" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: PART_CHOOSER_CAPTION_RIGHT_LABEL; - type: TEXT; - scale: 1; - description - { - state: "default" 0.0; - visible: 0; - color: 255 255 255 255; - text - { - align: (1.0 - 0.25) 0.90; - size: 28; - text: "DONE"; - } - rel1 - { - relative: 0.66 0.0; - to: "chooser_caption"; - } - rel2 - { - relative: 1.0 1.0; - to: "chooser_caption"; - } - } - description { - state: "chooser_activated" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: "chooser_caption_right_clickable_space"; - type: RECT; - mouse_events: 1; - scale: 0; - description - { - state: "default" 0.0; - visible: 0; - color: 0 0 0 0; - rel1 - { - to: "chooser_caption_right_label"; - relative: 0.0 0.0; - } - rel2 - { - to: "chooser_caption_right_label"; - relative: 1.0 1.0; - } - } - description { - state: "chooser_activated" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - /*==================== BUTTON : MENU IMPLEMENATION ===============*/ - part { - name: "menu_btn"; - type: SPACER; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: HOME_MENU_BTN_X_MIN HOME_BTNS_Y_MIN; - rel2.relative: HOME_MENU_BTN_X_MAX HOME_BTNS_Y_MAX; - } - } - part { - name: "menu_btn_bg"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to: "menu_btn"; } - rel2 { relative: 1.0 1.0; to: "menu_btn"; } - color: 0 0 0 40; - visible: 1; - image { - normal: "home_button_bg.png"; - } - } - description { - state: "press" 0.0; - inherit: "default" 0.0; - color: 255 255 255 40; - } - description { - state: "chooser_activated" 0.0; - visible: 0; - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - part { - name: "home_view_menu_icon"; - type: IMAGE; - mouse_events: 0; - repeat_events: 1; - scale: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.27 0.1; to: "menu_btn"; } - rel2 { relative: 0.73 0.9; to: "menu_btn"; } - color: 255 255 255 255; - visible: 1; - image - { - normal: "home_icon_menu.png"; - } - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - color: 255 255 255 0; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "all_apps_view_state" 0.0; - visible: 0; - } - } - part - { - name: "all_apps_view_menu_icon"; - type: IMAGE; - mouse_events: 0; - repeat_events: 1; - scale: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.27 0.1; to: "menu_btn"; } - rel2 { relative: 0.73 0.9; to: "menu_btn"; } - color: 255 255 255 0; - visible: 1; - image - { - normal: "all_apps_icon_menu.png"; - } - } - description - { - state: "chooser_activated" 0.0; - visible: 0; - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "all_apps_view_state" 0.0; - visible: 0; - } - } - - /*==================== BUTTON : HOME ICON IMPLEMENTATION ===============*/ - part { - name: "home"; - type: SPACER; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: HOME_HOME_BTN_X_MIN HOME_BTNS_Y_MIN; - rel2.relative: HOME_HOME_BTN_X_MAX HOME_BTNS_Y_MAX; - } - } - part { - name: "home_btn_bg"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to: "home"; } - rel2 { relative: 1.0 1.0; to: "home"; } - color: 0 0 0 40; - visible: 1; - image { - normal: "home_button_bg.png"; - } - } - description { - state: "press" 0.0; - inherit: "default" 0.0; - color: 255 255 255 40; - } - description { - state: "chooser_activated" 0.0; - visible: 0; - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - part - { - name: "home_view_home_icon"; - type: IMAGE; - mouse_events: 0; - repeat_events: 1; - scale: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.27 0.1; to: "home"; } - rel2 { relative: 0.73 0.9; to: "home"; } - color: 255 255 255 255; - visible: 1; - image - { - normal: "home_icon_reorder.png"; - } - } - description - { - state: "chooser_activated" 0.0; - visible: 0; - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - color: 255 255 255 0; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - } - description - { - state: "home_edit_state" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "all_apps_view_state" 0.0; - visible: 0; - } - } - - part - { - name: "all_apps_view_home_icon"; - type: IMAGE; - mouse_events: 0; - repeat_events: 1; - scale: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.27 0.1; to: "home"; } - rel2 { relative: 0.73 0.9; to: "home"; } - color: 255 255 255 0; - visible: 1; - image - { - normal: "home_icon_home.png"; - } - } - description - { - state: "chooser_activated" 0.0; - visible: 0; - } - description - { - state: "all_apps_view_state" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - } - description - { - state: "home_view_state" 0.0; - inherit: "default" 0.0; - color: 255 255 255 0; - } - description - { - state: "home_edit_state" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description - { - state: "all_apps_edit_state" 0.0; - inherit: "all_apps_view_state" 0.0; - visible: 0; - } - } - - /*==================== DYNAMIC INDEX: ===============*/ - part { - name: PART_INDEX; - type: SWALLOW; - scale: 0; - description { - state: "default" 0.0; - rel1.relative: HOME_PG_INDEX_X_MIN HOME_BTNS_Y_MIN; - rel2.relative: HOME_PG_INDEX_X_MAX HOME_BTNS_Y_MAX; - } - } - part { - name: PART_NEXT_PAGE_INDICE; - type: RECT; - scale: 0; - description { - state: "default" 0.0; - color: 20 20 100 100; - rel1.relative: INDICE_NEXT_PAGE_X_MIN HOME_WGT_MIN_Y; - rel2.relative: INDICE_NEXT_PAGE_X_MAX HOME_WGT_EDIT_MAX_Y; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: PART_PREV_PAGE_INDICE; - type: RECT; - scale: 0; - description { - state: "default" 0.0; - color: 20 20 100 100; - rel1.relative: INDICE_PREV_PAGE_X_MIN HOME_WGT_MIN_Y; - rel2.relative: INDICE_PREV_PAGE_X_MAX HOME_WGT_EDIT_MAX_Y; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { - name: PART_EVENT_BLOCKER; - type: RECT; - mouse_events: 1; - repeat_events: 0; - description { - state: "default" 0.0; - visible: 0; - rel1 {relative: 0.0 0.0; to: "bg_spacer";} - rel2 {relative: 1.0 1.0; to: "bg_spacer";} - color: 0 0 0 0; - } - description { - state: "blocked" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - /*============== PROGRAMS TO OPERATE ON bottom buttons =============*/ - programs { - program { - name: "menu_btn_down"; - signal: "mouse,down,1"; - source: "menu_btn_bg"; - action: STATE_SET "press" 0.0; - target: "menu_btn_bg"; - transition: DECELERATE 0.1; - } - program { - name: "menu_btn_up"; - signal: "mouse,up,1"; - source: "menu_btn_bg"; - action: STATE_SET "default" 0.0; - target: "menu_btn_bg"; - transition: DECELERATE 0.1; - } - program { - name: "menu_btn_click"; - signal: "mouse,clicked,1"; - source: "menu_btn_bg"; - action: SIGNAL_EMIT SIGNAL_MENU_BTN_CLICKED SIGNAL_SOURCE; - } - program { - name: "home_btn_down"; - signal: "mouse,down,1"; - source: "home_btn_bg"; - action: STATE_SET "press" 0.0; - target: "home_btn_bg"; - transition: DECELERATE 0.1; - } - program { - name: "home_btn_up"; - signal: "mouse,up,1"; - source: "home_btn_bg"; - action: STATE_SET "default" 0.0; - target: "home_btn_bg"; - transition: DECELERATE 0.1; - } - program { - name: "home_btn_click"; - signal: "mouse,clicked,1"; - source: "home_btn_bg"; - action: SIGNAL_EMIT SIGNAL_HOME_BTN_CLICKED SIGNAL_SOURCE; - } - program - { - name: "menu_icon_home_view_state_set"; - signal: SIGNAL_BOTTOM_BUTTONS_HOME_STATE_SET; - source: SIGNAL_SOURCE; - action: STATE_SET "home_view_state" 0.0; - target: "home_view_menu_icon"; - target: "all_apps_view_menu_icon"; - target: "home_view_home_icon"; - target: "all_apps_view_home_icon"; - target: "menu_btn_bg"; - target: "home_btn_bg"; - transition: LINEAR 0.3; - } - program - { - name: "menu_icon_all_apps_view_state_set"; - signal: SIGNAL_BOTTOM_BUTTONS_ALL_APPS_STATE_SET; - source: SIGNAL_SOURCE; - action: STATE_SET "all_apps_view_state" 0.0; - target: "home_view_menu_icon"; - target: "all_apps_view_menu_icon"; - target: "home_view_home_icon"; - target: "all_apps_view_home_icon"; - target: "menu_btn_bg"; - target: "home_btn_bg"; - transition: LINEAR 0.3; - } - program - { - name: "menu_icon_home_edit_state_set"; - signal: SIGNAL_BOTTOM_BUTTONS_HOME_EDIT_STATE_SET; - source: SIGNAL_SOURCE; - script { - set_state(PART:"home_view_home_icon","home_edit_state",0.0); - set_state(PART:"all_apps_view_home_icon","home_edit_state",0.0); - set_state(PART:"home_view_menu_icon","all_apps_edit_state",0.0); - set_state(PART:"all_apps_view_menu_icon","all_apps_edit_state",0.0); - set_state(PART:"menu_btn_bg","all_apps_edit_state",0.0); - set_state(PART:"home_btn_bg","all_apps_edit_state",0.0); - } - } - program - { - name: "menu_icon_all_apps_edit_state_set"; - signal: SIGNAL_BOTTOM_BUTTONS_ALL_APPS_EDIT_STATE_SET; - source: SIGNAL_SOURCE; - action: STATE_SET "all_apps_edit_state" 0.0; - target: "home_view_menu_icon"; - target: "all_apps_view_menu_icon"; - target: "home_view_home_icon"; - target: "all_apps_view_home_icon"; - target: "menu_btn_bg"; - target: "home_btn_bg"; - } - - /*============== PROGRAMS TO OPERATE ON CHOOSER CAPTION =============*/ - program { - name: "chooser_caption_activate"; - signal: SIGNAL_CHOOSER_CAPTION_ACTIVATE; - source: SIGNAL_SOURCE; - action: STATE_SET "chooser_activated" 0.0; - target: "chooser_caption_middle_label"; - target: "chooser_caption_left_label"; - target: "chooser_caption_left_clickable_space"; - target: "chooser_caption_right_label"; - target: "chooser_caption_right_clickable_space"; - target: "all_apps_view_menu_icon"; - target: "menu_btn_bg"; - target: "home_btn_bg"; - target: "all_apps_view_home_icon"; - } - program { - name: "chooser_caption_deactivate"; - signal: SIGNAL_CHOOSER_CAPTION_DEACTIVATE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "chooser_caption_middle_label"; - target: "chooser_caption_left_label"; - target: "chooser_caption_left_clickable_space"; - target: "chooser_caption_right_label"; - target: "chooser_caption_right_clickable_space"; - target: "menu_btn_bg"; - target: "all_apps_view_menu_icon"; - target: "home_btn_bg"; - target: "all_apps_view_home_icon"; - } - /*============= PROGRAMS TO OPERATOE ON INDICES =====================*/ - program { - name: "next_page_indice_show"; - signal: SIGNAL_NEXT_PAGE_INDICE_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: PART_NEXT_PAGE_INDICE; - } - program { - name: "prev_page_indice_show"; - signal: SIGNAL_PREV_PAGE_INDICE_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: PART_PREV_PAGE_INDICE; - } - program { - name: "indice_off_program"; - signal: SIGNAL_INDICE_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_PREV_PAGE_INDICE; - target: PART_NEXT_PAGE_INDICE; - } - program { - name: "block_events"; - signal: SIGNAL_BLOCK_EVENTS; - source: SIGNAL_SOURCE; - action: STATE_SET "blocked" 0.0; - target: PART_EVENT_BLOCKER; - } - program { - name: "unblock_events"; - signal: SIGNAL_UNBLOCK_EVENTS; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_EVENT_BLOCKER; - in: 0.1 0.0; - } - } - } -} + images { + } + group { name: GROUP_HOME_LY; + parts { + part { name: HOME_BG; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + } + } + } + programs { + } + } +} \ No newline at end of file diff --git a/res/edje/home_btn.edc b/res/edje/home_btn.edc new file mode 100755 index 0000000..125bd01 --- /dev/null +++ b/res/edje/home_btn.edc @@ -0,0 +1,277 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + images { + image: "../res/images/home_button_bg.png" COMP; + image: "../res/images/home_button_menu.png" COMP; + image: "../res/images/home_button_home.png" COMP; + image: "../res/images/home_button_apps.png" COMP; + } + group { name: GROUP_HOME_BTN_LY; + parts { + // Menu button + part { name: MENU_BUTTON; + type: IMAGE; + description { state: "default" 0.0; + align: 0 0; + rel1{relative: 0.044 0.928;} + rel2{relative: 0.223 0.986;} + color: 0 0 0 40; + visible: 1; + image { + normal: "../res/images/home_button_bg.png"; + } + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 255 255 255 40; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + } + part { name: "menu_btn_icon"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1{relative: 0.27 0.1; to:MENU_BUTTON;} + rel2{relative: 0.73 0.9; to:MENU_BUTTON;} + color: 255 255 255 255; + visible: 1; + image { + normal: "../res/images/home_button_menu.png"; + } + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 0; + } + } + //Home Button + part { name: HOME_BUTTON; + type: IMAGE; + description {state: "default" 0.0; + align: 0 0; + rel1{relative: 0.776 0.928;} + rel2{relative: 0.955 0.986;} + color: 0 0 0 40; + visible: 1; + image { + normal: "../res/images/home_button_bg.png"; + } + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color : 255 255 255 40; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + } + part { name: "home_btn_home_icon"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1{relative: 0.27 0.1; to:HOME_BUTTON;} + rel2{relative: 0.73 0.9; to:HOME_BUTTON;} + color: 255 255 255 0; + visible: 1; + image { + normal: "../res/images/home_button_home.png"; + } + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 0; + } + } + part { name: "home_btn_app_icon"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + align: 0 0; + rel1{relative: 0.27 0.1; to:HOME_BUTTON;} + rel2{relative: 0.73 0.9; to:HOME_BUTTON;} + color: 255 255 255 255; + visible: 1; + image { + normal: "../res/images/home_button_apps.png"; + } + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 0; + } + } + } + programs { + //menu button event + program { + name: "menu_btn_down"; + signal: "mouse,down,1"; + source: MENU_BUTTON; + action: STATE_SET "press" 0.0; + target: MENU_BUTTON; + transition: DECELERATE 0.1; + } + program { + name: "menu_btn_up"; + signal: "mouse,up,1"; + source: MENU_BUTTON; + action: STATE_SET "default" 0.0; + target: MENU_BUTTON; + transition: DECELERATE 0.1; + } + program { + name: "menu_btn_click"; + signal: "mouse,clicked,1"; + source: MENU_BUTTON; + action: SIGNAL_EMIT SIGNAL_MENU_BTN_CLICKED SIGNAL_SOURCE; + } + //home button event + program { + name: "home_btn_down"; + signal: "mouse,down,1"; + source: HOME_BUTTON; + action: STATE_SET "press" 0.0; + target: HOME_BUTTON; + transition: DECELERATE 0.1; + } + program { + name: "home_btn_up"; + signal: "mouse,up,1"; + source: HOME_BUTTON; + action: STATE_SET "default" 0.0; + target: HOME_BUTTON; + transition: DECELERATE 0.1; + } + program { + name: "home_btn_click"; + signal: "mouse,clicked,1"; + source: HOME_BUTTON; + action: SIGNAL_EMIT SIGNAL_HOME_BTN_CLICKED SIGNAL_SOURCE; + } + program { + name: "home_btn_show"; + signal: SIGNAL_HOME_BTN_ICON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: "home_btn_home_icon"; + transition: DECELERATE 0.3; + } + program { + name: "home_btn_hide"; + signal: SIGNAL_HOME_BTN_ICON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: "home_btn_home_icon"; + transition: DECELERATE 0.3; + } + program { + name: "apps_btn_show"; + signal: SIGNAL_APPS_BTN_ICON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: "home_btn_app_icon"; + transition: DECELERATE 0.3; + } + program { + name: "apps_btn_hide"; + signal: SIGNAL_APPS_BTN_ICON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: "home_btn_app_icon"; + transition: DECELERATE 0.3; + } + program { + name: "btn_show_home"; + signal: SIGNAL_BTN_SHOW_APPS_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: MENU_BUTTON; + target: "menu_btn_icon"; + target: HOME_BUTTON; + target: "home_btn_home_icon"; + transition: DECELERATE 0.3; + } + program { + name: "btn_hide_home"; + signal: SIGNAL_BTN_HIDE_APPS_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: MENU_BUTTON; + target: "menu_btn_icon"; + target: HOME_BUTTON; + target: "home_btn_home_icon"; + transition: DECELERATE 0.3; + } + program { + name: "btn_show_apps"; + signal: SIGNAL_BTN_SHOW_HOME_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: MENU_BUTTON; + target: "menu_btn_icon"; + target: HOME_BUTTON; + target: "home_btn_app_icon"; + transition: DECELERATE 0.3; + } + program { + name: "btn_hide_apps"; + signal: SIGNAL_BTN_HIDE_HOME_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "hide" 0.0; + target: MENU_BUTTON; + target: "menu_btn_icon"; + target: HOME_BUTTON; + target: "home_btn_app_icon"; + transition: DECELERATE 0.3; + } + } + } +} \ No newline at end of file diff --git a/res/edje/icon.edc b/res/edje/icon.edc deleted file mode 100644 index 6fbbde2..0000000 --- a/res/edje/icon.edc +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -images { - image: "app_press_117.png" COMP; - image: "btn_delete_nor.png" COMP; - image: "btn_delete_press.png" COMP; - image: "app_icon_checkbox_bg.png" COMP; - image: "app_icon_checkbox_on.png" COMP; - image: "app_icon_checkbox_border.png" COMP; - image: "icon_badge_container.png" COMP; -} - -styles { - style{ - name: "icon_label"; - base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=28 wrap=mixed ellipsis=1.0"; - } - style{ - name: "icon_label_edit"; - base: "font=Samsung Condensed:style=Regular align=center color=#FFFFFFFF font_size=25 wrap=mixed ellipsis=1.0"; - } -} - -collections { - group { - name: "app_icon_layout"; - script { - public checkbox_state; - public alpha; - - public message(Msg_Type:type, id, ...) { - if(type == MSG_INT_SET) - { - set_int(alpha, getarg(2)); - send_message(type, id, getarg(2)); - } - } - } - parts { - part { //"icon_bg" - name: "icon_bg"; - type: SPACER; - mouse_events: 1; - repeat_events: 1; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; } - rel2{relative: 1.0 1.0; } - } - description { - state: "moved" 0.0; - inherit: "default" 0.0; - } - description { - state: "edit" 0.0; - inherit: "default" 0.0; - } - description - { - state: "manage_state" 0.0; - inherit: "default" 0.0; - } - } - - part { //PART_ICON_CONTENT - name: PART_ICON_CONTENT; - type: SWALLOW; - mouse_events: 1; - repeat_events: 1; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: ICON_X_MIN ICON_Y_MIN; to: "icon_bg";} - rel2{relative: ICON_X_MAX ICON_Y_MAX; to: "icon_bg";} - } - } - - - part { //"icon_content_touch" - name: "icon_content_touch"; - type: IMAGE; - mouse_events: 1; - repeat_events: 1; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: PART_ICON_CONTENT;} - rel2{relative: 1.0 1.0; to: PART_ICON_CONTENT;} - aspect: 1.0 1.0; - aspect_preference: BOTH; - color: 0 0 0 0; - image { - normal: "app_press_117.png"; - } - } - description{ - state: "icon_touched" 0.0; - inherit: "default" 0.0; - color: 0 0 0 150; - } - } - - part { //PART_ICON_NAME - name: PART_ICON_NAME; - type: TEXTBLOCK; - mouse_events: 1; - repeat_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1{relative: ICON_NAME_X_MIN ICON_NAME_Y_MIN; to: "icon_bg";} - rel2{relative: ICON_NAME_X_MAX 1.0; to: "icon_bg";} - color: 255 255 255 255; - text { - style: "icon_label"; - align: 0.5 0.0; - } - } - description { - state: "edit" 0.0; - inherit: "default" 0.0; - rel1{relative: ICON_NAME_X_MIN ICON_NAME_Y_MIN; to: "icon_bg";} - rel2{relative: ICON_NAME_X_MAX 1.0; to: "icon_bg";} - text { - style: "icon_label_edit"; - } - } - description { - state: "black_text" 0.0; - inherit: "default" 0.0; - color: 0 0 0 255; - } - description { - state: "black_edit" 0.0; - inherit: "black_text" 0.0; - text { - style: "icon_label_edit"; - } - } - } - - - /*************************** BADGE *************************************/ - - part - { - name: "icon_badge"; - type: IMAGE; - scale: 0; - description - { - state: "default" 0.0; - rel1{relative: 0.0 0.0; offset: -10 -1; to: "icon_badge_text";} - rel2{relative: 1.0 1.0; offset: 9 1; to: "icon_badge_text";} - visible: 0; - image - { - normal: "icon_badge_container.png"; - border: 15 14 0 0; - } - } - description - { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part - { - name: "icon_badge_text"; - type: TEXT; - scale: 1; - description - { - state: "default" 0.0; - visible: 0; - fixed: 1 1; - color: 255 255 255 255; - rel1{relative: BADGE_REL_X BADGE_REL_Y; to: "icon_bg";} - rel2{relative: BADGE_REL_X BADGE_REL_Y; to: "icon_bg";} - align: 1.0 0.0; - text - { - font: "arial"; - size: 32; - text_class: "ATO002"; - min: 1 1; - max: 1 1; - ellipsis: -1; - } - } - description - { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - /*************************** END OF BADGE *************************************/ - - part { //"icon_uninstall_button"; - name: "icon_uninstall_button"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "icon_bg";} - rel2{relative: ICON_UNINSTALL_BTN_X_MAX ICON_UNINSTALL_BTN_Y_MAX; to: "icon_bg";} - color: 255 255 255 0; - visible: 0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - image { - normal: "btn_delete_nor.png"; - } - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - description { - state: "press" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - image { - normal: "btn_delete_press.png"; - } - visible: 1; - } - } - - /*Icons checkboxes in choose state:*/ - part { //"icon_checkbox_bg"; - name: "icon_checkbox_bg"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: ICON_BADGE_CHECKBOX_REL1_X ICON_BADGE_CHECKBOX_REL1_Y; to: "icon_bg";} - rel2{relative: ICON_BADGE_CHECKBOX_REL2_X ICON_BADGE_CHECKBOX_REL2_Y; to: "icon_bg";} - color: 255 255 255 120; - visible: 0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - //TODO: image from home-lite is used... - image { - normal: "app_icon_checkbox_bg.png"; - } - } - description { - state: "blank" 0.0; - inherit: "default" 0.0; - visible: 1; - } - description { - state: "dimmed" 0.0; - inherit: "blank" 0.0; - } - description { - state: "checked" 0.0; - inherit: "default" 0.0; - //color_class: "ATO005"; - color: 255 255 255 255; - visible: 1; - } - } - - part { //"icon_checkbox_border"; - name: "icon_checkbox_border"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "icon_checkbox_bg";} - rel2{relative: 1.0 1.0; to: "icon_checkbox_bg";} - color: 255 255 255 0; - visible: 0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - image { - normal: "app_icon_checkbox_border.png"; - } - } - description { - state: "blank" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - description { - state: "dimmed" 0.0; - inherit: "blank" 0.0; - } - description { - state: "checked" 0.0; - inherit: "default" 0.0; - color: 255 255 255 120; - visible: 1; - } - } - - part { //"icon_checkbox" - name: "icon_checkbox"; - type: IMAGE; - scale: 0; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "icon_checkbox_bg";} - rel2{relative: 1.0 1.0; to: "icon_checkbox_bg";} - color: 255 255 255 0; - visible: 0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - image { - normal: "app_icon_checkbox_on.png"; - } - } - description { - state: "blank" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 0; - } - description { - state: "checked" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - description { - state: "dimmed" 0.0; - inherit: "checked" 0.0; - } - } - - part { //checkbox_click_area - name: "checkbox_click_area"; - type: RECT; - scale: 0; - description { - state: "default" 0.0; - color: 0 0 0 0; - rel1 { - relative: -0.2 -0.2; - to: "icon_checkbox"; - } - rel2 { - relative: 1.2 1.2; - to: "icon_checkbox"; - } - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - - programs { - program { - name: "group_loaded"; - signal: "load"; - source: ""; - script { - set_int(checkbox_state, 0); - } - } - program { - name: "icon_clicked_program"; - signal :"mouse,clicked,1"; - source: "icon_content"; - action: SIGNAL_EMIT SIGNAL_ICON_CLICKED SIGNAL_SOURCE; - //after: program with change the icon shadow state to clicked! - } - - program { - name: "icon_touch_program"; - signal: SIGNAL_ICON_PRESS; - source: SIGNAL_PRESS_SOURCE; - action: STATE_SET "icon_touched" 0.0; - target: "icon_content_touch"; - transition: LINEAR 0.1; - } - - program { - name: "icon_touch_release_program"; - signal: "mouse,up,1"; - source: "icon_content_touch"; - action: STATE_SET "default" 0.0; - target: "icon_content_touch"; - transition: LINEAR 0.1; - } - program { - name: "edit_mode_on"; - signal: SIGNAL_EDIT_MODE_ON; - source: SIGNAL_SOURCE; - action: STATE_SET "edit" 0.0; - target: PART_ICON_NAME; - } - program { - name: "edit_mode_off"; - signal: SIGNAL_EDIT_MODE_OFF; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_ICON_NAME; - } - program { - name: "edit_mode_black_on"; - signal: SIGNAL_EDIT_MODE_BLACK_ON; - source: SIGNAL_SOURCE; - action: STATE_SET "black_edit" 0.0; - target: PART_ICON_NAME; - } - program { - name: "edit_mode_black_off"; - signal: SIGNAL_EDIT_MODE_BLACK_OFF; - source: SIGNAL_SOURCE; - action: STATE_SET "black_text" 0.0; - target: PART_ICON_NAME; - } - program { - name: "uninstall_button_show"; - signal: SIGNAL_UNINSTALL_BUTTON_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "show" 0.0; - target: "icon_uninstall_button"; - transition: DECELERATE 0.20; - } - program { - name: "uninstall_button_hide"; - signal: SIGNAL_UNINSTALL_BUTTON_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "icon_uninstall_button"; - transition: DECELERATE 0.20; - } - program { - name: "uninstall_button_clicked"; - signal: "mouse,clicked,1"; - source: "icon_uninstall_button"; - action: SIGNAL_EMIT SIGNAL_UNINSTALL_BUTTON_CLICKED SIGNAL_SOURCE; - } - program { - name: "uninstall_button_mouse_down"; - signal: "mouse,down,1"; - source: "icon_uninstall_button"; - action: STATE_SET "press" 0.0; - target: "icon_uninstall_button"; - transition: DECELERATE 0.20; - } - program { - name: "uninstall_button_mouse_up"; - signal: "mouse,up,1"; - source: "icon_uninstall_button"; - action: STATE_SET "show" 0.0; - target: "icon_uninstall_button"; - transition: DECELERATE 0.20; - } - - //Checkbox - program { - name: "checkbox_show_unchecked"; - signal: SIGNAL_CHECKBOX_SHOW_UNCHECKED; - source: SIGNAL_SOURCE; - script { - set_int(checkbox_state, 0); - emit("checkbox,blank,show", SIGNAL_SOURCE); - } - after: "checkbox_area_visible"; - } - program { - name: "checkbox_show_checked"; - signal: SIGNAL_CHECKBOX_SHOW_CHECKED; - source: SIGNAL_SOURCE; - script { - set_int(checkbox_state, 1); - emit("checkbox,checked,show", SIGNAL_SOURCE); - } - after: "checkbox_area_visible"; - } - program { - name: "checkbox_show_dimmed"; - signal: SIGNAL_CHECKBOX_SHOW_DIMMED; - source: SIGNAL_SOURCE; - script { - set_int(checkbox_state, 1); - emit("checkbox,dimmed,show", SIGNAL_SOURCE); - } - after: "checkbox_area_visible"; - } - program { - name: "checkbox_blank_show"; - signal: "checkbox,blank,show"; - source: SIGNAL_SOURCE; - action: STATE_SET "blank" 0.0; - target: "icon_checkbox"; - target: "icon_checkbox_border"; - target: "icon_checkbox_bg"; - } - program { - name: "checkbox_hide"; - signal: SIGNAL_CHECKBOX_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "icon_checkbox"; - target: "icon_checkbox_border"; - target: "icon_checkbox_bg"; - transition: DECELERATE 0.20; - after: "checkbox_area_hide"; - } - program { - name: "checkbox_checked_show"; - signal: "checkbox,checked,show"; - source: SIGNAL_SOURCE; - action: STATE_SET "checked" 0.0; - target: "icon_checkbox"; - target: "icon_checkbox_border"; - target: "icon_checkbox_bg"; - transition: DECELERATE 0.20; - } - program { - name: "checkbox_dimmed_show"; - signal: "checkbox,dimmed,show"; - source: SIGNAL_SOURCE; - action: STATE_SET "dimmed" 0.0; - target: "icon_checkbox"; - target: "icon_checkbox_border"; - target: "icon_checkbox_bg"; - transition: DECELERATE 0.20; - } - program { - name: "checkbox_clicked"; - signal: "mouse,clicked,1"; - source: "checkbox_click_area"; - script { - if (get_int(checkbox_state) == 0) { - set_int(checkbox_state, 1); //isnt it deprecated? - emit("checkbox,checked,show", SIGNAL_SOURCE); //signal for edje state change - emit("checkbox,checked", SIGNAL_SOURCE); //signal for C listener - } - else { - set_int(checkbox_state, 0); - emit("checkbox,blank,show", SIGNAL_SOURCE); //signal for edje state change - emit("checkbox,unchecked", SIGNAL_SOURCE); //signal for C listener - } - } - } - /*This is when ALLs are in management mode:*/ - program { - name: "set_manage_state_program"; - signal: "set_manage_state"; - source: SIGNAL_SOURCE; - action: STATE_SET "manage_state" 0.0; - target: "icon_bg"; - transition: DECELERATE 0.2; - } - /*This is default for ALLs: */ - program { - name: "unset_manage_state_program"; - signal: "unset_manage_state"; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "icon_bg"; - transition: DECELERATE 0.2; - } - program { - name: "program_no_text"; - signal: SIGNAL_LABEL_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "no_text" 0.0; - target: PART_ICON_NAME; - } - program { - name: "program_black_text"; - signal: "label,text,black"; - source: SIGNAL_SOURCE; - action: STATE_SET "black_text" 0.0; - target: PART_ICON_NAME; - } - program { - name: "program_default"; - signal: SIGNAL_LABEL_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: PART_ICON_NAME; - transition: DECELERATE 0.20; - } - program { - name: "icon_badge_show"; - signal: SIGNAL_BADGE_SHOW; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: "icon_badge"; - target: "icon_badge_text"; - } - program { - name: "icon_badge_hide"; - signal: SIGNAL_BADGE_HIDE; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "icon_badge"; - target: "icon_badge_text"; - } - program { - name: "checkbox_area_visible"; - action: STATE_SET "visible" 0.0; - target: "checkbox_click_area"; - } - program { - name: "checkbox_area_hide"; - action: STATE_SET "default" 0.0; - target: "checkbox_click_area"; - } - program { - name: "area,clicked"; - signal: "mouse,clicked,1"; - source: "checkbox_click_area"; - action: SIGNAL_EMIT "mouse,clicked,1" "icon_checkbox"; - } - program { - name: "checkbox,block"; - signal: SIGNAL_CHECKBOX_BLOCK; - source: SIGNAL_SOURCE; - action: STATE_SET "default" 0.0; - target: "checkbox_click_area"; - } - program { - name: "checkbox,unblock"; - signal: SIGNAL_CHECKBOX_UNBLOCK; - source: SIGNAL_SOURCE; - action: STATE_SET "visible" 0.0; - target: "checkbox_click_area"; - } - } - } -} diff --git a/res/edje/index_element.edc b/res/edje/index_element.edc deleted file mode 100644 index 9d1f3f2..0000000 --- a/res/edje/index_element.edc +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -collections { - group { - name: GROUP_INDEX_ELEMENT; - - images { - image: "core_page_indicator_on.png" COMP; - image: "core_page_indicator_on_horizontal.png" COMP; - } - - script { - public rot; - public alpha; - - public message(Msg_Type:type, id, ...) { - if(type == MSG_FLOAT_SET) - { - set_float(rot, getfarg(2)); - set_float(alpha, getfarg(3)); - send_message(type, id, getfarg(2), getfarg(3)); - } - } - } - - parts { - part { - name: INDICE_SIZE_SETTER; - type: SWALLOW; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 1.0;} - } - } - part { - name: "element"; - type: IMAGE; - - description { - state: "default" 0.0; - color: 255 255 255 75; - rel1 {relative: 0.0 0.0; to: INDICE_SIZE_SETTER;} - rel2 {relative: 1.0 1.0; to: INDICE_SIZE_SETTER;} - image { - normal: "core_page_indicator_on_horizontal.png"; - } - map { - on: 1; - perspective_on: 1; - smooth: 1; - alpha: 1; - - } - } - description { - state: "current" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - image { - normal: "core_page_indicator_on.png"; - } - } - } - } - - programs { - program { - name: "rotation,change"; - signal: "rot_changed"; - source: "ly"; - script { - custom_state(PART:"element", "default", 0.0); - set_state_val(PART:"element", STATE_MAP_ROT_Z, get_float(rot)); - set_state_val(PART:"element", STATE_COLOR, 255, 255, 255, round(get_float(alpha))); - set_state(PART:"element", "custom", 0.0); - } - } - program - { - name: "indice_set_default"; - signal: SIGNAL_SET_DEFAULT; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "element"; - } - program - { - name: "indice_set_current"; - signal: SIGNAL_SET_CURRENT; - source: "layout"; - action: STATE_SET "current" 0.0; - target: "element"; - } - } - } -} diff --git a/res/edje/livebox_container.edc b/res/edje/livebox_container.edc deleted file mode 100644 index 6177498..0000000 --- a/res/edje/livebox_container.edc +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -images -{ - image: "btn_delete_nor.png" COMP; - image: "edit_all_page_create.png" COMP; - image: "frame.png" COMP; - image: "resize_button.png" COMP; -} - -collections { - group { - ///@todo it would rather be named livebox_scroller_page - name: "livebox_container"; - - parts { - part { - //background fills the whole page in pagescroller - name: "bg"; - scale: 1; - type: SWALLOW; - description { - state: "default" 0.0; - rel1 - { - relative: 0.0 CONTENT_Y_MIN; - } - rel2 { - relative: 1.0 CONTENT_Y_MAX; - } - } - } - - part - { - name: "grid_bg"; - scale: 1; - type: SWALLOW; - description - { - state: "default" 0.0; - visible: 1; - rel1 - { - relative: 0.0 0.0; to: "content"; - } - rel2 - { - relative: 1.0 1.0; to: "content"; - } - } - description - { - state: "hidden" 0.0; - inherit: "default"; - visible: 0; - } - - } - - part { - name: "edit_dim"; - scale: 1; - type: RECT; - repeat_events: 1; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: "content";} - rel2 {relative: 1.0 1.0; to: "content";} - color: 0 0 0 40; - visible: 0; - } - description { - state: "edit"; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - name : "add_page_button"; - scale: 1; - type: IMAGE; - description { - state: "default" 0.0; - rel1 {relative: LIVEBOX_ADD_PAGE_BUTTON_X_MIN LIVEBOX_ADD_PAGE_BUTTON_Y_MIN; to: "edit_dim";} - rel2 {relative: LIVEBOX_ADD_PAGE_BUTTON_X_MAX LIVEBOX_ADD_PAGE_BUTTON_Y_MAX; to: "edit_dim";} - image { - normal: "edit_all_page_create.png"; - } - aspect_preference: BOTH; - visible: 0; - } - description { - state: "visible"; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - //content is smaller than the background and positioned in the center - name: "content"; - scale: 1; - type: SWALLOW; - description { - state: "default" 0.0; - rel1 { relative: LIVEBOX_X_MIN 0.0; to: "bg";} - rel2 { relative: LIVEBOX_X_MAX 1.0; to: "bg";} - fixed: 1 1; - } - description { - state: "edit" 0.0; - rel1 {relative: LIVEBOX_EDIT_X_MIN LIVEBOX_EDIT_Y_MIN; to: "bg";} - rel2 {relative: LIVEBOX_EDIT_X_MAX LIVEBOX_EDIT_Y_MAX; to: "bg";} - } - } - - part { - name: "remove_button"; - scale: 1; - type: IMAGE; - mouse_events: 1; - description { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "content";} - rel2{relative: 1.0 1.0; to: "content";} - color: 255 255 255 255; - visible: 0; - aspect: 1.0 1.0; - align: 0.0 0.0; - min: LIVEBOX_REMOVE_BUTTON_SIZE LIVEBOX_REMOVE_BUTTON_SIZE; - max: LIVEBOX_REMOVE_BUTTON_SIZE LIVEBOX_REMOVE_BUTTON_SIZE; - aspect_preference: BOTH; - fixed: 1 1; - image { - normal: "btn_delete_nor.png"; - } - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - -// ================================================================================= - part - { - name: "slider.vertical"; - type: SPACER; - scale: 1; - repeat_events: 1; - description - { - state: "default" 0.0; - align: 0.5 0.5; - rel1 - { - relative: 0.0 -0.025; - to_x: "button.left"; - to_y: "content"; - } - rel2 - { - relative: 1.0 1.03; - to_x: "button.right"; - to_y: "content"; - } - - min: LIVEBOX_SLIDER_BUTTON_SIZE 0; - max: LIVEBOX_SLIDER_BUTTON_SIZE -1; - } - } - part - { - name: "button.down"; - type: IMAGE; - scale: 1; - mouse_events: 1; - repeat_events: 0; - - dragable { - confine: "slider.vertical"; - x: 0 0 0; - y: 1 1 10; - } - description - { - state: "default" 0.0; - color: 0 255 0 255; - align: 0.5 0.5; - visible: 1; - min: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - - image - { - normal: "resize_button.png"; - } - } - description - { - state: "button,warning" 0.0; - inherit: "default"; - color: 255 0 0 255; - } - description - { - state: "hidden"; - inherit: "default"; - visible: 0; - } - } - part - { - name: "button.up"; - type: IMAGE; - scale: 1; - mouse_events: 1; - repeat_events: 0; - - dragable - { - confine: "slider.vertical"; - x: 0 0 0; - y: 1 1 10; - } - - description - { - state: "default" 0.0; - color: 0 255 0 255; - align: 0.5 0.5; - visible: 1; - min: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - - image - { - normal: "resize_button.png"; - } - } - description - { - state: "button,warning" 0.0; - inherit: "default"; - color: 255 0 0 255; - } - description - { - state: "hidden"; - inherit: "default"; - visible: 0; - } - } - - part - { - name: "slider.horizontal"; - type: SPACER; - scale: 1; - repeat_events: 1; - - description - { - state: "default" 0.0; - align: 0.5 0.5; - - rel1 - { - relative: -0.025 0.0; - to_x: "content"; - to_y: "button.up"; - } - rel2 - { - relative: 1.03 1.0; - to_x: "content"; - to_y: "button.down"; - } - - min: 0 LIVEBOX_SLIDER_BUTTON_SIZE; - max: -1 LIVEBOX_SLIDER_BUTTON_SIZE; - } - } - part - { - name: "button.right"; - type: IMAGE; - scale: 1; - mouse_events: 1; - repeat_events: 0; - - dragable - { - confine: "slider.horizontal"; - x: 1 1 10; - y: 0 0 0; - } - - description - { - state: "default" 0.0; - color: 0 255 0 255; - align: 0.5 0.5; - min: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - max: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - rel1 - { - relative: 0.90 0.0; - to_y: "button.up"; - } - rel2 - { - relative: 1.00 1.0; - to_y: "button.down"; - } - - image - { - normal: "resize_button.png"; - } - } - description - { - state: "button,warning" 0.0; - inherit: "default"; - color: 255 0 0 255; - } - description - { - state: "hidden"; - inherit: "default"; - visible: 0; - } - } - part - { - name: "button.left"; - type: IMAGE; - scale: 1; - mouse_events: 1; - repeat_events: 0; - - dragable - { - confine: "slider.horizontal"; - x: 1 1 10; - y: 0 0 0; - } - - description - { - state: "default" 0.0; - color: 0 255 0 255; - align: 0.5 0.5; - min: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - max: LIVEBOX_SLIDER_BUTTON_SIZE LIVEBOX_SLIDER_BUTTON_SIZE; - visible: 1; - rel1 - { - relative: 0.0 1.0; - to_y: "button.up"; - } - rel2 - { - relative: 0.1 0.0; - to_y: "button.down"; - } - - image - { - normal: "resize_button.png"; - } - } - description - { - state: "button,warning" 0.0; - inherit: "default"; - color: 255 0 0 255; - } - description - { - state: "hidden"; - inherit: "default"; - visible: 0; - } - } - - part { - name: "event_blocker"; - type: RECT; - mouse_events: 1; - repeat_events: 1; - description { - state: "default" 0.0; - fixed: 1 1; - color: 0 0 0 0; - visible: 0; - rel1 { relative: 0.0 0.0; to: "content";} - rel2 { relative: 1.0 1.0; to: "content";} - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - name : "frame"; - type: IMAGE; - mouse_events: 0; - repeat_events: 1; - description { - state: "default" 0.0; - rel1 - { - relative: LIVEBOX_RESIZE_FRAME_REL_1 LIVEBOX_RESIZE_FRAME_REL_1; - to_x: "button.left"; - to_y: "button.up"; - } - rel2 - { - relative: LIVEBOX_RESIZE_FRAME_REL_2 LIVEBOX_RESIZE_FRAME_REL_2; - to_x: "button.right"; - to_y: "button.down"; - } - image { - normal: "frame.png"; - border: 20 20 20 20; - } - color: 0 255 0 255; - visible: 1; - } - description { - state: "hidden"; - inherit: "default" 0.0; - visible: 0; - } - description { - state: "button,warning"; - inherit: "default" 0.0; - color: 255 0 0 255; - } - } - -// =========================================================================== - programs { - //Remove button - program { - name: "remove_button_show"; - signal: "remove_button,show"; - source: "layout"; - action: STATE_SET "show" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - program { - name: "event_blocker_show"; - action: STATE_SET "show" 0.0; - target: "event_blocker"; - } - - program { - name: "remove_button_hide"; - signal: "remove_button,hide"; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - program { - name: "remove_button_hide_instant"; - signal: "remove_button,hide,instant"; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - after: "event_blocker_hide"; - } - program { - name: "event_blocker_hide"; - action: STATE_SET "default" 0.0; - target: "event_blocker"; - } - - program { - name: "remove_button_clicked"; - signal: "mouse,clicked,1"; - source: "remove_button"; - action: SIGNAL_EMIT "remove_button,clicked" "layout"; - } - -// ========================================================================= - program - { - name: "drag,outside"; - signal: "drag,outside"; - source: "livebox"; - action: STATE_SET "button,warning" 0.0; - target: "button.left"; - target: "button.right"; - target: "button.up"; - target: "button.down"; - target: "frame"; - } - program - { - name: "drag,ok"; - signal: "drag,ok"; - source: "livebox"; - action: STATE_SET "default" 0.0; - target: "button.left"; - target: "button.right"; - target: "button.up"; - target: "button.down"; - target: "frame"; - } - - program - { - name: "sliders,hide"; - signal: "sliders,hide"; - source: "livebox"; - action: STATE_SET "hidden" 0.0; - target: "button.left"; - target: "button.right"; - target: "button.up"; - target: "button.down"; - target: "frame"; - } - - program - { - name: "sliders,show"; - signal: "sliders,show"; - source: "livebox"; - action: STATE_SET "default" 0.0; - target: "button.left"; - target: "button.right"; - target: "button.up"; - target: "button.down"; - target: "frame"; - } -// ================================================================================================== - - program - { - name: "grid,hide"; - signal: SIGNAL_GRID_SHADOW_HIDE; - source: PART_GRID_BG; - action: STATE_SET "hidden" 0.0; - target: "grid_bg"; - } - - program - { - name: "grid,show"; - signal: SIGNAL_GRID_SHADOW_SHOW; - source: PART_GRID_BG; - action: STATE_SET "default" 0.0; - target: "grid_bg"; - } - - -// ================================================================================================== - - program { - name: "edit_start"; - signal: "edit,start"; - source: "layout"; - action: STATE_SET "edit" 0.0; - target: "edit_dim"; - target: "content"; - } - program { - name: "edit_stop"; - signal: "edit,stop"; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "edit_dim"; - target: "content"; - } - program { - name: "add_show"; - signal: "add,show"; - source: "layout"; - action: STATE_SET "visible" 0.0; - target: "add_page_button"; - } - program { - name: "add_hide"; - signal: "add,hide"; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "add_page_button"; - } - program - { - name: "add_page_clicked"; - signal: "mouse,clicked,1"; - source: "add_page_button"; - action: SIGNAL_EMIT "add_page_button_clicked" "layout"; - } - } - } -} diff --git a/res/edje/livebox_layout.edc b/res/edje/livebox_layout.edc deleted file mode 100644 index 3e422c3..0000000 --- a/res/edje/livebox_layout.edc +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "../../inc/conf.h" - -images -{ - image: "btn_delete_nor.png" COMP; - image: "reposition_bg.png" COMP; - image: "reposition_bg_shadow.png" COMP; -} - -collections -{ - group - { - name: "livebox"; - parts - { - part - { - name: "reposition_bg"; - type: IMAGE; - scale: 1; - mouse_events: 0; - repeat_events: 1; - description - { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "livebox";} - rel2{relative: 1.0 1.0; to: "livebox";} - color: LIVEBOX_REPOSITION_BG_COLOR LIVEBOX_REPOSITION_BG_COLOR LIVEBOX_REPOSITION_BG_COLOR 0; - image - { - normal: "reposition_bg.png"; - border: LIVEBOX_REPOSITION_BG_BORDER LIVEBOX_REPOSITION_BG_BORDER LIVEBOX_REPOSITION_BG_BORDER LIVEBOX_REPOSITION_BG_BORDER; - } - } - description - { - state: "visible" 0.0; - inherit: "default" 0.0; - color: LIVEBOX_REPOSITION_BG_COLOR LIVEBOX_REPOSITION_BG_COLOR LIVEBOX_REPOSITION_BG_COLOR LIVEBOX_REPOSITION_BG_COLOR; - } - } - - part - { - name: "livebox"; - type: SWALLOW; - scale: 1; - mouse_events: 1; - description - { - state: "default" 0.0; - visible: 1; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - } - } - - part - { - name: "remove_button_rect"; - type: SPACER; - scale: 1; - mouse_events: 1; - description - { - state: "default" 0.0; - rel1{relative: 0.0 0.0; to: "livebox";} - rel2{relative: 1.0 1.0; to: "livebox";} - align: 0.0 0.0; - aspect: 1.0 1.0; - min: LIVEBOX_REMOVE_LB_BUTTON_SIZE+LIVEBOX_REMOVE_LB_OFFSET_X LIVEBOX_REMOVE_LB_BUTTON_SIZE+LIVEBOX_REMOVE_LB_OFFSET_Y; - max: LIVEBOX_REMOVE_LB_BUTTON_SIZE+LIVEBOX_REMOVE_LB_OFFSET_X LIVEBOX_REMOVE_LB_BUTTON_SIZE+LIVEBOX_REMOVE_LB_OFFSET_Y; - aspect_preference: BOTH; - fixed: 1 1; - - } - } - - part - { - name: "remove_button"; - type: IMAGE; - scale: 1; - mouse_events: 1; - repeat_events: 0; - description - { - state: "default" 0.0; - visible: 0; - rel1{relative: 0.0 0.0; to: "remove_button_rect";} - rel2{relative: 1.0 1.0; to: "remove_button_rect";} - align: 1.0 1.0; - aspect: 1.0 1.0; - min: LIVEBOX_REMOVE_LB_BUTTON_SIZE LIVEBOX_REMOVE_LB_BUTTON_SIZE; - max: LIVEBOX_REMOVE_LB_BUTTON_SIZE LIVEBOX_REMOVE_LB_BUTTON_SIZE; - aspect_preference: BOTH; - fixed: 1 1; - image - { - normal: "btn_delete_nor.png"; - } - } - description - { - state: "show" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - } - } - - programs { - //Remove button - program { - name: "remove_button_show"; - signal: "remove_button,show"; - source: "livebox"; - action: STATE_SET "show" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - - program { - name: "remove_button_hide"; - signal: "remove_button,hide"; - source: "livebox"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - - program { - name: "remove_button_hide_instant"; - signal: "remove_button,hide,instant"; - source: "livebox"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - } - - - program { - name: "reposition_bg_show"; - signal: "reposition_bg,show"; - source: "livebox"; - action: STATE_SET "visible" 0.0; - target: "reposition_bg"; - } - - program { - name: "reposition_bg_hide"; - signal: "reposition_bg,hide"; - source: "livebox"; - action: STATE_SET "default" 0.0; - target: "reposition_bg"; - } - } - } -} diff --git a/res/edje/page_edit.edc b/res/edje/page_edit.edc deleted file mode 100644 index ca03b77..0000000 --- a/res/edje/page_edit.edc +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "page_edit_util.edc" -#include "../../inc/conf.h" - -images { - image: "btn_delete_nor.png" COMP; - image: "btn_delete_press.png" COMP; - image: "edit_all_page_drag.png" COMP; - image: "edit_all_page_bg.png" COMP; - image: "edit_all_page_create.png" COMP; -} - -collections -{ - group - { - name: GROUP_ALL_PAGES; - - parts { - part - { - name: "base"; - type: SPACER; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0;} - rel2 { relative: 1.0 1.0;} - } - } - part - { - name: "bg"; - type: SWALLOW; - description - { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to:"base";} - rel2 { relative: 1.0 1.0; to:"base";} - } - } - part - { - name: PART_LAYOUT_CONTENT; - type: SWALLOW; //gengrid swallow - description - { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to:"base";} - rel2 { relative: 1.0 1.0; to:"base";} - } - } - } - } - - group { - name: GROUP_GRID_ITEM; - - parts { - part { - name: "base"; - type: SPACER; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 1.0;} - } - } - - part { - name: PART_GRID_ITEM_CONTENT; - type: SWALLOW; - description { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: "base";} - rel2 {relative: 1.0 1.0; to: "base";} - } - } - } - } - - group - { - name: GROUP_THUMB; - parts - { - part - { - name: "base"; - type: SPACER; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0;} - rel2 {relative: 1.0 1.0;} - } - } - part - { - name: "bg"; - type: IMAGE; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: PART_THUMB_CONTENT;} - rel2 {relative: 1.0 1.0; to: PART_THUMB_CONTENT;} - image { - normal: "edit_all_page_bg.png"; - } - } - description - { - state: "hide" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description - { - state: "reposition" 0.0; - inherit: "default"; - rel1 {relative: -0.05 -0.05;} - rel2 {relative: 1.05 1.05;} - visible: 1; - image - { - normal: "edit_all_page_drag.png"; - } - } - } - part { - name: "add_bg"; - type: IMAGE; - description { - state: "default" 0.0; - rel1 {relative: 0.34 0.34; to: "bg";} - rel2 {relative: 0.67 0.67; to: "bg";} - visible: 0; - image { - normal : "edit_all_page_create.png"; - } - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part - { - name: PART_THUMB_CONTENT; - type: SWALLOW; - description - { - state: "default" 0.0; - rel1 {relative: 0.0 0.0; to: "base";} - rel2 {relative: 1.0 1.0; to: "base";} - } - } - part { - name: "remove_button"; - type: IMAGE; - description { - state: "default" 0.0; - rel1{relative: BADGE_REL1_X BADGE_REL1_Y; to: "base";} - rel2{relative: BADGE_REL2_X BADGE_REL2_Y; to: "base";} - visible: 1; - aspect: 0.0 0.0; - aspect_preference: BOTH; - fixed: 1 1; - image { - normal: "btn_delete_nor.png"; - } - } - description { - state: "pressed"; - inherit: "default" 0.0; - image { - normal: "btn_delete_press.png"; - } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - color: 255 255 255 0; - visible: 0; - } - } - } - programs - { - program - { - name: "bg_hide"; - signal: SIGNAL_BG_HIDE; - source: "layout"; - action: STATE_SET "hide" 0.0; - target: "bg"; - } - program - { - name: "bg_reposition"; - signal: SIGNAL_BG_REPOSITON; - source: "layout"; - action: STATE_SET "reposition" 0.0; - target: "bg"; - transition: DECELERATE 0.2; - } - program - { - name: "bg_normal"; - signal: SIGNAL_BG_NORMAL; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: DECELERATE 0.2; - } - program { - name: "thumbnail_clicked"; - signal: "mouse,clicked,1"; - source: "page_thumbnail"; - action: SIGNAL_EMIT SIGNAL_THUMBNAIL_CLICKED SIGNAL_SOURCE; - } - program { - name: "add_icon_show"; - signal: SIGNAL_ADD_ICON_SHOW; - source: "layout"; - action: STATE_SET "visible" 0.0; - target: "add_bg"; - } - program { - name: "remove_button_clicked"; - signal: "mouse,clicked,1"; - source: "remove_button"; - action: SIGNAL_EMIT SIGNAL_REMOVE_BUTTON_CLICKED SIGNAL_SOURCE; - } - program { - name: "remove_button_show"; - signal: SIGNAL_REMOVE_BUTTON_SHOW; - source: "layout"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - program { - name: "remove_button_hide"; - signal: SIGNAL_REMOVE_BUTTON_HIDE; - source: "layout"; - action: STATE_SET "hidden" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - program { - name: "remove_button_hide_instant"; - signal: SIGNAL_REMOVE_BUTTON_HIDE_INSTANT; - source: "layout"; - action: STATE_SET "hidden" 0.0; - target: "remove_button"; - } - program { - name: "remove_button_mouse_down"; - signal: "mouse,down,1"; - source: "remove_button"; - action: STATE_SET "pressed" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - program { - name: "remove_button_mouse_up"; - signal: "mouse,up,1"; - source: "remove_button"; - action: STATE_SET "default" 0.0; - target: "remove_button"; - transition: DECELERATE 0.20; - } - } - } -} - diff --git a/res/edje/page_edit_util.edc b/res/edje/page_edit_util.edc deleted file mode 100644 index 85c6821..0000000 --- a/res/edje/page_edit_util.edc +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define PAGE_RECT(part_name, row_def, col_def) \ -part { \ - name: "item_"part_name"_rect"; \ - type: RECT; \ - description { \ - state: "default" 0.0; \ - color: 0 0 0 0; \ - rel1 {relative: ((col_def+1)*ROW_SHIFT) ((row_def+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - rel2 {relative: ((col_def+1)*ROW_SHIFT) ((row_def+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - min: THUMBNAIL_WIDTH THUMBNAIL_HEIGHT; \ - max: THUMBNAIL_WIDTH THUMBNAIL_HEIGHT; \ - } \ -} \ - - -#define PAGE_SWALLOW(part_name, row_def, col_def, row_prev, col_prev, row_next, col_next) \ -part { \ - name: "item_"part_name"_swallow"; \ - type: SWALLOW; \ - scale: 1; \ - mouse_events: 1;\ - description { \ - state: "default" 0.0 ;\ - color: 0 0 0 0; \ - rel1 {relative: ((col_def+1)*ROW_SHIFT) ((row_def+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - rel2 {relative: ((col_def+1)*ROW_SHIFT) ((row_def+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - fixed: 1 1; \ - min: THUMBNAIL_WIDTH THUMBNAIL_HEIGHT; \ - max: THUMBNAIL_WIDTH THUMBNAIL_HEIGHT; \ - } \ - description { \ - state: "prev" 0.0 ;\ - color: 255 0 0 150; \ - rel1 {relative: ((col_prev+1)*ROW_SHIFT) ((row_prev+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - rel2 {relative: ((col_prev+1)*ROW_SHIFT) ((row_prev+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - fixed: 1 1; \ - } \ - description { \ - state: "next" 0.0 ;\ - color: 255 0 0 150; \ - rel1 {relative: ((col_next+1)*ROW_SHIFT) ((row_next+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - rel2 {relative: ((col_next+1)*ROW_SHIFT) ((row_next+1)*COL_SHIFT); to: "container"; offset: THUMBNAIL_OFFSET_X THUMBNAIL_OFFSET_Y;} \ - fixed: 1 1; \ - } \ -} \ - -#define PAGE_PROGRAM(part_name) \ -program { \ - name: "page_grid_"part_name"_next"; \ - signal: "set_next"; \ - source: "item_"part_name"_swallow"; \ - action: STATE_SET "next" 0.0;\ - target: "item_"part_name"_swallow"; \ - transition: DECELERATE 0.20; \ - after: "page_grid_ani_done_next_"part_name; \ -} \ -program { \ - name: "page_grid_"part_name"_prev"; \ - signal: "set_prev"; \ - source: "item_"part_name"_swallow"; \ - action: STATE_SET "prev" 0.0;\ - target: "item_"part_name"_swallow"; \ - transition: DECELERATE 0.20; \ - after: "page_grid_ani_done_prev_"part_name; \ -} \ -program { \ - name: "page_grid_"part_name"_ani_"; \ - signal: "set_def"; \ - source: "item_"part_name"_swallow"; \ - action: STATE_SET "default" 0.0; \ - target: "item_"part_name"_swallow"; \ -} \ -program { \ - name: "page_grid_ani_done_prev_"part_name; \ - action: SIGNAL_EMIT "ani,done,left" "item_"part_name"_swallow"; \ -} \ -program { \ - name: "page_grid_ani_done_next_"part_name; \ - action: SIGNAL_EMIT "ani,done,right" "item_"part_name"_swallow"; \ -} \ -program { \ - name: "program_down_app_grid_"part_name; \ - source: "item_"part_name"_swallow";\ - signal: "mouse,down,1";\ - action: SIGNAL_EMIT "down,part" "item_"part_name"_swallow";\ -}\ -program { \ - name: "program_up_app_grid_"part_name; \ - source: "item_"part_name"_swallow";\ - signal: "mouse,up,1";\ - action: SIGNAL_EMIT "up,part" "item_"part_name"_swallow";\ -}\ \ No newline at end of file diff --git a/res/edje/page_indicator_unit.edc b/res/edje/page_indicator_unit.edc new file mode 100755 index 0000000..9c142a3 --- /dev/null +++ b/res/edje/page_indicator_unit.edc @@ -0,0 +1,108 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../inc/edc_conf.h" + +collections { + group { + name: GROUP_PAGE_INDICATOR_UNIT; + images { + image: "../res/images/page_indicator_current.png" COMP; + image: "../res/images/page_indicator_unit.png" COMP; + } + script { + public rot; + public alpha; + + public message(Msg_Type:type, id, ...) { + if (type == MSG_FLOAT_SET) + { + set_float(rot, getfarg(2)); + set_float(alpha, getfarg(3)); + send_message(type, id, getfarg(2), getfarg(3)); + } + } + } + parts { + part { name: SIZE_SETTER; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + } + } + part { + name: "unit"; + type: IMAGE; + + description { + state: "default" 0.0; + color: 255 255 255 75; + rel1{relative: 0.0 0.0; to:SIZE_SETTER;} + rel2{relative: 1.0 1.0; to:SIZE_SETTER;} + image { + normal: "../res/images/page_indicator_unit.png"; + } + map { + on: 1; + perspective_on: 1; + smooth: 1; + alpha: 1; + } + } + description { + state: "current" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + image { + normal: "../res/images/page_indicator_current.png"; + } + } + } + } + programs { + program + { + name: "indice_set_default"; + signal: SIGNAL_PAGE_IDICATOR_DEFAULT; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: "unit"; + } + program + { + name: "indice_set_current"; + signal: SIGNAL_PAGE_IDICATOR_CURRENT; + source: SIGNAL_SOURCE; + action: STATE_SET "current" 0.0; + target: "unit"; + } + program { + name: "rotation,changed"; + signal: SIGNAL_PAGE_IDICATOR_ROTATION_CHANGE; + source: SIGNAL_SOURCE; + script { + custom_state(PART:"unit", "default", 0.0); + set_state_val(PART:"unit", STATE_MAP_ROT_Z, get_float(rot)); + set_state_val(PART:"unit", STATE_COLOR, 255, 255, 255, round(get_float(alpha))); + set_state(PART:"unit", "custom", 0.0); + } + } + } + } +} \ No newline at end of file diff --git a/res/edje/preview.edc b/res/edje/preview.edc deleted file mode 100644 index a0e0f6c..0000000 --- a/res/edje/preview.edc +++ /dev/null @@ -1,1093 +0,0 @@ -images { - image: "icon_list_open.png" COMP; - image: "icon_list_close.png" COMP; - - image: "icon_shadow.png" COMP; - image: "1x1 preview shortcut.png" COMP; - - image: "preview_bg_1x1.png" COMP; - image: "preview_bg_2x1.png" COMP; - image: "preview_bg_2x2.png" COMP; - image: "preview_bg_4x1.png" COMP; - image: "preview_bg_4x2.png" COMP; - image: "preview_bg_4x3.png" COMP; - image: "preview_bg_4x4.png" COMP; - image: "icon_drawer_search.png" COMP; -} - - -#define BG_PREVIEW_COLOR 134 177 197 255 - -#include "color_classes.edc" - - - -styles { - style { - name: "tree,font"; - base: "font=Tizen text_class=ATO001 font_size=28 align=left color=#FFFFFF color_class=ATO001 ellipsis=1.0"; - tag: "br" "\n"; - tag: "hilight" "+ font=Tizen:style=Bold"; - tag: "b" "+ font=Tizen:style=Bold"; - tag: "tab" "\t"; - } - - style { - name: "open,title,font"; - base: "font=Tizen text_class=ATO001 font_size=28 align=left color=#FFFFFF color_class=ATO001 ellipsis=1.0"; - tag: "br" "\n"; - tag: "hilight" "+ font=Tizen:style=Bold"; - tag: "b" "+ font=Tizen:style=Bold"; - tag: "tag" "\t"; - } - - style { - name: "leaf,font"; - base: "font=Tizen text_class=TO23 font_size=28 align=left color=#AAAAAA color_class=AT0001 ellipsis=1.0"; - tag: "br" "\n"; - tag: "hilight" "+ font=Tizen:style=Bold"; - tag: "b" "+ font=Tizen:style=Bold"; - tag: "tab" "\t"; - } -} - -// 44 + 76 -#define LEFT_SPACE 0 -#define PHYSI_WIDTH 480 -#define LOGI_WIDTH (PHYSI_WIDTH - LEFT_SPACE) - -collections { - base_scale: 1.8; - plugins { - plugin { - name: "touch_sound"; - source: "feedback"; - param: "1 0"; - } - } - - group { - name: "elm/genlist/item/widget,leaf/default"; - - data.item: "contents" "elm.icon bg"; - data.item: "texts" "elm.text"; - - parts { - part { - name: "bg"; - type: SWALLOW; - scale: 1; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - min: 1 270; - max: -1 270; - } - description { - state: "selected" 0.0; - inherit: "default" 0.0; - } - } - - part { - name: "padding.top"; - type: SPACER; - scale: 1; - mouse_events: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to: "bg";} - rel2 { relative: 1.0 0.0; to: "bg"; } - min: 0 20; - } - } - - part { - name: "padding.bottom"; - type: SPACER; - scale: 1; - mouse_events: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.0 1.0; to: "bg";} - rel2 { relative: 1.0 1.0; to: "bg";} - min: 0 20; - } - } - - part { - name: "padding.left"; - type: SPACER; - scale: 1; - mouse_events: 0; - description - { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to: "bg";} - rel2 { relative: 0.0 1.0; to: "bg";} - min: 20 0; - } - } - - part { - name: "padding.right"; - type: SPACER; - scale: 1; - mouse_events: 0; - description - { - state: "default" 0.0; - rel1 { relative: 1.0 0.0; to: "bg";} - rel2 { relative: 1.0 1.0; to: "bg";} - min: 20 0; - } - } - - part { - name: "elm.text"; - type: TEXTBLOCK; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.042 1.0; to_y: "padding.top"; } - rel2 { relative: 0.958 1.0; to_y: "padding.top"; } - min: 0 36; - align: 0.0 0.0; - text { style: "leaf,font"; } - } - } - - part { - name: "text.right.padding"; - type: SPACER; - mouse_events: 0; - scale: 1; - description - { - state: "default" 0.0; - rel1 { relative: 1.0 1.0; to_x: "elm.text"; to_y: "padding.top"; } - rel2 { relative: 1.0 0.0; to_x: "elm.text"; to_y: "padding.bottom"; } - align: 0.0 0.0; - } - } - - part { - name: "elm.icon"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 1.0; to: "elm.text"; } - rel2 { relative: 1.0 0.0; to: "padding.bottom"; } - align: 0.0 0.0; - } - } - - part { - name: "top,line"; - // clip_to: "disclip"; - type: RECT; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0/112; } - rel2 { relative: 1.0 1/112; } - color_class: "B0223"; - } - } - } - - programs { - program { - name: "go_active"; - signal: "elm,state,selected"; - source: "elm"; - action: STATE_SET "selected" 0.0; - target: "bg"; - } - program { - name: "go_passive"; - signal: "elm,state,unselected"; - source: "elm"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - } - } - - - group { - name: "conformant,frame"; - parts { - part { - name: "bg"; - type: RECT; - scale: 1; - mouse_events: 0; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 0.0; } - align: 0.5 0.0; - min: 0 100; - max: -1 100; - fixed: 0 1; - color_class: "B041"; - visible: 0; - } - description { - state: "show,search" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - name: "content"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - - part { - name: "entry"; - type: SWALLOW; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - visible: 0; - } - description { - state: "show,search" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { - name: "nocontent"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 1.0; to_y, "bg"; } - rel2 { relative: 1.0 1.0; } - visible: 0; - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - - programs { - program { - name: "show,search"; - signal: "display,search"; - source: "container"; - action: STATE_SET "show,search" 0.0; - target: "content"; - target: "bg"; - target: "entry"; - } - program { - name: "hide,search"; - signal: "undisplay,search"; - source: "container"; - action: STATE_SET "default" 0.0; - target: "content"; - target: "bg"; - target: "entry"; - } - - program { - name: "nocontent"; - signal: "nocontent"; - source: "container"; - action: STATE_SET "show" 0.0; - target: "nocontent"; - target: "content"; - } - program { - name: "content"; - signal: "content"; - source: "container"; - action: STATE_SET "default" 0.0; - target: "nocontent"; - target: "content"; - } - } - } - - group { - name: "content,frame"; - parts { - part { - name: "content"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - align: 0.0 0.0; - visible: 0; - } - description { - state: "show,normal" 0.0; - inherit: "default" 0.0; - visible: 1; - } - description { - state: "show,easy" 0.0; - inherit: "default" 0.0; - rel2 { relative: 1.0 1.0; } - visible: 1; - } - } - - part { - name: "index"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.00 0.0;} - rel2 { relative: 1.00 1.00; } - visible: 0; - } - description { - state: "show,normal" 0.0; - inherit: "default" 0.0; - visible: 1; - } - description { - state: "show,easy" 0.0; - visible: 0; - } - } - - part { - name: "loading"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - rel1 { relative: 0.25 0.40; } - rel2 { relative: 0.75 0.60; } - color: 100 100 200 200; - visible: 0; - } - - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - - part { - name: "loading,txt"; - type: TEXT; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "loading"; } - rel2 { relative: 1.0 1.0; to, "loading"; } - text { - font: "Tizen:style=Bold"; - text_class: "tizen"; - align: 0.5 0.5; - size: 26; - text: "Loading"; - } - visible: 0; - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - } - programs { - program { - name: "loading,on"; - source: "content,frame"; - signal: "loading,on"; - action: STATE_SET "show" 0.0; - target: "loading"; - target: "loading,txt"; - } - program { - name: "loading,off"; - source: "content,frame"; - signal: "loading,off"; - action: STATE_SET "default" 0.0; - target: "loading"; - target: "loading,txt"; - } - program { - name: "show,normal"; - signal: "display,normal"; - source: "container"; - action: STATE_SET "show,normal" 0.0; - target: "content"; - } - program { - name: "show,normal,index"; - signal: "display,index"; - source: "container"; - action: STATE_SET "show,normal" 0.0; - target: "index"; - } - program { - name: "show,easy"; - signal: "display,easy"; - source: "container"; - action: STATE_SET "show,easy" 0.0; - target: "content"; - target: "index"; - } - program { - name: "hide"; - signal: "undisplay"; - source: "container"; - action: STATE_SET "default" 0.0; - target: "content"; - } - } - } - - - group { - name: "preview,1x1"; - parts { - part { - name: "bg"; - type: IMAGE; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "preview_bg_1x1.png"; } - color_class: "B041"; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/87 4/87; } - rel2 { relative: 83/87 83/87; } - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 0 0 0 0; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,2x1"; - parts { - part { - name: "bg"; - type: IMAGE; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "preview_bg_2x1.png"; } - color_class: "B041"; - min: 164 87; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/164 4/87; } - rel2 { relative: 160/164 83/87; } - min: 156 79; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 0 0 0 0; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,2x2"; - parts { - part { - name: "bg"; - type: IMAGE; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "preview_bg_2x2.png"; } - min: 164 164; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/164 4/164; } - rel2 { relative: 160/164 160/164; } - min: 156 156; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - min: 133 133; - } - } - - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 255 0 0 150; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,4x1"; - parts { - part { - name: "bg"; - type: IMAGE; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "preview_bg_4x1.png"; } - color_class: "B041"; - min: 214 107; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/314 4/52; } - rel2 { relative: 310/314 48/52; } - min: 200 100; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,4x2"; - parts { - part { - name: "bg"; - type: RECT; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - color: BG_PREVIEW_COLOR; - min: 214 107; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/314 4/164; } - rel2 { relative: 310/314 160/164; } - min: 207 100; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 0 0 0 0; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,4x3"; - parts { - part { - name: "bg"; - type: IMAGE; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "preview_bg_4x3.png"; } - color_class: "B041"; - min: 314 239; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/314 4/239; } - rel2 { relative: 310/314 235/239; } - min: 306 231; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 0 0 0 0; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "preview,4x4"; - parts { - part { - name: "bg"; - type: RECT; - mouse_events: 0; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - color: BG_PREVIEW_COLOR; - min: 214 214; - } - description { - state: "clicked" 0.0; - inherit: "default" 0.0; - rel1 { relative: 4/312 4/312; } - rel2 { relative: 308/312 308/312; } - min: 200 200; - } - } - - part { - name: "preview"; - type: SWALLOW; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; to, "bg"; } - rel2 { relative: 1.0 1.0; to, "bg"; } - } - } - part { - name: "preview,dbg"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - rel1 { to, "preview"; } - rel2 { to, "preview"; } - color: 0 0 0 0; - } - } - } - - programs { - program { - name: "touch_snd"; - signal: "mouse,clicked,1"; - source: "preview,dbg"; - action: RUN_PLUGIN "touch_sound"; - } - program { - name: "in,effect"; - source: "preview,dbg"; - signal: "mouse,down,1"; - action: STATE_SET "clicked" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "out,effect"; - source: "preview,dbg"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "bg"; - transition: LINEAR 0.1; - } - program { - name: "add,to,home"; - source: "preview,dbg"; - signal: "mouse,clicked,1"; - action: SIGNAL_EMIT "add,to,home" "preview"; - } - } - } - - group { - name: "search,btn"; - parts { - part { - name: "image"; - type: IMAGE; - scale: 1; - description { - state: "default" 0.0; - rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 1.0; } - image { normal: "icon_drawer_search.png"; } - color_class: "B052L1"; - aspect: 1 1; - aspect_preference: BOTH; - min: 63 63; - max: 63 63; - } - description { - state: "pressed" 0.0; - inherit: "default" 0.0; - color_class: "B052L1P"; - } - description { - state: "dim" 0.0; - inherit: "default" 0.0; - color_class: "B052L1D"; - } - } - } - programs { - program { - name: "pressed"; - source: "image"; - signal: "mouse,down,1"; - action: STATE_SET "pressed" 0.0; - target: "image"; - } - program { - name: "released"; - source: "image"; - signal: "mouse,up,1"; - action: STATE_SET "default" 0.0; - target: "image"; - } - } - } -} // collections - - diff --git a/res/edje/widget.edc b/res/edje/widget.edc new file mode 100755 index 0000000..41b41f7 --- /dev/null +++ b/res/edje/widget.edc @@ -0,0 +1,166 @@ +#include "../../inc/edc_conf.h" + +images { + image: "../res/images/btn_delete_nor.png" COMP; + image: "../res/images/btn_delete_press.png" COMP; +} + +collections { + group { name: GROUP_WIDGET_LY; + parts { + part { name: WIDGET_CONTENT; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + } + } + part { name: SIZE_SETTER; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + align: 0 0; + visible: 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.01 0.01; + } + } + part { name: "touch,block"; + type: RECT; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + rel1{relative: 0.0 0.0; to: WIDGET_CONTENT;} + rel2{relative: 1.0 1.0; to: WIDGET_CONTENT;} + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "pickup" 0.0; + inherit: "default" 0.0; + color: 0 0 0 100; + visible: 1; + } + } + part { + name: WIDGET_DELETE_BUTTON; + type: IMAGE; + scale: 0; + description { + state: "default" 0.0; + rel1{relative: 0.055 0.055; to: SIZE_SETTER;} + rel2{relative: 0.388 0.388; to: SIZE_SETTER;} + color: 255 255 255 0; + visible: 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image { + normal: "../res/images/btn_delete_nor.png"; + } + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + image { + normal: "../res/images/btn_delete_press.png"; + } + visible: 1; + } + } + } + programs { + program { + name: "delete_button_show_ani"; + signal: SIGNAL_DELETE_BUTTON_SHOW_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: WIDGET_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "delete_button_show"; + signal: SIGNAL_DELETE_BUTTON_SHOW; + source: SIGNAL_SOURCE; + action: STATE_SET "show" 0.0; + target: WIDGET_DELETE_BUTTON; + } + program { + name: "delete_button_hide_ani"; + signal: SIGNAL_DELETE_BUTTON_HIDE_ANI; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: WIDGET_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "delete_button_hide"; + signal: SIGNAL_DELETE_BUTTON_HIDE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: WIDGET_DELETE_BUTTON; + } + program { + name: "delete_button_clicked"; + signal: "mouse,clicked,1"; + source: WIDGET_DELETE_BUTTON; + action: SIGNAL_EMIT SIGNAL_DELETE_BUTTON_CLICKED SIGNAL_SOURCE; + } + program { + name: "delete_button_mouse_down"; + signal: "mouse,down,1"; + source: WIDGET_DELETE_BUTTON; + action: STATE_SET "press" 0.0; + target: WIDGET_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "delete_button_mouse_up"; + signal: "mouse,up,1"; + source: WIDGET_DELETE_BUTTON; + action: STATE_SET "show" 0.0; + target: WIDGET_DELETE_BUTTON; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + program { + name: "touch,disable"; + signal: SIGNAL_CLUSTER_EDIT_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "edit" 0.0; + target: "touch,block"; + } + program { + name: "touch,enable"; + signal: SIGNAL_CLUSTER_NORMAL_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "default" 0.0; + target: "touch,block"; + } + program { + name: "pick,up,widget"; + signal: SIGNAL_CLUSTER_PICKUP_STATE; + source: SIGNAL_SOURCE; + action: STATE_SET "pickup" 0.0; + target: "touch,block"; + transition: DECELERATE ANIMATION_RESIZE_TIME; + } + } + } +} \ No newline at end of file diff --git a/res/images/00_scroll_bar_v.png b/res/images/00_scroll_bar_v.png deleted file mode 100644 index f07b2ca593aef5f593c52ff2892a00fc719cd6da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3192 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 delta 373 zcmZ20(IKJO8Q|y6%O%Cdz`(%k>ERLtq{~29QSs5qai-q_Q{F{I+wn;RPi z4;cu!T(oU-Sm^Avl*LO`C8SKn%v9lQwQ9xl`4X#kAFj)@J2>y1XHe+k-Sh2^|629x z>fO&;-#&P5EBw>tYc#1M=exn4jl1`6R6qJFv?nQ0r^|I?SLm9=!mdD_wxb*FMTm4K z8tMS4?1;lsVuzC={%E;vtZy@20~7_yOI+K~W~%f5oV`C#pN81cq=-35M;8G#flLYo z8Kxn2_>qXV7*udglA(^DAxJn3BC|L`WHm@RSQx7Yu#_&fBIMMK S!o9$dWbkzLb6Mw<&;$T}lA2op diff --git a/res/images/00_scroll_bar_h.png b/res/images/add_page_press.png old mode 100644 new mode 100755 similarity index 84% rename from res/images/00_scroll_bar_h.png rename to res/images/add_page_press.png index 526c91c16134b23bd562ebbaa2ef06a58f4f2414..9c58f4254276465ece2744d360db8f6e6f9dc3ca GIT binary patch delta 416 zcmew;u~|Z~Gr-TCmrII^fq{Y7)59eQNJoG$2OE$qoN8dQQE@(3eVnI@V@SoVH+T1Y zMHfmmJTw<_DJXdBY9Ur4_?2zX#Y;;sEcDhaS^2=#qO*I^Us9}VeQOsi>vqPUcUdTy3}Ty=$`wxEe_hhefQ+=3%4U*rLBtAAG1)h z3zeUK=lQQg9y`|f%{Nf;JH}BHSR4ImUo`iD^sC|Tl~^PUN)s5_cp@4YnZ-cP`O)}K zCuTpZO^*51^RLQF={%6j;OXk;vd$@?2>_iCt1SQk delta 479 zcmV<50U-Xf81Wb(iBL{Q4GJ0x0000DNk~Le0000R0000I2nGNE0IJ)iov|UG3V)nQ zL_t(|+Psy!N&`U@hQEpN5=~STv9R#cX_3NGtb7Hr5FbRu!cGf)3=!;n06|bh1RF7+ zhzLfB5D1&gCT5K@W8qm@W7NfjOfx&MXTCZA|IexWOv4;WDz&@~fc6wB-f5EpZ*ne3sa15*iQz1eA9uvSSa56oU9Fbb}n~WR4Y?DeQ z6a52QKulCqKfzX75`sv_5-=>5d;$6}1&p-dWArD{HrWWUzbru;b`!H5vgSq0wN^2(_hZET-8!{@=&8^T08(LTg9YuW7>vj83CK!_E z_5b_*-!stI@b;F?RhxZ2-eyWnvzq(r)#_ z2#zc*xnS6`yhd!gtARoxBlC()(gZ~shUeFcvULEqcJJOQdBS)s-Ub_M|xMW^b@f{ z+yM%-oU~8W{q>j;?ZyLT%2{?dkXl_!TLFTL55*)w+ULM-** z+~88}XdP4e^6{$`)rY952BKL1qkj=2CO&iz-ui6l(Ee}3&nyqt76-!1^w2*)w8}O-tPHW rE{+fX`i=0Bf8S#+dCrXmm;7zM<;+(%<~IH^?fsdOQiFIl*0%p&rb5Lo diff --git a/res/images/edit_all_page_add.png b/res/images/all_page_add.png old mode 100644 new mode 100755 similarity index 100% rename from res/images/edit_all_page_add.png rename to res/images/all_page_add.png diff --git a/res/images/edit_all_page_add_press.png b/res/images/all_page_add_press.png old mode 100644 new mode 100755 similarity index 100% rename from res/images/edit_all_page_add_press.png rename to res/images/all_page_add_press.png diff --git a/res/images/edit_all_page_drag.png b/res/images/all_page_drag.png similarity index 100% rename from res/images/edit_all_page_drag.png rename to res/images/all_page_drag.png diff --git a/res/images/app_icon_checkbox_bg.png b/res/images/app_icon_checkbox_bg.png deleted file mode 100755 index f31b150851b55b3903078be0ebf7dc681ed031b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg~7JeQ+5q_CX(LkXEo-U3d5r^O2 z*vNY*fT!i*eZkoZM`ZGO<}FCzoubE@#KslCbuEEkC1J|qlg>94^xkRh{+)8V*I8)h z<}6p6dF&5ZavCE}C_iA02|3NHpkjJwMoxwM)uQ*ymih0vE4P5roU`$@rNJgSPxns} z84DWOq|k^RHUT#q-?wagFJqy?GVi~`RU;2?p z{|8~lFI}5Dfr64Ht`Q}{`DrEPiAAXljw$&`sS2LCiRr09sfj6-g(p*OfQl+ST^vIq zTHoH-DA*jp!*Wr0?q4&F31%8+RcfS#Ch_W|l{xn|iN~jIdpo}*OLnTt)FtwH+xk{X zzYF=lw>$Hv-0laHW~WyEdOg8m7G8LZ|3>EWeGzd6i_Y&-JU{mr!@M=(8}3v!*#X_a N;OXk;vd$@?2>{mRTMqyL diff --git a/res/images/app_icon_downloadable.png b/res/images/app_icon_downloadable.png deleted file mode 100644 index d9ebb601c6991f939f502e74edb3cedf10dc28a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4256 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 diff --git a/res/images/btn_add_nor.png b/res/images/btn_add_nor.png old mode 100644 new mode 100755 index b48a94181358510decf52671896d32a5c8418ead..65bce6bb15aed647db2ce3c024b448d2b1dae4c8 GIT binary patch delta 1406 zcmV-^1%dk26^{`iiBL{Q4GJ0x0000DNk~Le0000~0000~2nGNE032%&!LcDZ0w6;$ zHZ?ReI5aUZH8n9YMKwY*L^44)H$z1=H8w;wMKqIo0vsSiFg7(bGdMFbFf}zXF-0{( zGej~$H#b8?H8nOwHAOU&wgO-vMm9u6H$z54G&eCYMKv)oLO4S~L_e-i351poj9zez+vRCwC#o!d^^KoEx4c9NO^ji5kN3a#2+aD#Y*zC^Bg74Ep> zRd|oS0^)E}sfUDe3JN)p6Lxo`Sunv4cD%ON_WaT)Mu}MO=h@klcUP;`YD@u@xV=Gx z>moOUTY;O#O~>C^+-z=RZV%i>+=ko+Xv3s4e^N*=-34y*+{yv&Lx43rz6a1fZe4C2 z{5!Ki0YZh_TW)g^=I1S%jc{As+UVVx018F;9m3RNe1IC3fO&)oP_Ls73sC|!5#(ab zAiY9`C>;RyhFd=^K;eI`VFpx_<_HN83NB^G*@EPoUE;PfrP5GI6|5K`4BTSORR$=; zf64U-E1M`Q%J=B84H@xOm-M8+q!6Z4bC`!p(jHpHVx9%*j#Bn7ZlEIZMV37+A(zH1 zZP!_fJj9*NjKUOJ#5@{N1BC=WVRtd>Dq~)asDSGD)J&EinV4ri3ZNS)ugSx-05)U; ztzw@zubM{&Qh-)6)HDiP`&YsOE%|*ie>qVVnam7yT~coRg>%7nC{`uB!60c4Jb4T7Kl@z2EREC z=n6}ILM?4t_5x~PTp$IHrG~S479Ffd!M(rw?D%5(a}-;;NakwLbs3_bOO!u(3~tS5K#F|s7Ih>;t^V90kq`R z(I*8GG@VL1%h#k^)G~#KlH{mFKqCN3@l&3PI!kWhLKaof8I8(;o;$TzrVG)f6mU%8a(ZvaSS`e>YW_shqwnfAU#MoHWy`*Ue@>N zEs2!F7}K=@s1;Xgr>CdqcFa^EJxDjE+k+@=f6QYn+g&njhyBfH z?cc<_%`}V|cEQ30#+fQh|EuNTjj*$AsDU9FD?nOU6Q*%fYiCU^Wm9WeOKOG~z+uC^ z)f9Ovc;yvSaNBheS4D3EpsGGM)k2t3Uqgyw(bouzPZPnawrx=dL8j*DipfSXoRK8X z1kn>L+Tsk5L6ix_WU(x9fF3KhF%nyxMZLTxv&a89ds(+=kghnK3Odpbg`&lGsi^}hfE0CPnh8B%_Nr2qf` M07*qoM6N<$g3hFNxc~qF delta 1967 zcmV;g2T=Hr5!DqTiBL{Q4GJ0x0000DNk~Le0001X0001X2nGNE03D}i5wRgT0w6>~ zL_tM2GeR*iG&nIaMKw4uFfv3pIYKZrHZwItH8+!b0vsSjLqtJEH#0#oFf=$ZF-0{v zFfcMiH#tHuG&VCeLp3*(wgO-RF*TDQ0w9w(1AKpY{_{rw00#w0L_t(|+U%XpQrk!n z$48PeF<`TXV7~G}7E%chk(cm^XW+mM4m<#7iUZHUD{$U7;Ivg+y9SmR)_etwv9T?C z)!A0!6|%9ckI}UIU)AL}Wx(p6x~Da2&1m_2UMMczvR9TR(GneISf=4;H2i$qvKGFY zmNkDntd3U0&nT;eg5Npiun~_xuOV>z_(!{Zu3=f#VGK6lh)i2HVcB>Gl(02|mcjQB z-4)9oEGx%7qT>oyLzo!^s>R?t8TfrNn8pF{Jwk3X*xrIMGHcmngpujz#7ko&-&uBx z<1>SGjGNOjicYVQJcTDDMDcYT#$(xFp_+fq;n=CVI-?lI;u2QZLj@L!l38>DMZt;s z0mt8eu)-z{R>zb(h5x3mG(x_?6y2f-cFeMQERcpta00)^YWm!=M=D@-97nTaxCJNl zd#s*IVMlM+U}08gQFNc(8AfF>dwsR+Da>dJOOSe&7;4uOeo6eC)lw#6b66y?dIx{i zB3|;9;tp2B0%?-D^{r{V{40t8rzR5tpMh_POg2O7t=NRjbQ!bY?wzs!G&&U34b8~Z3hGFRN3hxOVR$BC!((MIyhDzRAT3UMD>%GF7@d_5s1Tr_x6P9|tS6JiS zqP81YZbVZ@)BS>la(aUOrHm%rE=S$KW+_y{LnKYO%nIr*AL7BbxN6ISG4Xn;Zlk$H>lOAJ0%<<4&+Cu7=4} z$0;XR77a02q8ekcH1)~`3we2j{Xs^+(g3jBD@;$L0G2xt=_#pm8m5_!87yJ23HAdy zB^WGWusoGWPe$i{G%PyOw0u7QSq9vNg@wfW`uYcG-X_%N`$J7j$H#xiSNr?>g<`ST zjQG#DrA6%4*4C$$m6bV)P`?jymf-j{H#a}Yh*)XM4!{Fa!;lkmxtx^a1h7&z1A?dC zh5@Xk<7^wNtE*BrUN|~Bx?Nsg9?4`fDcuq^pbblfLZP&~yZdLkT#kCXv=$UkAE{r< z9vmEeasJ=h+S+e~54nE{kzxuKHJJdm$$p?2u?&_d*arK7oEi+4FxWc#ft>09w#I%S zry785aXO}zhJmR)<5OjSkkNOR43;?9NA?Fzuuwqp)S~(_onS!^>=)(rgJCDw3j0NQ zRouXqg`}JAtU%O8hR?vZI2|jWhFfl6LHFz*W%WOHPOxRJj+K9{hReOcLY}^3KPjhg z&icr$iR_k(DCLT#XPuC4VC!5&DOWVr`vD8OW`8LoS61D?Ryk^wiPowYu%JsSM-R>0 zM8S4t)C+8l%609@$;q_?G=lQBN3BNO2lEQI|z`!hB=?`L@I_whw& zow;G3O4p6(vyI8ibEz;`Ke2D6>FK3{X;82b{$EAMJwH}tYN7AjVSu&I8Xj-ujH{lq z%W3-3Q2CD&ShgV0tw!OU8pEp!EYb zP|RYAR%JQ+CZ^n55u>FGahP}%irtn}aa)#}!^!qO^GO_| zlXx#&2AZA5jgH8(PZ$%ei69&J`Xm%@v;9|q0RZ$}j&wKGvUvai002ovPDHLkV1j&8 Bp-=z- diff --git a/res/images/btn_add_press.png b/res/images/btn_add_press.png old mode 100644 new mode 100755 index 7849bc4b850f46572da790ab1c26e7c5817814ca..e696fbf4bda8de0c993a5b60dc4645cc5a381f77 GIT binary patch delta 1495 zcmV;|1t|Ko7UvNmiBL{Q4GJ0x0000DNk~Le0000~0000~2nGNE032%&!LcDZ0w6;& zL^wA#H!?9WH8n9YMKw4yMmR+>I50IgL`63e<{QJdH?_g7fD1xRCwC#o!d?mK^VtpmzDzMAcsPL7{qAM#F$99Ac3do74N_$ z&%q_{z@tFIg;5hE@c=3kB?3Y@O1sV1)TIm(u6be`nGq>5I54l8LF@cIihB=RACmLC@>< z%m94k@Ku_DqO4)*f^=__%D^vXgbW=^?@Rxt7M%*9dFgQiX-3>&ddZUnc31i|sX#F% zPDl@EFh-k>mU|$*Lt}0tfaa)06oj4{Afv^8rEynFpaymAi5R+e5aAa-NUe33q6lq( zeapptNa>Cf1MAl_WOUO7^SCguMe-5W8Gzz0}S^$IsiWSf^W_hRQ;&wAU5Kw#E zY-5fOCgvAz+5+?Ots&38C(Q_A!sp>a&4je=o~CLJJH#%v$SFR$z4l zXcu!(rY->OWDd&I37|RVpiDVafAB`KO0_dkwaVCcfLLl|W}*bTw6rubGc(g~I2Y#u zw7R|Jie{)dV<%&l52 z6xwAzzV(1vHPDhh{j)rWe@Z1cpwKpR@~oZef2aktr1Olg+01_81t^59F#N8mzRJW% zcm;aJUEfvPqE0GJx7Wyfg17cWogs0r-WT0~S`=S#*MAtqZwZ$qS&a@lU^o9WbG*|h z(cle-my;tn!t#?@-Y{r*oX6`?9L#8~yv27^Z&nWq6l2C_t+=ZNe{@21w^Ra!a3JD? zXmSo?&2&n2_Iwz`@98`I;CG@mHlvTJuD(vz1Ub%#0^UpiNiobnR7c;(l!BfQtTNIaJ(0(S8k;uAHBl+YdG-?)5XPk=h1{t@KdMgjhNo2GQea=hO z4G=uYTXCCo5LtDSe{vB5%jz8p+Oqr5SgWuBiL` zkbW#Yq=<}R2LC1!^wAa0aS5|!7lB2KjVrx{MJ@8XX!7yRC~ncA0@(7xuGI*EjVkNo z34#12QuOgZ&IQ3P85eeuqXYMckN`zh0)&4Qao}wv4n#zLJxnvMd!CmRK-&ugTrtm+ xJH&mKi7Z77hNJ722^@SuJ|)L~y#2ob0{})_74jjYoizXe002ovPDHLkV1k7@t`GnK delta 2063 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 UGn)_u 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 E27@+#0RR91 diff --git a/res/images/edit_all_page_create.png b/res/images/edit_all_page_create.png deleted file mode 100755 index e6fa48054b55f2a8d8e054bad2e7926b8bc52bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 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 U5Nhcye=P&BG_^G$Ks_G(4@yM8*Z=?k diff --git a/res/images/edit_page.png b/res/images/edit_page.png deleted file mode 100644 index 40ed9ddde9ead4f4b4660ee550c7fa9bbbb35031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggK9u6)c-76Bi6M;h0JzX3_DsH{K zbC9#afXCsY+nhz#mTRqdy4i>3i|4t9)x_d;~g?!PC{xWt~$(69CiWQQL70(Y)*K0-AbW|YuPggK9u6*H-LuSH3P7Rho-U3d6}R5r z*~r-tz~g#Ryin!)`~!27)RnmY`8~a(r^&x^vPV^5sm!k36Jr!Y-}(vnZG1NSZ@FTPL}`x diff --git a/res/images/folder_appicon_bg.png b/res/images/folder_appicon_bg.png old mode 100644 new mode 100755 index 637f38a6c36fa5ce67d2f8514aa681b39a09d8a1..5d3bec12d4e2eff1e5c15fd69506b87e09634841 GIT binary patch delta 3023 zcmV;=3o!KVE!7<%iBL{Q4GJ0x0000DNk~Le0000~0000~2nGNE032%&!LcDa0v|;| zIWR*uK`}5jHZd_pH8?aiMnyFgk*7+B)fSz zapFh+f9GCveKMX*z)9@!Ttprado;f;-rCI1g>63~9=dgxl{3MgKo^CqFUq1T~T zp;0db?Sy^?-3Wb$zrD`CmxtbgUQn9!3ea<*dlks0O{!8BpckRXp-*ZR=w9f4=*NFh z(D7~;7UofAp*dX7{L<1AmCk0fOSxPw17&$!Fc=I$4WUp7_t6-JqTz738Knh^H8nLg zuX0T}=&#VD(4krZx>Z@iO-^n-J3BiyIXO8tGc)rg;H4TG8u9>@=O>^MUOo^ASX7B0 z=ko;tasaY2nM?rS1N>xw*NS z)2C05ojP@jH!%%yrre3 zwahi2hJFS80m@Vp&~HJ{Lzg;O<0xQ`!Y#9eM@!V!sNqR#blv(Wi&dWmtEGQn`2kcX zA%N|N)%H7B?R(HI(2;5Y`g8RcZYcxu^Xcj76Ol+H2a7CNBH@{CUD2l9s1Eo^sJO>K zI-L$~*|Mb%UmXgWjF}U_|SY#0-U7M;jL?^hqD$rnI zu|ZS=J9>M2cfvy&ZNBz2bSHn5-AJHpO<#h3D0hsHkDnMD8#{_0N)aTr(IB0`5-J72 z(Re(*ySux)&*m$yK>JnCY~6vf!TCG%U2)O*k&%%jaPMJ+FgexWteb0pld6FAD;q9^ zX{-hk+qP{xJFxNs-&O{5YCVCnZ~c~vF-z*o(a})`%u~w6a|F4WR=IzgwGu3$vI@ZF zw*LP9b8YHYjt^X|#tteDlt1> z3t+LGHW9!zG?q#NWdrmNHJDK>Q&UspfO!aUUY4!64uz@}q#altVlfIpoE+M|efz$) zwzh6@=$mRVC%YQZpv!;X{*8o*n6e0yb*7FjYXxS(nsBYWW?nn*0WP2AJ@MYep|sGa zT%FT}h29E1BVbMp4-X&Y1<=hmyA`iw6hQY!n-GHgUxW@pmpJqn(6isf<=F!|Xa?bN-MCw9Y?c0eDtjFEPBD>-V!K@Kn0n{Mh;RB?HPibG^!9->$|0^O&21jWMf zOg)zAbyqLv`a19@3vtMG=(_H60(zJEpNWZyF%Ayv;JtqyT;0y~dGB<6vH+8$6EhPi z2L*00ck%%m|1$OD>Q1gt7GNT~r8mGzJMDmS5<-*FBf@uQPMFVq>a}RsCkrwm8)J8q zVz&b5e$ihaW8JAAU08Kq^pjaKAsexKzXUn}T_%8@&=1t=**b-l7NDxf;AXiDZokb0 zdaVqV&|804(C+S+Vgprhd-jxULa3`upx24kJ!w1>%KIq4YVpa0Y#0HF-B+7HFE{sq z{y1lJ)O%xO=k{t)nvJ%6&UB>)%E_+9`I(%!#kofH8Ya1Md$K{_em0#>FBrQ9!0pVS z>KzqJDwUemj|F^pFCXZWkqDnyE+)`D<`!7!oU(sT-$ES%eTvgB#qK=>y35?c`I%lG z>#P)1G6JiV*i~@(9p)BJcJ&)0cRi;}CL^cnY!6yu!2o9t`@y`sARnycWfa3UHxJeXT@Z**|gZzMW9i03wlUd-#Xn{X^wMwN=tMFP%aSgt<#;A>ctcis9!1x znz4VpARpq)G#`y~AtSO9n^P-*qHYM4PL}YCT_L03%AvRd(2`C*0@kpeKj~vDZ=DKg zSnQf4(39pCu29oo@Jo5?B%^RR91*+52=urB+RSLc2f8Xydb3;#IYgj?<`z(oa$b)Q z)EOulk(JmrNTB~Sw{Q`vo+s%;wTG$saM6FR*!>ZKzF!iVMx!ykAk}Y}>>DJ#Sl4C^ z=|KYh3@T1Bi9{kzFy)wDdg7NAKnoU1Mr38|8bSN>nU16WZGH*lySS=XulDuJSMILr zPb(IS$@%yH(mf@Xf0hiHbalnKD2it7yM3v<>s5GMlkWtS|0$ZHT2a=lfchj2cPD=n zvJtE9^4cgh&=Kgr=9fDV>He&a?s6R(cpe!$$N3^%M$2rHGCtxL9 z??CkuaWWwrvHL~+4-+Vt&@31YQ!7fJcKdp^QZrKonTT+S%$~Oc%DhG|no4tW{wK4}M(~*%8dVs03K0uM4o}QiJkiRHas{&==TE=PpA7+oi33q=h*AIH# z^|h<(yd=H7y=RNTWVY=0+I_biP%a($rMZD?9hvZi>&aQCcy-KFk9F$Q8Mx;Go6I@C zhKAMxl!eKy4wxI5J%%wqf5?mVsTm^i9s_|u8}9iWaTu9AS?(N8K=}}#>C1{!_Lz!? z*<;`ajqEXaX&~AhIOe^jQmKE2zP`RaBK=TGG0A)#pe$VCU6MJB84ePO#9k&m;a|}U zP-Th?oy|umU6jmb@4M-;Khp-M$!rW4`xTRs3QAS-5{F_W|ffmWx+caM3P4 zXSpez}S)ooeWdU^nvhKYxavvpn?rAG?x(exL>%*yB2*Lg(dM!2V+` zC*Nky=#lllk!m*qD$7|`=_}NBD##o=Xf>(|x-J*}mwScUryG6Y66pU07yx;o(7w?n RV&wn;002ovPDHLkV1f&3n7aS~ delta 5083 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 diff --git a/res/images/folder_appicon_empty_bg.png b/res/images/folder_appicon_empty_bg.png old mode 100644 new mode 100755 index 5a5940b8400ad2e9f9e18f0f1d5e815a261b2fe5..b746faa76963dabe19863e3b976517d5dbe91c25 GIT binary patch delta 3036 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 e+im&300RJy|4$ByJV9Lm0000Fvd2h?A3%Y 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 NGly7T#~Q;D{s-vCby@%b diff --git a/res/images/frame.png b/res/images/frame.png deleted file mode 100644 index 1f8c2b3c4e7e23400f7e07a142ce9fe6f9553602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggK9wtt6_O8``fW|PYdb&7zuQ z)6kFEP{4Km_63IO3!02wzQi;z2jm`S{l+v$Q8ji}$V&_Na~nb|8AWnFYZ?R-)c`9A9PrhdD&AEk<p{6p%84$q6m{)!paOZ$b~Wo0*%nCLN^I3S?|kxak1 zbnMtIROj6fXYhGCXIDbw(W-R}GfwS%-DEHRnp1-75U*nTnzx#dS1dDE_T0<8|EO}o z?Hg=$?Cv^n5@90Fxi5+re3BpBnD_n zo2QFoNX4x;Qvxt5UtDZ#y=7y*!t|^BwJl}79-5`P*H&e3 zX<%mOld&jxaNxgO-K4%tnHT(DE^hv_{7`@S*B?*MU)t*Xw9>fd)!~JoY^r4}KD<19 zbW@o3Js$h->-!SV*3O-BZnl4E{Wp;QMrQVR;&l`1Ql2H&ZY!Q(9-r`~ZA+X1|MYXl z{hN@HD!(n>ZJ*7z?5)pd9>4h*q>FEl2m4)FjqEKuiVbS%pjY+;tpqsUn|hp44&++elF{r5}E+6Gn{+? diff --git a/res/images/home_button_bg.png b/res/images/home_button_bg.png old mode 100644 new mode 100755 index 2d6e8112cb068a23a1b1379533c1e5014b30cc33..a5055799a34ab8d00a31207f922a4b85f7e88a9a GIT binary patch delta 1114 zcmaDPaFbWDGr-TCmrII^fq{Y7)59eQNXG!N83!AX^lJE*vQbfuDcaK1(9zk&+0ek$ z!qCvw)WX@&$->ac*~P`e!pP0dSV^HGx4_re$|XO!G&eP`#M8xA2`HkMl9^&<0nzJ% zOYh`GOomYN9dW5qQYbD7N=>s$!EL@1F1?fWn4Rji0{2)kFfjXix;TbZ+H#O{cAIMg)-Z~Kbfy2djuji45f{A;ia+tEW-ubT?e^B=V)4P_b z@@_veHi*7q3=S=PVr#+U*C@ZPg`ctafr3Wh(V6}U_7=QJX07Mho;xf}QsH;7t;lk& zkhNIn&1pPgegeBizSoWzk^V-tU1w(qC!}xd&N6$be86?XJiGehQ=$RPbtzzf@HhaaVKBjX0ZLsB`GK*888b z$@Wu&f~H+=-W<~X!Sc%kozE^6mbMn&JFk4;+v}e4W_fVS>4(!dmOM;bu5@VetM{`b zdggu!`e83{Zqg&Y_=<}qH5aD@UGn5VcS-e7{H5m2Te?4_15L@@Q~A^^^xxb1oBat& zwKwiAZ14;UdLntd^w)-YvlU*|Kge9j|9YbHMo<2U@x}Iex}O9h=ShD5sU34mjqhUj z){fizj)>|>vfk5}=W8f?bHbFBBJ7P%q|bgywmG}+%|Y!w|FfUUK8x}4ce}J|&*3>6 zOAe`SKHwaiG~>@@X0g?dvUw}tHJ`40cK1uYs8w}nSDDkcIX65XOcU{Tk4%rs&nU%xP19uscp%Chk2iAuU}rnX#4&7#!tJX=RNtw{j=x2#Iil}KGh~TP3)Ss_&9sX zN?wxz{Iue!<4ORaeUz#ZOtEy|C(~;a9bK772#$ YGR$AUobdbrEG`&4UHx3vIVCg!03a{yHvj+t delta 1510 zcmZ{kX*Amj6vbmHA+@Bfh^Q@=+JeLuT1w>qx13NimZF?cyP}j@IvQ266*Y{lqa^8| zr3^~#Ya0|jq6}jh#I!S^loDIDHO}d0AKty^y>ox}1cbg&i^MTtTn5HVXD zBKg>pkB0;mI#vcJ!lXe-jo;JIO3xV7*Td==7+|r0p@{)#WC?)AAZTfb#Q|1m#kjDW z_V%X4i0d(7{^8NKL^Jg9MaM7L&lLZI#h%3GGx@PU`fvo)lgLu{D^zQV(q ziYd_5N}cK&#nE&qn#a$JP6LvV&zBJ(0b^ z)(N`UBx5?ha^&cimc>40e=opdg6?To#_ikGZ4&X2sHGWM6fk8unnC8g)+6ml{}~6F z@EAwe)Ri|gs3Pr)o&wmo;-_PD+Jf)p>Xd45xckXY}sH;zaUq5qK=7d75LKb{a~|^Bq^p#oeYI1U~c3%w@3<; zzW#}L`K~;lSLL7llrnO;=Ow_63gl^;J2gx%YB}d2D0w7F)isowTddfNbNNASEwj*A zE&1^%HypS`-o|o&W~tb<<_D{IrkIx~hQuM`MYHLc6<_{rJ@3f$vdC8kVdr>|Y(3ZG zWh5v?o~4ukQpcgv8sg&PiPtl3qk~eZToYAgXjCbPXW)rrJ}95^Wl6Jd z285nt>j+Mf%e3OHG2nN}=b3>Qj4L-QqvbOv%Tn+h)ulk=%F>i>w@Xag^lB+-SNkp_ zjyO{EH4o|2ybQ;L?pJ&nnhS@e$q_GYI-VUfqB>VUY{fWTV_tt2AA^)j&X!jDjv6~K zvE68KR3g6a^Qh4jb3WwtRO}O9F;_27qByd!qVNY%+b*~;5|WFnHK)FzHxS|ng*x+M z|2b-g`qeyC15Dh#Lz5FQ{G7)}7r%9=OK9^C40lkcz5`wVmb+M#xy;)QZVQz3k_Y&x zHIu-vnFR>ZBrzM0uGDY^`~n@1K;7Q%L|1(RKQxu_X(iQ%{Kdy=tk;X(a~}@h0V~rx z;~&tNIU1F;`x0Bqh2*XZC*@oPMjN8e9nMN>OJEZ)I-v#d(WAbSN&zg86zFo56K4NJ zVTcUj1;Aw82h<<+6x7 z4!eE_n-oML9_)F0TNlE!Q-@Nup z$4y@Ua~h3>)`5Hqnbr+%fme4ZI+(bNQ&MSw_IgtF;@+)a(yPYITk0#;NFCJRsw~G5 zbr_3q)g?z(H38E}UyaOGk1vXvwLVPie7Lb!m3Xmfre7#8XR90{0O{OSaa`73&p3YF N5L>{3SVy2F{|^XHoZA2Z diff --git a/res/images/home_button_home.png b/res/images/home_button_home.png new file mode 100755 index 0000000000000000000000000000000000000000..ec4cdcc3cedca84dfe77aaef8cb686845027b204 GIT binary patch literal 1376 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591|*LjJ{b+9BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6f0*}V>1gg zCsPw6LjzY+LqjJEXGa%jM^{T=paKaem>JmgnmD?+I2#&S7#f(G85+8pI+<7+IGY+d zx|ldRI~%yU!1Q|N6_+IDC8xsd%>>#D)oYGdua$FAYGO%#QAmD%4lD%(WaO9R7iZ)b zC^!e3DQJXe=B4D97i)r|2jW|o)S}F?)D*X({9FZa_*!LRvERjjkiQ{%Q^*N3eV}9X zL5Tw?vA~3YDG&=YQUWXk-+JqfN zL|IvvzVN!UE6_YnBX-KF6u}Qp;!WQ22V1Q_GS)B()^NDS>RrMcx zx+M&|B`3HyPtE z=D#SNz1nPfimjUFXHK)vD!ab+FFC``@mXP)qSbP)lWccIcw1ZiGVWBFyD&3*&NSaJ zYw3$9F3*|a0cV}Is99b1^w^dZyhTgwA;(qC+X8D1yiRR7&~@(DuIU$yEZCXPOuwxd zSibVEL;T~w6v>#bMcY0xWj#=P>w8jZ#|9lwNyhL5#a#FK2WC86^nL-Sn&bY5F|*94 zE?c~O<74LD)^i6~W-vZ};F5eU_E6Qa`xk33MrtjRy2J4K!Eb-%yn}O+;`DDY*FKo> zx-Mku;ug#H+-H?@Zcp}W6F$dZB=Vj2zh)qB9mD1ahGlsocbX@iQhc4R_De9fS-_{+ zVUPaPwToBE-g&%9xO9=v^n5@90Fxi5+ratgc-ff^I zcRXDjLn>~)ndZxN$Uvag`jJ=v1IMm(kt1_8D!TJrM5f<6)@z?|^#@a=#+D-%la_tq zt?72UROj<~nP{@lwYFEOx|&@=VrIIJ`Fa z*17D{bfx#=eR%VVeQ~Jt z>Ge(3&ke1lvirD#=g)c}a%alQ`9~}kFQ0X!?aJ1)qCa1I)*Xmd%>1r5^OwlsEsXvf w@(-l*_AU7F>}qiz*ex2any=PQXJBSHeX!)m3>o3$K#wwby85}Sb4q9e00w`SKmY&$ delta 446 zcmZ3(`I%F(Gr-TCmrII^fq{Y7)59eQNZWxh2OE$qKDfeVqoO5~g0rKEtC@+Tp`n3^ ziJ_sZsiUKjo3p92iIb7Bk(-OF)8r~98JHpioQk$FB}@)tR-A0kTw8B)vE6}zfl=Ah z#WAGf)|(sW`3^b=9RC=0t6jk_?oh172a%W^A6MwD`^Vzyw4-~8+a+h`kgc;%=KY%c zWcrtDb#F?nuk}B^u{!DMo-VP12L~FN+4*EFAdEc2J-Rc!-%YwP(ME;aQ=R+Se~ZRQ zuc$t~SAmx_xXS;=oO&)>U%&dm75xm)r|$yFO2OLyMb@5-OO&a-o1Boc>1T1#?{BjA zJ!g4!i>BVue*al2`lG`}Z|2!iwJJBY7R1jr-Lmp(u59Gb$xJd9AA+t8P`7j3>O)}q_7Jw9?M|P3h82q1q`giTcddttgM7x$ zFih%)giTSEgEX|AF~pz`hhCu4zdn4Vf#<69QOV-0P=_P$a2CP#tkH31V@G!BgL|No zDn!7C*aoS89K=eh(hFUM%(HEl1`7xttMpk?U8@On6hTm8_KOb3^FWdqUMxuxe;WuK zFR&bWr6MmXB}oy=VEND_TI3FtmQi2EA}f_1VH_$fn@z4Dvb-$InT8+~38ENJ z18k?oATHzz28^A^3$cd+kSW@IG{GuOGCezjAFgDBcv&V=FgCSAmS?!^NIB55{txy2 z6*|T(c%JV+h2zdNglr4OXc9T3af3n@Dpd3c+89M0gpTtnHb)4fc!WZrw@u5X{a<&U_8%N_C>ua$-1tUWs&D=qNW>VnG;`WHx`lqj*k}JWOhSo{H_j{kVe!r1lHy^*;xSM{N->0~DH%_dL!p#ep iukQ8cKT7WOIkibW`?hrne|_{eyG>@TVZ5*QUi<;`1|-4& diff --git a/res/images/home_icon_home.png b/res/images/home_icon_home.png deleted file mode 100644 index c519e8d252324780bf6a4fae1093e3a92689533b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1526 zcmeAS@N?(olHy`uVBq!ia0vp^b|B2b1|*9Qu5bZTk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij}jgv6+RL zlc|Z3p@FNZp`nw7v!jc%qpKw_P=SOK%nWRLUCb>FEL>d;4Gm083=LgPEldrKT?}0; zoh_U!9F2`EVR}9Dic1pnl2c*!W&-Vn>NUWt*UGslHL)bWC?r2W2bKZ?GV)9Ei!<^I z6r6+26g0v!^HTE5i#0*f1M#g(YEfocYKmJ?ey##Ie62FE*iYEs5WOkngqc3jG5Vmy zfs|NaLckOVV#1R?kOR*=sd>O0Qv}Q!Y`ZV=FfcHwdAc};RNQ(q^R%{0pv-aJnQBSt z$8%i%F{!3Lp14WDv+_!XsB5K&QL2yE%_z;(#V3?g6g9KNwxwieDyF`lcwFXw@cxy7 z$;V=z&ntdE_x^Uf)t7C*f1g?W>|XJ?ubhgXiVS~NT1ttf7s8QtXG6GvSyB1U6jO(g zKRyxVylP9tU03y{L{{+8j@Y+!onVt26Nl~k?SoSnQ)z7K+LJQwF^%ng-YCB{Foq>;DVNAo`W zw>fI}xVPm@@|*Uak=;-5J)5OHnT9-t1lPtVKdAJ}5$5vAtv)#SG2Bi%0!oE9G>-nOPC z`F!m#Z%l6YIxTXsd7b0e4*NzUahU~n4MkIx>(+iq6k!ehGH1mS;p^$HfA6obOVwoz z_uRcKl-qi(c))+}|63p2beey%^oYYm+1rf-*imX08L3#GbBxF6*2UngH$MIwb%A diff --git a/res/images/icon_badge_container.png b/res/images/icon_badge_container.png old mode 100644 new mode 100755 diff --git a/res/images/icon_drawer_search.png b/res/images/icon_drawer_search.png deleted file mode 100644 index ecca32619cb78341f59843d8f1d0423161a82484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1892 zcmaJ?eKb^g7#}YAI}9UDiZ)uxQnnB5 zk+YrZD2z}cWlE~GTUm-~`dWLU80?_Wy;G_EW9>cn-rvW0p67kv-}~Hi_XY*{n$2E3 z8-u}^`TMbh(a}r)m>Q$+h}e0L(7_t%@b1W9Dz zJ|z{&4Z^Y@7{pQuE_gnPOvch^1hOlYMkBAnQb=S9k%ZnfJlPeX(g2DZ_Va~9qrrkW zAehbh91C4Ba0v(^0f@xZ)Ko&M3ju=TiDWvRuGgSY@F)T=O%o$LIbJMXIiW@ zL4=SPt5@W0g=7c=hi3Yz1d-&6tXTT_n9u_w%6SqZnLyH)GzH{x{~sz6eL+i+VDM|c z|0ygDO_PAcU{DIlU_RQoxRv@)5`YDRJOqM6At-6;6oV2V1d=8|5-cl(hINP#iUm-r z)bS&p%LV+!QiLbwgZ^v=4pkrsg#v&=C%O5!xY0S@bT=~D$Hkk(W_f$lSsWJ0+lND? zPI1`~UnT;@$P`!bmCKx#tG9wkf<|V8urLJ_a9~J;{a7*}oIV$~Y4tvH1=HuUdRi_K zO@^p%?7td4wS~GzKmB4`bn(Ubpcr*KjM~~X+nIuXEj|8hW~luB;NeG*8PoDweV(GX z+0@6e*w0U;D%$qJFw{0vU7%B6`N6j>iugfkvdm-nJ{wnL(x+14w925}&iF996@R-o zT|P2qGN8D9=Xhgdt-E6A=3rC3qOkME;H$xm`1t;#bQin)r;)W?Nr?-i96T+T=ay}z zMerZwwE|~nhbrkB;>0XZW%m|UNt@fQ@ZSvoSlj1il+Lu5Z;fV5PTEv6o&A8ujfDf% z3snBO(as4*+w(UKJWU@B_t<`Hb%|ums;jq3VObU|k+ffmO9oj%~gQnu)y|)I-)5>)WWno_E`rX)TY7SS_78NAs37 zLGQ1ho#@OOnFQ2%!O=hFsPhiiRs!lkNE3-enD~<&9su` zsJrKMc)b`KE!HSXU#Hb%6DnN#iGc>cM(r$MZ29Zda!b?YH^Um%%N4#snRjoubb+G^ z%Ep4dJ+TU ziix|hPBCk+KFh^!>3(hzEsiS+EW6!s&VB=NbJdW>-0Jt2FD~kaOPxGRhD+jQuz~^f zW5VL$`<6$qH=5`wCzJ2Z{odFv^SfIb8>=GA_2b88))8bJnQRShe(7oa6DpHx&+6B5 zjPS+26J_sT@(U|>TvYQd`ff-I&)xHM2zh9bjl4znJ%~E9XHmn73q4M%+WNKb<@3H> z<~*SEX2|fp2HkzG3r7w}f12AfGi70g{NCKi*watqQc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkcW?^P-=3-*$>||M)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GS+DtGW)I8~H$7b(Ln>~) zx&Dyzuz~<wDe67e4}=j?HiLg2WxcnJz35@&F%(npB4XISa?n9 zT-fx2LrSwU7ImtDhU`GTW}Xo9TTA)hbI!Jddk+fi5dER)`K#sd+5>_6yTuB;3pO+@{$7yPBR#SD z4)Y$>g%9EqH0}uVG*>q(e()FecY6@`;|u>Sp*!6FC1ZOI-hZ&vl&zNYf$T(>Q`CNO cd=*MykWaR{_;{<`Bv8ipboFyt=akR{0GFwLE&u=k diff --git a/res/images/icon_list_open.png b/res/images/icon_list_open.png deleted file mode 100644 index f101249d207d8b90bcd6ae08a682700a97194689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1222 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 jbUg!S)y@Lb(S8aN+051eik~&W6 zb{0;q#t!DMz-D$P<{()cV@q>2b7M32&p*utU%i5{fNJPC=_o1)nA+K}82_!q;$~wH zw0`wUP{hsN*wo7031nh!3AGiXIBn~q071=!D73j1*%a-?%^^@34+nE~4jd@BbFFQh@$Z#mP#D;-8b!QB(nm+c}tn zxLG)vP1)GlK|DMx>|ESDJnT#$4mNfURyN?5hnbyAfSX5vgBSF#9|~YJ2Qv!+H3_MI zjRkxXqJTI#*$c3;y1KfuxN@@CIaso?^Yion?Sq4Z8K}YR=x*y|?8a>CNcry`B+MO6 z9iaA3P&-@D-yV%k?3|s1D1e#%a|t%~ii-c$v9063HVW7>RySjNR(2LPRvVkY>-tA+ zM<+G&|92Yyv9_azyS+K9nz^H$vx6z{JS-^x-5A)r|9POl6@l3ZC_6xbhhl6kVQ1=W zV{YptDw$A4-I zRORL4Vq*t3U!0v?k_#*@B`zi*AuhqjBhJPyCiU;OvbK&+#Hj{Sf38--+yUxhZYJem zX9N1j{t7_SrqRDB z{6P%?;kDSiJb9d;ig#W1n&BT`V|05$)igxQ5Z{ z_51QR9$id;yu*&C?V)SUf`>SH#SCle%*QVKlz)NWaVL|L^VG}S!Zi^ypqma4A32yp z)xnt!e;bVkH=w)Ege_GE84fF=+lZ|eANgNJ_zFyL0b%|BD3a36+hH(zBsnX!8=o?} z@t=S_CXa$ebBd)KG#^xz$z+DrKX!}^(@e_^N;MA>%PUQM82rsbl~0k=7!F3er!W&J z^hB6TCw0I)r``f-a%T9?x~T*`8d2*00K14SGiP4-G0~61Paj^%I}5Co_-?k^y(XVM zubZChOCdQE>Sp=RLH~J$EWkt!}YQ6Km!kf>`n^)uDF>!-{BU2Mi zGUQO8lbf@%!QPkhy}dn+X#`8l-9?$TH;xDB!ky+E{JBDj?(Xij*VosZU>cFk8@&C) z`1tt8&sp^gLO&4HZBx?t=aHsVosfOi35TlD+$*)J^qf|G7wXJgxIfL5Qgb3H&a1Rs zwp)#k{OI1;i`hL4-Tm-E@$gx5(4zbXo@qdGhB?lP2-ueIkKzMMZ%oX`QrS(NtgVmY zEJoA4%`ugg$Ae(tQHc?4z&k(b?t%!TXzquS7&CGk=h76uXJ!%){Qhm^=*aPI|7l}$ z(`xD^e;O+p8ynk8YTv1FTnZ;GZc?*Mqt&lLao<<2LbrYgo!BGd!KJ6e1^l?LSEcp- zrxSBr*p%W8)^>GSvGW>iT`jSU`J1Hr*XIf?SV&2WNOeC{-jO9-Sc3=AnvI(yus>(D zB|Rqh>ASFE4W2?+#x1*FWa75b@-3^&lY_MI<6~p(^W{@mc!8a`dZ3IE(zbEl$yGF*3|Sg$^J`oGvC0`(UIG- zFO~koFl(0=io@g}tDg+knIPfx)8o?dO{z4$pK9dxH+in4!&fqaZtFy1To>NsB7|w$dAd z_O0ra4jZ?3c*1ExV(^o#k9w?0cvTwFdv|%y?0cLVpl=!oi2@AgNR;NsbKt&a*YR z8pqsBv}Y_^=mBLcpkE%ez*pkX*wM*HX;-ye9w7r(~2sr#^uHIZK@M(@l+#A!1+Fd2~JykzIawi7Y9Gs z#H57(iy+7l4#Y{5ssxi!1fB9(^#UX7tJmGReQJ&6I?-c2BA1q2m(SB`IG_iAw5f3I zqtc^c($dnN2W9t)a+0QhnyE7%uEtf@h%V}5H~sNZ(EI)}e}L4}T4ZPqCM>X+PzGl4 zM-)*>!7}^p3;vea&B@AcS~U^^0{`C0iLhMiEJ=hXeCnEH0Y}5BUM!z#_be<3!UqT!oVw#amwUNiR>GqK*BHp=1>jj76kxc$CsG|z}9ZaN?F3iw%>-(BH{ zza5dee>h*$g_1D$P*##ni1Ow~dYZ`VLdBwE^wOUEDD%MBMO7)95%2pF#bFN zw?iHBOGvsE#UK6>2EsQt#Vr}^{xgzWa&mH?K76y)rV2n94z4LGSbUu zN8OQL3U4D!B~OEp6g6SP%6LvRtCgVBW=ifDjOrDo)=`o*coJ9bB02TT}oZi!iDR30q* z(w2KonQ-17`=RM=0|QdaJf|ANh0opR7HCpgZR9g{nvZxevisFUp15|UBqH-`Vd<|a zDcY1^r3kE8;Od9Kb8hk8ce!8ebj5K8jVsG*bzZ;nt@Ji9FqrW!76*5i0&?#2t3tcR z642jIej51C#pgnKjc-Kr_kaUcBY9_c=+x>OO(r5-0^FuG$;BM@QShi(ph6Pm@2vbL zF4;jBjaV3;@SgbiGoL;G$GP0afFo2$LyLO7i73F2G}uk2Ay7M zi=mHNa)%(CYO!}co|<=$T1Qh|Q~EhouF`p0ZW_&v>P9kQ>7M&aMNlU8mL-$hvvpH& zd3_N%PM+iLSSPkpNE6W~YI$kI0WyAvtuH?XTf85dy5x#H@=|~II}SQdDfFtc^*Sy# zKnH5{+g#qwi-d6%aE3orfLZWjT~Jp;Ivvnm?l1Q>hm)BfNEc`7u?yAmScC&2!Tc|I zH5Q;_cO;s9JieP^cWJ3bJbZKy$fcfa1*@njeUWv|?dMoSkZSC(*aoN#6t5613inf( zH-szR+Xq9fAzs|C>prI3=l=Y9=$A{Eu&?eQ^I(loG>YC^q;AQXsGpBsxHgwcK0eQU z?S^*kDX!e1$Oq24i%3Z(E<4yC`<|SVifbVbyliY|R_rYwK5_bmhGI;PPfsUE-Ptjt z--ts>MALf-gghG9nfdwennOYc9?VelCn-mUF2I&5)~oIAyF#c+2CMk7g{aJYMPvTE zE?{W_KlS1M`S&uWKW^{tm_6_JOQf9+=WMd13jQ>4&wYuOBD|y)9A^aNoCE=-+I>9; z&%^I)Wu^37D|{&l(T1Z81aMm{P}&j(8tv^8ldDIZjm z?b&MmCDbcRR!taeDyY|NXB?A&-GU4Lpla&vs=+rw=MCz+{az*8iOZ0ckDPCmb|#ufR7CfOCg;W^@0INW2R*+gs~;i9#h2Xjks*;jaqynmj8mV=Qy8$0FU%4*`K4r$$OJm z`>6RL5ac`CEPXxs@m66L5+#&G%(*~Sjign{-8+j2GePrDS}NxRp;?(ai+zG3o~$LW zH%!&r8))C9)u_-9T1NJG3qTUMX(2QT4Vn(N!HH*zbWmps>&!wmz7pa{ez2*zKlUfS z`?cQ1uV2{+V`WUQzSl1ThyFym>};tC4(U{rT4oXFs^I1!W~|q9(TsQZ;GC)h%xZpU z9g{=g6dXAt&i=lmxFL?AADe5Gezro}u3F>Py!AoCYc}`YnJGlF&q%gOVn2k;=k~B5 zMwpNmcV!hF#WetTyIQaD6Gc@HXU%w-ddaPM)iitDIn(u(@^Z36o}^p11>m5S3zRDh#$p>=y4Ot^s@`h+dgeoTPw>2ASO9>+Qv%x9MnBiw*l;({gSMSX6s| zy@P6QH2=Q-{%vV#=>%vZy}(=V=#WRR!#QSNNXFrW5-pPiMFN}K?UI`GgxG$Y%W>c6?`(|^ z#}u>v*uNn9Yxidx1d){ugqzd>QftK^{Rb93Uv6JpKlGSTF?4yJY##dCaC{O zz9Yl6gErpoo>owB8M4D|yPOKA2p!KBTF0VQB92c@btAF)jDLDbTBz#`!oAb|Qz6zB zSY~x`>bkXW6Vrx&eietnC@xa+fSpoPS!|S=Vzk|WF&Ki1Ri(6>$nGw&UuN_;jDxsg@Re; zMbm)Y$|T^sJ4O=TDfj&REP!l;7Xs)Gywe>tM|XaxhZ%_h$zYNrKQqmh%JQW^4c9Ua z4$Du55|vzX)~l3ef`#rfRciApRKrnLsDE>)N)cU6p^TY-qo2XGZ*r1lEffJQ6nuzD zhPMvU`ywv^Ra!&lLAs{i`JFQ|C`HkKW;{n2hY|sjH*CqMMGe8Q@Qib8;$cW{=2WrdfExd1j zy3gdHzN-rhEf;{k!R<*AQqMXdJIz3HunCzPD;3IJPeFWd{>0%}{yjF+N3fgrm<4}S|4;(Cg|?& zUfaLAFQmC5(rX{M%Ig{jJv%M3^=#Z#$2(ghxIJ%nY~iurqrexbO!NqQI1_y z;c^}c5*sque9QxJuf1H~pY`ucW4%!|NUoZvPkn=fs%?zQAc0OjAVxHUzJBoLLZzL} z=AwMz{p8!|Ha8cJnCbG@VU^i1Ei!&?o{^Bbg^rvXNMoD6GKXsf`vVtj+2STa7p-l` zzBG(6*U-Ek{ezEsdRYH$+xO(0R5%2PZd!`Cddj^sJnzZxi9#vHqWVR3;}Ux=2#WiC zroY5!)zP7BTRsbvqJ9ufS)yfuI`Jm}s6{1GX^B={%T2NeFr`2H98-#@Uy|5m;H?c;@IWEZUU9XrA6`zWNv&J>;;2pW`W zYVU?+Z$N`pKIj4YHlo3V{Dqx>26xjJ;}Xm1a_RO|w9>|PNiR0KDWFInb5A?0D_-u| z+?)rtf@lw321L?78Go7295!TMt=1QOQ?Pre(?9!2u|>GGX(D5eI`mES;|&E?#XY(O zv02HllHtcpG_$Zm-{WLOgK!*`=GgpxuH$yGT zS;(iOv;CrJ5|VkG$45pUX^Wh9&}Izd}b?sMYPt;+T_}TDbF`-g&cGi$G>Kd zv-oPc2ESz9i51HQQT-tAi(1)?>)wPhyTHdc9Y{7St^WnuWylqy?38X=H7*JRxLvyF zdyBbJRnyK)?EcJznNL>_&WCgQVwj|)&*}hXCbG2<=Gnvst$uubl#PpvyXgjHkx3Y;(iqP%>`@5DXpjOiVH)Y# z6}0d$RB6|GJNvm|m+hF`dhuD~NS4@)9;6Z#_tm67e8EgB?%Lz&YTmao8H2EZmCE+z z`ROuR;>U-kOe|-qxc(?A#dI!rgCe!bU8;rzGAI?e^93;StG+qep`pbnFkoRuc(np| z+D!2axfG|`5vw9iE|>4K*8y6_K3!WEZy?vN9m^bV7i@*!*P0q@D8HMd8@L_SOM<7g zkA>sY`FR|IDfxdja2y zM*{th)ps5f8rm#-BjR;?7G7R%CGO{g-4LENsueV$5kA$&iya@%qu>iNi3@kNx5u9Y zZiJ+n?l`9i!rRxYD_Pd|gdOX6fx7H@UcW=Ulnd(Z(-oI;g0qA?uZc2!4~;nx%5ne* zJOC~(aDyYSo-~kuP6^k^{@XS&6bso$7r@O{r1i=_Z~kBoryvP{PuSl@%~yyH3%l!| z`mxuP{|{WP>L0k;N<`oE^hHCc?VLY?%qjj{hv!YOrX`%*6T`mn6WPo_{unw1j;)8y zaPqO0g3Gu5-N{1{P)>l99eUIEcry5n=HrEW%ZQ=}Ra5_1f~`~$v)ahac#cQ{&K(mY zBT&?}RDH%9w99Jhtc&yWdlC|1IB1+1LxF9b`Bj?Z=8veA(nH%dpNA?%RG|j_)<;JG z(#S2V1nhq$`0jzk(Q%7HcVdUx~nFzQ4)jcZ}|SeqqhrB(?W=q33kp$y>Mh zK2~EBH3->z#kGnNnS4>s9ydr!E;19ZRjf}c)X%^9Qd-Z(em>uy7v|(jfO5Qv?RP;y zooPicJZ+SOP|KSndxc!r5JW>{@-wlo@e1}cW}oF$IDg%^#=jd~2%TvJ#7OyPXTIP1wl8oqezq68{}ujD58L$KJarJ9r74AdpGj2-BkxzZF{XRi zOv3)EqXWP>pS2$ADa3vXOY1OZG~l9Yn-w-(ch>Hl>P=42?6fS-Rd@Af>r%RW4KDykWhAHaeN7nN$T1D$)__`P}{It!KV8J%^!VO^3 zq@QR16l8#;dm$Ilj_g9W63fSG@yNT*sxSKk~F`gN#6SdE``Ac ztbK!grp6amm;Oi{8bv(095BAG6BT9H?|S~_PVc1}+m+UUGbRZZA+FV71O$YKPqXEk z-~4TS9kysi2c`I5XFP^3xE~y|ioV%v9ATklCN}k;^?Q*CS|g`0q(GWN7BfCm+~D-% z;!+F?#50Ya%AAoDRE~E;MTBcCD#tQ8kE4vUT+Z`S_j&ldFD~$1WZk8k%3j!xb2cZ#L^CkEM)v zBO@c%MihF@fC$h@bM&0!Z2#w@tHXKTDgIk8l!Af+w9NOew!VOUI~E_*;QR8-U-jWz z_4fMuAFX~=tNRptH(7`*tJCjyPBUko2Qmdjk*>4(;>4WtWM&h4F{K}m!$XV4>D{FA zv|P}$avrnb=y##&eN0*nDmPWL+wERq*YjLz(^Y`~h zMvwQ$Skq(U{#oew-eGI-HD`jHw6KPQLmgg2N^g;T3U0?)57LJq9`(P`M=%ig-0j&- z4IW6WnbyHR<`}_Ren6(fLh6YX0=wWJFj5G8cbBDBQ2y_v?=le#Qn&byhhTL`}Y(jl-Y+5LMKm^lOodR zHdTd2z6kn{y<~$~SJ)x;X~QcAZGW`B^LVW6tT~OnRy9NVfVtpJ~+>$%L_kiyd{CzLRKZ41hXmbqH-PfjWE6h)c*=jMuA*wTtUfIMX zzf~zqAnY&ReY+VWB9)#lLE0^u)#(R5eCC=EpR&X4&ri}o#ptyukUZ(A|6ZR@7(8-L7Ao_P$ z%|ICXv09Oj$?nR&TPi>mGt&eaRMcWLE*-Zc%(oKw_k?HY{B(6cDFU_~hK zK|;dN)PA6eJf6)EWtMs_zcDhGuUK=ZcQS}(m_Pc)k_yL#N z%n~>?-hCsWfq~*>IXt?T8pBG~GsuIT#YaNfJHIzL4`MzktEqgGYKs_ighZcFKUNY8 zbh%QEtsW&MZo`}gZ9S<|}*ETvWp zF>T{iN~13y_bU%zd`q(=$$q=665hVLD)r`yTM${vBy6Y}?Xs)t1*SC= z+Z|+g?fm=#mBYJAwSrL+v^Ai4XM(1Fy3^vgi(B)t<(yXsjRBpGxbst!u2#AFIrPvM zK-Lc@$l`(U^_?{=)`3C7+2Nu7fwFZA+D@}2ztkHnthvCBjVqT!5e4Y^J!4D~o-v0* zY7VDQ*QcNH)J=)%%Li{c*n32a>A?6=Eq9irHq1L8E4k%!-w?GXft&~#Ufy^yBNRYl z%Y%oe>@dsR-~Z1+HC_#0?DlCbOd z6Kl%r_OgZ3(x$fWS#RQM$n7TDd%9xbdT>Dcpq4Ob>=%WP=`Ll*Q)SU9A9%-;KcT@Z2kGq_(M?z(#&dP&`6Elge)$)_>pxJw{=bmVe`1I= z`S})w{Sk=*%&+PBi+y;9J$O$CdCw;xsQnj-5~W&1`r=ZT_tXsuu)TYRG}Ozp^^u(y zXf($OSXCZGb6d?dkcjwr$?&J>lJ++vh0z@cx#ffeso2=(u0e@aB9Szt8I~Jjwz^`U zVi#g76eO-&>167v#G#8)@5u(0S&=eC;a z9Ob26NS0|%9!aIvtGd2{_o5OpKAA8unF6A*+EY7TbB{qGsVWkMb|6#ITzpS3(|y>% zdi*w-at9hQPNj}m8OSrgpx`1QA;A^Om0kgGT!@V@4Gq`+fZ|BsB8qnAdwpAzNx7xZyx(RKp%U2^pY-oGIGfP72e1zE0-L{ z`hx-_?=cha2#TgvQ^nMPXtj2b*m|*6MaI-i;?CZl%u@L^?#*$a=ZXLAbR*~w)pVoU zy43M=@k5xyyv9K5fTNF$sg!$in8#sE@3I3qu1%fddwMZ7WLI!T_g&~kQ+Q1CSRl4) zbz6|Ef{YFqD%QC`o&wziU36*pc6diwoW0%x2SQKc_{ zZG=~FL0d`wFlm(P{AZ)zoRpMwpCjrQl0@mv*!xoj&zGkgZ7B(f%AVby8x7;#0r1{* zSpeYW0Gxd*S)$^iBG`$SM7ZPa#EcAia!Z8$Xt$GF1T31!LaV>`3U~IgCcBElm$}*0 zlMp`>b?#ZMn1bgWO_e{6pcgj~nY^_+VPN>n;Y^u&1R9yJf(SZm6fys~tWh$boxBd+ zyD0UWo**P5@OHw0`(U$PbC2?((4vsSyi!Qw9;pf_BZNEpspg=%F0rQyLS zmoLf@W8>o|=StV9!ZSLx46bX%5vS+h`2u`o*o}FgA1_Jq81hw z+JG}=T~BRJA15OpSh@2$qKU6v51lTi1s8V6AaVy;gZ-Z;-sa>R7yvHnBWb`aoR!Th zwc{ivYqSS|@knyC*m!sZgk)DfHruaD%Jn`GuD@h3YF9^kZ^cQce_wtGpDIzznA5Px zmlCgNNxJs_t)1mhFPBh}qyCV`$x~(PjC$T>VQFdUtn3fyD!C4it9*gn722YuZ+3W3 zJFO)pB{Q|A(q%x&eU$SJ2uiX}$k-JZ7hCic`XuImrsA>-yg)7O@&I;GALgR6+2#YYtyL?q z;E0Lv2tqE%*PQ&ASQ$vUAKwlDKv@WIt>8cUB0J=1R%l5I!z*M5;3G?i8A%VANNYvW zj9$Jx-d)UZxc@xQCD}xoFnFo9#fk22RsOsys~(qpesRH>?sFc69BL*(*ANrsT&}|mr(L+j7Fq0~|BJH;^=k-mglv8bDGUAwK9_@1<&&0=RHt+yPZwp3}e zDhnXh1_b(jd7Q%>_Si2fDA>$mGz8T-+cg;3BC*b)!Zs>Ej4a1j+vbQQ> zjWo_pfC+;TBq0_JZtv$$M-wn!CuA7@7Jd)z35YL8{H^4uL(v@Pe?7cZZ#kZSaBfde zPe0b5j-sT5-B(-2G$ef&0drsQK{o*JTuDaHlvd%JlAoU+qftdQo<*R0XMDaC*TUXk zo|sVPp?ObUm!-%upgK=}tVgaB>68mCM_cMc32E9VUL^9nkKy&WyUQaPU~ z*Br+8U=7A!_R4;}ArUb-@BqMWL~MHQ>m-rJ$G5k) zMj9Wv8cc(vntsDfT1;^%OHWQ?O|VIij4?_C(tj62FDRLKcaHGqMHJGLtd~XeAze1e zbJsThC8fB>L0L(pAHpSuysD(>V3yc%;u;}@ zdejdFzHYd(_IIuiT#_3Ji9>LxM3RR;y1Bx4`38JpuUnni18ZGbY6Y@;gD7k)tOOgE z7$@{$qyfnZF_G`e@&r8AsnC`ttn4*X;q{Npo@`?`wo`>az4+>s&SmuZv4#l55<-3R zF${u#94Q<=$MW=e9r@pGWVT2@z1^a#CZSLs86G|ie?InaNO}zeH_h2khp@TDTGhNaSC#QOUk4RX`1>up*_>mRs>1Sp32A`-d4<9RUTGfliix|;0SwFRziX! zRuZ>P5th%oDnD0K^+grdY+(nL~BtV-% z5%`tGtE0W0W@28WuYP3UMWUGXXW@@0gW^|cLo%^R@`g3P&QID-udU`P7l`sd%C@?q zj-s05+&(;XeFN?zPq*X5g};-oVB7NoNb0pWemqOZCnqdPVLHv^RpqfX%GpO>q`o$t zaf`LyWRzI-?G|k~N*~OOX7HBu*9$R4QK+pmL|#}-3fzxPuoRwRLPsS_Z%|7A5Llon z?UJl}PP$s!>X29b(U*=QY*Z}1*2J0pj)8$u`*oJp=<+ZERoN=63A`j_(CQ>>%yZ7a z$-nWr9l0%gP{L6oqQ0)q<$IkAwtfywy1T@rb zgjuClMzfx-9DB_rFya2OA_-Px&@gns**hsH61j1!Ab0xUw`oa$PM(&)34znZyzGa9 zqYfbR1&o{|SqbPpvJbT;l5B8`*K_CSP$Pa>6e1q3YMeq**tAe%V`DW94UO7#xwqhI zK!K+`Pw1$nDS)TT5!o)jYTRx&KfH~)E?sWIqinHvH*svG?9 zJni5`v_OO=WfgB9N#I8|c+;Ov0y-T9S1gAeT^_5P3$foMmW@9>O$_q8Im!`-Bi-kE z!7^oMG~?SjV9^?G{E;1&D5xLBqik=F!Y|WCv(ar#22j2 zUnT=c0J2wS0(S*_GF?64beb(}S&0o3yxiPZZ>8MA7pL+KFH)V3yk0qX+5-1oO>T6` zhWlR0TMJFx`roZbhOJKf!jLfsGzDYPdxWdzHa;73c?~wOOfB07cZq`P2D6`-{7|_z zwVsBVow-m9${sUlKdjP5IKSnnNV~q@r0Dqt_MVDFWZ$^Riy-bZ(&(gWe2|M=Q2Hqb-MegQ#@Svs_jgUyI_K1id!zrU^d$a`JQ zYRhZVj0iSnWMmK)@5})PMK&Hd!m0kIY2f|9N~ibx*8y@{02Zr36u_8PlqAJeCv!$j zW|aF0mh-gMfr$R%yxQw##kF3vd?fx{t8Zie{8_JCyrqYPq?K2px*B4HC^K>3bdUJF zbf(_)^P>AywdVzj%sGcY3sbiDpd|3QnmiQUs&;+mptZR=uJPgYSFPz9K$~pF9gnLw zA5N|q7k*$$%L@6ZuW$IeHnOkLiR45V$(*-o(Rk)l4G_jx;iB%BOHQK8ph$o`&dOQ*%lU4Z2{oPftD zYe_DvbsrJJ_EM=!6TOk8Xh@syskzM?MUOx2w%q*riEU7^+h~5sVp_fc0SOh=z|SwN z!7h($?U8`(O1 zQM!tgcR-FJ`rClm7#%Dcmn=Y58iW-->Alyp2mG-ma&mH6vECAFX*vMTQf+UsWpy(` z-}#(|hr$o?8J@)p=r)S_XMW>f{LAQH{HDK<*uTLppy=P} zkbjH*oeufGto}bFRQ_+!wf~lX`F~jbe>uPZpXJ;V{eFSPf7Q!gXN5}&{hL_+N>)-y KqFT(z|NjBq_pu%T diff --git a/res/images/livebox/preview_calendar.png b/res/images/livebox/preview_calendar.png deleted file mode 100644 index 15076eaf152ffbf8943a26dc7950f0984130b476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17062 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 diff --git a/res/images/livebox/preview_contact_4x2.png b/res/images/livebox/preview_contact_4x2.png deleted file mode 100644 index 4a60575a4d90f1bae6caf25e8a6854c87fc88b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17936 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 E01Bjh6#xJL diff --git a/res/images/livebox/preview_contact_4x4.png b/res/images/livebox/preview_contact_4x4.png deleted file mode 100644 index 4b07f8aa51d39b694b771a01e175ba3d014b9a16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45239 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 diff --git a/res/images/livebox/preview_dual_clock.png b/res/images/livebox/preview_dual_clock.png deleted file mode 100644 index 1d0f0881bac02d81d56102ed87513957553faa6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39495 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%0DbY?m{NVVV_ayA#fM*{|g2&zY^&~kdb~du^V)xpo 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 z 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 diff --git a/res/images/livebox/preview_gallery.png b/res/images/livebox/preview_gallery.png deleted file mode 100644 index 5d7d2c825fb8a76e8a741df3764b8094a540876c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115999 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 DD!dNV diff --git a/res/images/livebox/preview_music.png b/res/images/livebox/preview_music.png deleted file mode 100644 index e0168e84bebccfd7a017db9aa8cccd4fe84c55db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11878 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 diff --git a/res/images/livebox/preview_singel_clock.png b/res/images/livebox/preview_singel_clock.png deleted file mode 100644 index c7be20f2f5baea601997e5c695646d6c28ccab9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20769 zcmbSyWmuctvS=V!ad&rjcXxMpcXxNE6sNcsC~l=V#odd$yKCU`?X&l}_s4n8kDDjS z`>vJoHIuB&nu$?XltO^Tg#`cr2r|;*s-M@z&zBtx)aN@~tAE7j1;<@N+g;7c(%s9% z)dC=5?qq5~EaPBeWuaUEa_8f2Ns8iT?%SZYMzcUqWdsC=-i0xmpl&FtRb2 zF|)7`b8<4Wuyb&7vd|N=GPAHUF@HWe8CckPIXHP)xrqP$ApPX#YHrD^DlYkNUY{cY zQfqg2XI>^IFE1}fFE&OeS1TqK9v+^5Xt1&}d_pj|`8c|pcr!S+m;^f)3m5BuX#7vOY}}lZ zJRCftpT-wsVUb|x=3-$L6_XT|U}a@yV`Gu{53Y=(o4bjlnZsZS65=k~u{|8wx)!DHe088NP(q2XOY6#xJzsK|(msC%!R1wa?*YcxOb zTAbvr%3UZ>bRzRci^r<&h3u0k<%h!FgsBLJKy%g^i;0x*|0pVuZobYt>IavV5e_FO zN0zQ_-G5*OHGzWc^4%;a0w_-#dI z8l!@gu!&N+&H3wHG3|Z3#;WM*bV4?zXJVzW9tVNmn`@ePRtK~}hf>l3$*k}d?eds#wUd~uI@!}(D zB_$?$PUH!^k`P*rrqXy_Z$=UN9z7a8k7~7pTHGdi%3s<~YxJVuW41gf6|&tSf`ZQK zhX`NxsDyrb#;?W|auz?Ri}%VdFNyb>DUsk=6=LO*)q!Vp6snRZwW>rt!8$P~aeX{Qp zl$UM0i9}ssq(Nf)*>*M0{l52~x`rRF)W_oOl9R)a=?g&vUge=e+kNOvF_xjfEe@-ym`j;+0OUqR?(Oi1Eqa;H zVdEL&Qv0XglRHz78-ABz{<#c#E%-C@^X`8>HLr6wHr_f>r(H16(&9Ruks?~3;h3!e zL5|d}d0%@*)BU^zwZIzVBMsh~nCMW!4dqS9N8_tBp?rBHQh7SV8WNzF<@F_6pNfs$ z#=w{=b5vCaIaPFv+#314KRCEK3E2&3H>vGHW?;_qnEjx6ZG-up(;;E{p0KHDoWS?2 zr`8+6h@9v`xU7liMoxq!2>hmuYNkpJS-|O;&+;-hq{i{K@G3KR3H|rt%;)B}9c|Bw zRq#Lr0?L_>iri}%Uy2d)D_Rx)_t2MxRjBIplo~-);g?wCMVzN943)y^hx~|F9dseA zOC9uU@-?%I^VdTNVO{d`*+UJn#G;5mq`H9e#~*g-n!(LV0J@4w@duTQ0U`4;V%9X! zpdW@d1680|o^v&ku$M0pPfHYm3b`)@pc;G(Rl@Y{B_le50xkRR#Yh@z-K?h-I$rMp zJ7_8vx2yf}*zR2gY*7%b8q{#cVa(C}T6I7Dy-TXaCj_~y=BZ@DH+ctGsV@W@%rIOy zno3^}EQkh7(Ft|UQK_?oAwB@^>X;q`L7fg5#u}rJ3g}K8b+}2OzM!vW8!X|BH;8~#^^$4(c)>jfQtkH0!w@iBF&~@jLs>2KP5=*w1z1_RbVd#N1vyo z2L5h}1WTonGH~Lly|DMf{WdZ)JEukTOHdeymgF?y4Xu>YhT6M8?S@A=C)o~WG>S>i&ysJo() z{7H3(K^I1Y0zeBDN!@zxbE-{33}K1mf835ER-tBp7<^BLq-C*b6M&l@DY zU7L11gNLE<3NGGnkbX*AwAC%SOx6{856Ad9)qQF(qv&Cf?7cp20L`wm)S+G_+~bCtxT>hyPU8Z25^JHjv(**47(2gqP`+j_MU z>p=>;NNOiu^teiN4FvoJ@TG?-^qOXs_`-e+^XcFLm1vf6oT4U)uS35`jn4Jn`Y-?W z>!f1Lf&a0e5}pN0!lDvLRQkk3#4aj;eiJA8-`t0_9FK z_mBTLoF9aC!sYXdyoqIch$)%~gXA@L0!$*-bZ!gYx)D3&)SDr(adWsz+FCkSi31)W zOEJ3$3ZR;LCOtPie!s00uMYTXkExVPx`ZMkpp3pWAx;xT>#P0+6&-@nNSsX_4W03Cw+cv#dh%0M$Mj~P>!`tfYfkwf^iixK8RBumt=yHt zX)|~4mF4vFwa@0K7uQ?!?yS+8=jXp!=zs-@A%)BqZ-D6Wk@zWsZ!h$tzm*>M9oJ+? zwiXQ`Uiclng8m8U@63jOx!_z8HPwGw-_ki_l>Rv>KkGRcc~F(($xyXyQpQNIk9N@% zBnv^^{=>5|kXm5Uzciq(Vv1HDlDZO!vt^AaxH@opJt9a5j6@&cGy0-UxZm8;AFA3X z5@FUVLfDB#w5dh%Lw1=Val!j$fe6|1U4=&Viv|4;M?V!MR%8kQJw<_En%=vASgve( zZn<_zye4VvE&)dxYZhRtT?i=kLem<%@igOC>R`MRa{=~}Yx zrJ*xL_6)Qcc!gzUI_^)sqQR{xEJ)5P`zvm$E!nTC_4sziI0^x1%j5DQ zU()}yLvBuW-7$J9pu3-4?tE@2X7okX<8sR7Nno|_!kwV$Aq!cds4<#LXfUfv3zHpJ znmlk4>>P>b*rkyq)?ti`R8u;v_UVuXx%l$#YYNDGEWM=A)3f8?CPlNaErn{(OeV|#z)$1D&@10xsn7)r*)!TIq zmq_0~=$>{@aE}gUjfs!T0S}hoIYk8%k{GEMSLuL@ynhAZ=g0A&$Ij1LKa$FNc8bmb z6$>M?W6ZOD6fI2CH8gXH^T#NbhdLp4%HkFl8V#E!E3dUaZ zU9_3KSP9-{y?+PF57{~|;Ygr;fEaX5U@ zbtFLVJ_R>7O zA;^(h9*2^a2_I%4TA$)e^l`AcK|h3xkKcjc^TOo(L&hSCl#Gn58!4)Pea4#o$m23D z5l^7g(i%Q@$cb8y~;IiKkI1!73Buc{kr z0{%P$U+(X7)n6W^YX&dEau)_S!X+9Oar7s(Z9kUNZ&GoPOddi#EXJNp+&oWa%0D2J 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�xPp?(ZP4l`0HLaI1q-fb$&_bVcwoiPhr zuKgRdGPA}2EDItdO0E9w9zL~Rk;Z2Hz}_lMhFcfrRD9^Ih=Y^#Fj(m`sLPMZ3|%Cg z*g_LCDod3BP<3=A(a;q?5)=Ma`;^OdTm9>ywEsK;22@E&qSLP^98f}V$NppeDu17O Pg;J1FmHsAa7V>`p{5Y7{ diff --git a/res/images/core_page_indicator_on.png b/res/images/page_indicator_current.png similarity index 100% rename from res/images/core_page_indicator_on.png rename to res/images/page_indicator_current.png diff --git a/res/images/core_page_indicator_on_horizontal.png b/res/images/page_indicator_unit.png similarity index 100% rename from res/images/core_page_indicator_on_horizontal.png rename to res/images/page_indicator_unit.png diff --git a/res/images/preview_bg_1x1.png b/res/images/preview_bg_1x1.png deleted file mode 100644 index 76cdafa7cd5adfa81f56aab28baf17a9ac4b5d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmah|&ui2`6dq_Rr9ZAhJxx;(g>JIRZqjaOEZb!3E|^lbTe`iOCev>n;tKe!#GBaq?2 zaH(jN>A1|k{!8?~IJozU4kM&cB@1|!#8!wv-oYyfmON_>m67Fa-Ti>30O;Y|N|jX2 zTdIvc-eMR&@dC;QU}`!EEPEXhxPsPPU*k^SH8|)x8n+~yX*1AK%`I++XkmMqO&dq~|GkK}Xh)TE|2WOh~Li5cxDq zsSPyEe?vX5gN{fUUBvrW;i$3|Afb#RTn}wpxYaS{Dp2(hSpQNk zeL;cOmR#S#adf?jH%+zVN5t}NR5CPM|9~^^(~)uS_-fN--`UYy&;vdn^d8EM;vIH}ONBY(<;?A!UtOD2ga7~l diff --git a/res/images/preview_bg_2x1.png b/res/images/preview_bg_2x1.png deleted file mode 100644 index 817f5ee8016a3f14390f9a57d0ccab5a591d2b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmaKr&ui2`6vrbLsik|_Q!5IyX$1xIbANS1*RoAgvtVl3u5=5c%_h@sXp@P_v`KrC zA`3ma`Zx6ArRc$fc(6(@_SlQy&4YLmym%AD$^NQJ*O27RJl^;7-pst&TbRF<7`Ze; zQB*e$pgn9IG|Fh*oiE_>d}Ds18BdG1g!O8rJs14{(~I&eL|a zhHLt5$wUro#4&8-ctlN6(=(B0nClROI$X2eBK`f%TN>C_kzUH`yza@cVQV`+T-=$j znmg-e!J=nwg6T*i00&|NM9zjANKuh)b0sp4-5d?tA$Yw=cZ#a%3qVFb1X(uCn7kl> zT#gko*<4Pz0YqL9Ii9>ZM#xCnoFwK!_n}EP-&&O_%3L=WnHA{<#-7A+VHmPunnnH^ zClm^Wm?4S`iC}_l7aI}d1`|Dk0t3^xJ!~Tv#6+WxHgS zMnMC4Kwiv&YfH9kp)k1Kj@Nam>;~9yO;}cnG$F9IZArY6;bmDC)qGYI1T{TXN-J|} zDL<8-N~^OU`_q5ijHa$=qw}Ru5%nJ1FEoja8$N}voOZMPe_<_8x)*4)k zFi^{pVz~HV|2XKLi*!#s?6)nM^cx?#q}zSc)`!}wV{#=vmX%U9`tSO5S3 diff --git a/res/images/preview_bg_2x2.png b/res/images/preview_bg_2x2.png deleted file mode 100644 index d34f366faf3de0d00664b299d863c7ba69d621de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcmcIkO=#3W7>%|_TU=`xmhn=|wrem21co174_SXGKjup14E0Zx@=2_5$;5CIkG*vMdfQCW{vRpc8rvw2= z5+`J`k|bOPVoDJC6uG6Okdd>JEKY&e#gc5Hvm%%DxmGSRQ`j2Dfz0#udY!AMITWt) zLN1r18lspah-9?sV=GSj(O6qShmjq+0d|oOsG?Ox8(3k9)58+Hpd;%?t!*M3#>ZB` z3tWnp)CQX7zoDMjK}Wa*yMF&F9F;c%$d_P*HbR>m+{zeD706l$EsVl4LhJ2aT&N+8 zq8bW-wkUzgCD(UQJ-XDyo2FdwBW(FLEa(bL6gby)WJ8}4G%=GlrZSo!80jmbA?kvv ziL*vZN@wTVTpigP9`tdW>vXx9o?O}rUO+PIFm!K0XD&n@XqGIyy}bxM^;%q~w->P| zmnUX;day?hy1hiYhYmY!OD3Jhhd$}{khJyu9erg|CESBTJuS3M~nQWPW(9CMg4p@@s_#!o=<%F R@aP`>+Z2qV{&e<6;}1^dMJH-Z3#4uO@i&qS4o}j*YOH9c|jz_ulvO{d_;)@B21=wlH^NXmE58 z05DXTQHlWcB!g$5pYD8mczBP#E|6TAEaDYX)m#KJ23|(6U}>wUh%{qs<0F~?ppP+2 zWl~mWWgT0r7GPN4a;P@|6O+E9>1&9lZ_#xyFiIRPyy$bd_c*gg7$CRjXCD8e_4$ z$_c4dD&P>sC`ClQEt_b5)b_?g1_gP#YdXZlHVhcGWxPq!3{`rRg5@-5ZLeM?S}@Mn z98O^QAf*tfs-2;h)j)fsh>rE1O6--k9K;oohc{iF9^A@U5XzCWF472gOBk<*Ra~fG zg1riMV0KZ0mzPZ2z*X-`4X>(l!S;w|>!_fl8Op$#rXeR4K9!&5g`6nH1R)no<+E8@ zDt?-eCnY`=4}BG^Z(7JEp|5f5E4K9wTETK?WCgkAePrZaY{6Q}ve`~cCZBK1SNApA zYvJ4aa#Rc#9Bk7;hg-CJf@z~|>7vp2$fn)y(zbs0^TAX4weSTcQ}Xw}?>`>~a9}F4 z@#_z#zrA_!%dOF`L*p-Ap4(GC4}wR1Bgt^sHDW)XMEpCu2VlMwZr03^;i&`AJRCcn zW^X3_x4kpJ!7?J|{CY8vT8s;%}Dp}UlJf;uwX xO;!FUX*=^q?CjOv+YabG1CNHCy`EVoavr>4``t^wzx@dQCxzUc@_PF2Z zZ{SAtrfMOVHDe4Lxjtc2)ZBdJo7Nh{^eSvSUV-`k>NP_b53gGhA zV%^$Wv+_1Gf1RF-R3hL)Y|@dt?uBYpU=m%G%;Rm2p%VyRD=3+$F!)60EZWL01~82c*6b-P`*E3znP zb0DA3#~Ol=A&5-4>0vX^JM!@#)*?Q(!zI?1o<46!fDqHf5BC@DrZiQCXinxx2}1acx@Bysn+ z_E~bq5ofr#IgT~UV2gBMJUwiEvN*gv&?7e{AXj7e%gYS8r(Y|2u^zqu_ICdQ#a}$X zAN_v*X?CJCmUbS@?mfD){p|5Us+?|Osz3bjF+2L==M%Eq#@h#}iK(NZiOcDUrzi1E z0-BskPL3f7C!xnD1Lb6v(07OK9&_R>qNnoqZ=X&@Cu#V9!G4S|_3KjSWO43vQX|yP V%=SBf-->_ARK-}-_e#zCe*lXozbpU% diff --git a/res/images/preview_bg_4x3.png b/res/images/preview_bg_4x3.png deleted file mode 100644 index 219dc42e0f5f90f8cf2c0ae00bcbd6c35e2862aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmd5+L2J}N6iyZGQml9pR1n7$QNi70l5WzCyVh*7(FM1b?SgwWO{U$@CKHpXoA#hm zPvQ^gLGj?hgQy7NK|NSJ2qJ>L_9UK#_9r-LH=Rn0hWX1`><_kHiZd9(M%$1V*H z92?*`Zm@pYY;s(mM)6v1KV2t39wGGSD5zlt{DDu0|d` z6noah&YX_|Qa39+-6^=9t0}4_Ns_6mVzpG0AuO4SXbj7SShQqOk(5kh*I2z|SgL5& z)FOniCXc9a#1f$l#hPSRbv28v2Qje&2W7rq>bn_h{5DoIB4iUBwJ@H|CSbgS3648B z1jd8{&Rp{X7kA^c>G5n;QI%;1Y2CUtQq`-vrIciI z*ivP_7wi5_&jgx`kPgSTVaZ<62~6SE=+lR-%Yy=XVts$0 pF{g)1U&_yN;mR*_vi|DSGWY2FzHj$mtiMkG;p??A^F{Ug;!hoq%rgK0 diff --git a/res/images/preview_bg_4x4.png b/res/images/preview_bg_4x4.png deleted file mode 100644 index 59a8bce7d7dd459286d2e668561ff20818a2f548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmd5-&ui0A9M2ezG1!>kK?N~n2#RZymo#Y`)@^B$ZiRIlU13E$m?f`mSd$l%x3%5H zAwv*F1TTUh%$puW51u^i>>uD|2ibARK>q|^+GXo-j4~Ar$;-=opYP}M{q@M>#rc`x zp{qj_MGfa?wIW6J$>B3NKvo`QU*9FKD_Ae%B~-x;!-te&p%qBy9is}1(6CzfzrYEK z>aWBEa5YQ9yGi(2kbi+p968pfW?vW-R~ z-Vox*ud*PWPKO*kA0voZ&~mZSjJd&B#Gt{z^lcB@$fZL@V+F0@3`0Eagy49E!V$3> z943mSjBOeo3*sE>IAL6EbbyQS*o{-sL8;|Iwg>~X=9{D*m9fZ}J8{dlWG%_55&%jnk(G1-fRvg_XdDnyg370Wu0{kkvUpB`S$*LQ*tdOhvYNH^7E#!bsN+bvw4;Oj}v?p@ETKLZ}{fz+w$y6x5JM zt4k7nbJ=z+)Cg{c<>^GLLEm17R?bHb-OjIUpQ0~_K;tDfnaJtMcHFv_RTGj3vLGdJ z3W>X8Yn>-&EOCYno1?2)q9xLS;q<8W$;Z**fi5{QJ~5pBR}zlQJLEA?;ehU z$FuJJ2;NN@Ax|<9WKW<`IkNAD_oUeqh_L_W*ng~f?qvKyoc~<&Zx*1}IJf&RkH2b_ jFYdiL(cpX4naw`x!}Edl@7E^ZhQFq~KCivc-h229b$<=? diff --git a/res/images/reposition_bg.png b/res/images/reposition_bg.png deleted file mode 100644 index 798a2b1fbe86ced0c27fea0a962670feecaa6b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg~Wbv;}jq0rQb2UY#YDVm89A8wI~kx-vUOncU{w%S-9(HjQo$_LCYeJ?(&)61~hBVI1bH*=?r731sMBJw=* q?#a#YZ?x>@x{=Z;x8{G_4kqOp3F~wWWG?}I%i!ti=d#Wzp$Py8N`qDa diff --git a/res/images/reposition_bg_shadow.png b/res/images/reposition_bg_shadow.png deleted file mode 100644 index 526a90dbafcc05f0dab664e70b17f690c9b850fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8659 zcmeHNX;_ojw*C?kvC5!0U_l5Njjf^-j|K%H3W`yPo=(_SKx+^!lN2i=1VT{;6-08X zqCu*)dL2;_5CVw`3E0<06~yBb(PPj5HyMaf18*^^*g+yA|gT} zcR=3XhiuvrLMOy-+p(44OZ8tDkZds(f(Q`RXW8ewo^(EqV1<0KDYYfk#)tCbI-egm znh?|HSGw+_-d%r7lBBYfTX#FocaYoP^ReDM{?I9c$@q*)n}v(db|>ea7r5N?)?DYGZy#6Qohv09eibqn)OczcSVyTsfp~1vz#{p4i&#3gO6@Mlc2efs9rl_b`I}M=?undBUxIq z`|O2nN%ip$%@HedZEV@G=Q1yEHXBX-bJ1pn+u~`!o12G6Ny?)NIjh<1@Dvc{#tS%C z5lB7{jpKN2d7-wvdLnY(1gcV1A+FS~X4S5X*|0zunl#V3o`qWe0n;eE94 zG;p!gS@1qcP|cJ0dZg}(`9`W91FB* z9kP)^c(e!x>d`it7Xv|y6=@-ynBwV3-WN?YJ&ta)d5CPZGA%+9w`W-dVki0Y8Q{F_ zvgVppmK1g{-P+dJ!_&oZzL+lmqmL7I-$JLr4xT|fd}AeiVrx2UCO00oMqxjMeX>G4 z*mG+)nwZm1V2D8C>DnWiFepI+5z99hiRfmqflV9H$gVUa8*l$?d~i0J;ES;;hn)y& zZPHm!Myv#S;O(DR0{@@M)^;KZwV6XZoOmG!a{w#N1Q0j@fm=GO7s->Iw(|lSFbz9* zGRZr52K-pqUBQE7xVToPSW4T`otTFQ7%B{|z(FJw6e@)Am1vExy(>UCv*8k%*KLHO zE>@%>gesNP2smH>4lKLau}GoQk~FA;qDn4$T1=JTKXt1>%s1K5uFqqm2I0nZxq{S^ z@-+$~Y3dg!IM^6CNGLdpr;$jG!vv_uI9AFqJMGze64*yUkXKK!37>~05e4@|iLu#Ud*px-F?Nb1 z5;(luH&H?iiEoGmtnZe2NrnO^6UEIt0)2h7z_4b+YiqVGegk?EG}^cSeXy`#Gx z?F2`HO7`ESMsq4_*sk^-YRsXX;iA;o$2w<3jXlXIg@-l`z>WPz+$a`FPX7&VC}mzv z|AZS`*mKn*aHB&u9}~V-BW@gvc9o#q*uow^Z6t2krRiphe3<_?ZajNdap;cD3>hp$ zm2au4G2qbogvT%jcBzg7us0({#Uzhj@x$IozFgeuR=F ze~!xWr8~L@h^My!=n(!^W|-?6-SB#aHM;N6uI3hf4I8xI)gTeQ>XY#Vn9yS#+?sR; z?cnW|0@<(~T(3M>gNw1(p4Ce-tQPO<-~*2%IZjb7BD3jO=hh1rIv5$xU_%7!WTqrFI1=`%O1VK{*hOm=J z)(u8#gg<5&>e{Dk)1Jcp&B_#v$U`mB$eqohERXxPCocJ;_$AhSZ~H(;s>G} z+w~nCnQKvkgtGnAe}y1A8PCs{AnzG*hY;jVnr_oyBnYCmL-}!4Og}dQKTf6T{EaSv z1N?BOrIw-m$YPxwkss|cuOEy;#HKi)-^f6uH~G#R;M;Sqeg?rNrC~3CK!cH%{WzWV z5i-{^;VDGgj0zp1+}On~`8s;LcGzD^pTtAyXDFPnS+2k5Fe|PhX8QqiJbilTsDzq4??VhlLufw3<>w=;zGXQD z9EY{wvz~DGB^J}1<8^1Zf#=}mQ`I0R(J{titqG3l`69xG3C z27IJ)d&Q{`p6WgwTUJDb3D;1yL_xrY0&$cTp>cfrz53Fz11^qM_OFc8HD2v2v&)7W zw(Qu@BUXM>wipc&gmAx8vpUCXt$b!(0CW4Btqq)W154%|@h|xkT-$$`NWh=cE>@;^ zO!D}A!0=|N=KCC;pZxAF^2HQzaF}oP$x|WZ7XNSco;AegGJ?w-moJ)NddVE`bG_-M zSefEE#0E%Bo@CrNW+{(BZh|Ow@|Y9P`-J_n2iM>lz={6yiSjN{=qDF_8(PEaUji~D zU#5thf>jBGkl-jN$w_GLokXyk|MgDmrIYj#cxtjLqyYsh_-z}e;+zN;QEewf2AorR z&Yz_|zI@MIM*nDj@hNe~JYDVra;6?2p+aY6#ZgHkHOQu8pkkem~9K=OM5kR|57X9|HA7?_yt#`dx=7Sc~jNp-}jPX7fyJEKNxinq$b83DMhnX zP1I#eKFc~1%WcNfwagnA`$d)}Xm&PuYdXR@;yne*9FO)ghRhRpt>T57J0)S)Mm@eV z6&1o5s`eAXf|Q`+j)@Et{?1>XPx4Z>BoCzOlKtM=nd-!xv!wVupak@0=8X*))(sDxd!>-EG_OivP4 z1MpN&;aJ30EMs1Da1OQqK+oEIhIePYlfZUNR`xcL5A%S7)sd^+2GQDnFSMp=X9_ld z!->SxD_-2tzK*vXJqX&9%B3eH_pNeVVoujc|EsxC61eAH=>5)cx_*KbRx5rPtWHi4#QW@i5 znBcHZ&8i#+QfbuQ_Kzs7MM{J0HvYyP!|DsjvAmxcXu?mJC(pAqOs-n_G+)AFZOBvi zj?IocC9dLm8P=vz!nG7matzqQ0ifbq83h@!Tgad$F1l58<9RRmV^DR~CD9%K0Z0I~ zPU~`7o|+Jdr`yMq^9Bfz&miYL*M%0hlPIm3mPQK!tUjq<-7@BZ0=0LWVSL@4oKMRw zj%YpLKULM2z8sXT4$d9!9BP+flkm!m*>(QR0};|QSkHmsEw$_Nmv`d|?t=mbCEPH2 zFtJLQ`R2pX{G%(?cT5dA*4h*soRgom3unSV`ub|jpLziRA;e}dH08>(XLR)IbtpD!7k{kr4njzM-Prazb`NO^8n+Sxvt zAZ{><&RxdMpQT=v6T7zm81M!sGBWxgF=v1O&WkCL*5EmgVQ}t$aPyyE;Z1LEs-wK+ z3%~9D!C7%_ljg4jOUCKqYqSdlGkmkM=iuoU?ncGgTl+dP$CuT2MSa_Zze^FhWPqWb zn$?=b|46P9qe_BOplP)==4}QP4QNtIsfnKmc#De7;K;WtGM4KfEhv}f5gj=D%}RU1 zrogecz?HQ{JE!|CZqge08fvp!>rR~Oi3(e6-l%&3D(n6`w}jNh`>Dg--iSTKI z(+%jG%M=y45^HME(ueJnhL*^7tI(DTly^*8{hXnQAlGy2SRQ$jpYA2%VK0r0;*=GK zCAs%jrh}9<8xiMcP0$*7c#d>j_75FRhDb3lmp&rqmu=kxXOi*nfx$`9Kvr=BSRO|t z@ofx1I1l&WhXw%izaq_NdE`qtZE6C}bqiBsoak!RTkOtMrkT}zy%F@4$d`_*(8Qz z9f5x1!e7OppayVYeb22er|4R zUI~M9QEFmIYKlU6W=V#EyQgnJcq5-UP*Jp}i(`n!`MHx$b2b|rQi*m ztGjG_*j<|zq|Ci6ckjTz1Wpw{*y{HorSDqTf6)D!+cQZxKw`O17V|X6 rM1K~~17augA1-{H{kL?-iENp<*VNS?{TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVFffGH?<^D zp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRf0Gw!Z$#{Ilm}X!Bo#!H`&0@P{GVh&(Orw z%*;?n!N|bSNZ$a6%ybP+tW3?UjLa3FKnZADQA(Oskc%7CE+EfVDWjyMz)D}gyu4hm z+*mKaC|%#s($W%ShLMpjP=#)BWnM{Qg>GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smX zK$k+ikXryZHm?{OOuzusuShJ=H`Fr#c?qV_*B8Ii++4Wo;*y|LgnO|XTpUtakg6Y) zTAW{6lnjixG-Z%g1y;^Qsfi`|MIrh5Ij~R+$jC3rFV4s>P;d@5Q_u*{%uC5HFV+OB z_w}{%%quQQ%u7!7bg@+enxL1NnPO#b;9~4#Wb9^Y zVPFo^>yn>bnwy$e0@IrU*K1;cQ!gkfH{644~kf%h=vIPQxAvx|<&#)|R5|5a-NTbSU(vw@I zvC@fJOZ#H4uUxfC?!cP^HqL)^Z*WS_wmEN}Icr^j^mE5$I;XEM(%80QyPCUGd+D@P z?Z-|Z6y$E0oR#{@eVpr umq(@9$?+zQ3l(_7Be|wKg*R(&GvJ)R$JeejUTj6cB zXy5yjvKm#BgT7fU+LkL?yV&DU`}vRCPuH{TpRBxp!R6A}_YV&Lo0Rt{)4%Ue&byP{ wA8gKV(>X2E_VC2S8;wnq#XsKP{$2S1gE#ZEg%;dJEua#^)78&qol`;+08Eyjx&QzG diff --git a/res/images/unknown.png b/res/images/unknown.png deleted file mode 100644 index 535db6063ad8e69e355c808507480f46ab0ea5bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19568 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

e zdU+&=%5!{oa_e^#X;((w)=!s&Ty|7Tj6qxd#1rYJb{LpK9dJov+O}> zB;XwGFe4_ePkl;BxOK9s>d_RWd)`SnFf7N;eup2&>io!ID7fpV$LcBZo`1t6ddZl#cmShuf%(G zmR|Ys{+UeUc$NS$%2P$YXs)E6@a*R8^oK}hp8}A zU>_RUQ`$yPYFV{Tv@R^qfYVUWCE9oWvzdxhQPUy@&`+>&ANiwz77YpnI9~pds`4nN z$S!b(qDAg#&Nq|yAQ=(dAje5~xSfY;f;-BZOWKsU(LmP(W+L`l)3fFO&^#HCijRd4 z9cQzPRF1yYz>UA`_vc8{HDw~psC_EgmK)!5R(IDvFi~5-K8Rby0V4!9qZ)5Ho`f8_ zWoTIu(4)ip@;sQ}ui}j_a0vQ5FvSsZ2LaN}562_9sxCW+y2ODp3#(!@JOAvKS-NYmBQ5zd$UwQh5N46CO{+CA2V z@*fs&#(GKwZ#T8t5PiS`uMKlKAsDH+vVVY5`da@10B6X^$eYQU20g%=4{^W?1H=;( z6H+C!=y*ZsbJ2^r%_?O^#pxm*Lk<=Fe`q2OW+O#yjThKp|MK%%b!d488qFlBx>@g; z?u2^qXQQz+RqHmz*)7%WF@70)D$>F!f#xwe0WI0%aO;?z-k=i~VRuHq5ouj(EOKO0 znv0uUPhmYs?#>@85IK1$*novT6qaEtpdoJ_&J=pQ-YqZ##mSQGm|>QjLSgQ=8Q)LH z*&E7YK~n(xgbELd*w;#ur4Ka%>Z)^{Q9HY87w?yKV+`J|t!}q$>hRbM&|k)Sfq?ci z%h*Q~k4r}Sx!c)l(r2Om?lUu?$&k7>=c_Hs>vQqgK$tv_`{M)N${tlk{=F0k zDk>^nJ(*ftn%+=7wk{0pV3$u9owN8*Fsa{vFe_`{ZcI9pPF)iw1g~`B-d?tWIf%=V zk1X293B$ZQUH;F;8wlbF3YP8P1Vrhcdzg{w;m#Hp!24C5@$Y+hd2{S^U~Qy0Yi%va zcLIC2ALw*E>pU=}Szg56e@S`(B#Is@Q6YShkRTm_HT!2|cx@ASDU4u}D74exrb=NB zj4ZkEqYp645{@jTZ8PjsU)`gsuGag#K3$B?hm?38s-rTlR0GV+vthB-`j_f<$|+}0 z>d~S0CrC(YmBe9z`+Sr(1`$FoyA=)U0wx)`2>5#qD3C``XFIjW?_wWA& zy9q@0;x1_-qfpuZDhI4Z^};6tPju6N_ahh?!Hwt;nDifnkvikqMn?{OsO);Dm;ODf ze)^shP=w8L=C~Z&18{4pRB{V`7Y*xm4QTq>(}p<_3>1N%7!W`po)t+f$Q;$F1qO5 zxm@mFW3iYEn#5(UloB!+5=F6C3_P8P9v>e^UCcu1seeM`@~fS3ATalB2NAm7 zh_OgXD3wY#^HM*#d7`*%*rG*?+&E=x zB94Q{dr+|{X8hHSuyRz;nOvtbL5C8TJ2gjdQfJTE1SJ!I4G;#rDU!j3Lt8QU@Z+d! zY(UxR`l$*HPSsyQHDIcMzi5LOi$z4EQ4Ig|HZ;6*6Y_hzYg*!*4G`m~+G&IEmFc>~ zydmdk2RTT_)tE_-)mTb*;*Idf+t|I%Y!63Tk%t1PxcKgq((nY+UQ@)m$+f!AjB>r|^ zUmy6A-=g$V0VJN%%Drk1FnULKclS0~cTSZissu`2B@Jh@b$54vdey2`8m06T!C

UQtDSRL*rC^5bn>)9Ez&`}>vYAX9B#g!B@_UTt&4 z&s^lITBeJWmp?)efCH!6@PSwR!UW`{IHsxaE={8jlUaz`QFV2xCkXPVB)Sq03I=1M0 zy1To7E8p9fzVxMOeZ-Rp{`t>;{teZEdWkJf)39aBmb(qZ_%u(flGj%g2VVppGUT5w z({CzW?^XII1DxqNc)HY6S){APu{fzzYqnP^6|O@sU%PhgW_ePa4eGt)jytC3RIfVJ zsb)N%h3nR>yYZQ4o+;*Xxxe8ZvBkD zzOp)jPiAN3#UBH>XTydKuc=nII@@k*lZdKHy!O&LUKbD%;rjLKzxd2E&!keR)Zd1~ zVb{|nSIwygPPMWVC%UT5o@`@!5#5X9rB>z2rB-H`k%*bQ+aP>pW5b3G-+Ah(ryk2@vp1AV zr5pHqZmI>}y;Oio_j$QDRmZ&Ar%z?}h)p-W7SR)raYFihK6k}L2i@Lq`Q?}2EB3`u zJ*R5?y;{SbwN5=-;!gD)Rr;sHwR<&9`^3{vKmE%1`1ntP!C-X-Ldgy0g;r$%r7HjP z>geL-k@7NcywX`!CHrDAGw0A!sl-!VzX#ytD2Y5R=IlV+)PD`cdRm*6}y%<&cOXN~{X>R_EJfvvb z_QMV_pB0g~495L0QV{xQToTSH#e!hQYv^=Vz#zxw2pPkuL-%Y7o3%Y7#p3|1ZV zfxx8IHe{|-6+?UJT{#%8N<5#+qb4GDe*e7x6Q%Ti0QX#e`Q>{=VtScL(~aqW38zk_ ztIo#xEQ`4f8#ZJKA$L6W)KlLtl}hg}l}gv^x_)^e5O7QXL|?9IsSgo^OxNQ{4qB@k zXR1_)SWx9;BYYXa0~@(G zn>TkB3WX0A3WY0mT|dw7_q%qk3|3TKs;6_F$hlRrPnvH$Q^Ltc0DyY|JOtpm_3PI& zaRELrr^FxY?)$%jsMFa{UO@s?7qxZk*7X7SuCD9f-Mo489LusUFBA&z0`LyL5WJYw z=HwKkN; مدير التطبيقات‬." + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" +msgstr "تم الوصول إلى الحد الأقصى لعدد التطبيقات في المجلد (%d)." + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "تغيير شبكة التطبيقات" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "تغيير شبكة التطبيقات" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "عرض كل الصفحات" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "المصمم" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "تم بلوغ الحد الأقصى لعدد التطبيقات المفضلة (%d)." + diff --git a/res/po/az.po b/res/po/az.po index 38405e8..c0e6339 100755 --- a/res/po/az.po +++ b/res/po/az.po @@ -385,6 +385,15 @@ msgstr "Bütün səhifələr" msgid "IDS_JAVA_POP_BLANK" msgstr "Boş" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Elementi əlifba sırası ilə ayır" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Elementl əlifba sırs ayır" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Proqram nişanları və qovluqlar əlifba sırası ilə çeşidlənəcək. Etdiyiniz bütün fərdiləşdirmələr silinəcək." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box əlavə et" @@ -451,3 +460,18 @@ msgstr "%s və onunla bağlı bütün xüsusiyyətlər qeyri-aktiv ediləcək. O msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Qovluqdakı proqramların sayı maksimuma (%d) çatdı." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Proqram şəbəkəsini dəyiş" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Proqram şəbəkəsini dəyiş" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Bütün səhifələrə bax" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Üslubçu" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Sevimli proqramların sayı maksimuma (%d) çatıb." + diff --git a/res/po/bg.po b/res/po/bg.po index 826d592..ac8fca5 100755 --- a/res/po/bg.po +++ b/res/po/bg.po @@ -5,7 +5,7 @@ msgid "IDS_CAM_SK_OK" msgstr "OK" msgid "IDS_COM_BODY_CREATE_FOLDER" -msgstr "Създай папка" +msgstr "Създаване на папка" msgid "IDS_COM_POP_SHOW_A" msgstr "Покажи" @@ -287,7 +287,7 @@ msgid "IDS_ST_BODY_FONTSTYLE_ROSEMARY" msgstr "Rosemary" msgid "IDS_COM_BODY_CONTACTS" -msgstr "Органайзер" +msgstr "Телефонен указател" msgid "IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED" msgstr "Достигнат максимален брой знаци." @@ -385,6 +385,15 @@ msgstr "Всички страници" msgid "IDS_JAVA_POP_BLANK" msgstr "Празно" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортиране елементи азбучно" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортиране елементи азбучно" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Папките и иконите на приложения ще се сортират по азбучен ред. Всякакви персонализации, които сте направили, ще бъдат отхвърлени." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Добавяне на Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s и всички функции, свързани с него, ще б msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Максималният брой приложения в папка (%d) е достигнат." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Промяна на мрежата на приложения" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Промяна на мрежата на прил." + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Прегл. вс. стр." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Стилизатор" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Максималният брой любими приложения (%d) е достигнат." + diff --git a/res/po/ca.po b/res/po/ca.po index 4fc39df..e766c8e 100755 --- a/res/po/ca.po +++ b/res/po/ca.po @@ -1,5 +1,5 @@ msgid "IDS_CAM_SK_CANCEL" -msgstr "Cancel" +msgstr "Cancel·lar" msgid "IDS_CAM_SK_OK" msgstr "Acceptar" @@ -296,7 +296,7 @@ msgid "IDS_COM_SK_OK" msgstr "Acceptar" msgid "IDS_COM_SK_CANCEL" -msgstr "Cancel" +msgstr "Cancel·lar" msgid "IDS_COM_SK_DONE" msgstr "Fet" @@ -385,6 +385,15 @@ msgstr "Totes les pàgines" msgid "IDS_JAVA_POP_BLANK" msgstr "En blanc" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar elements alfabèticament" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar elements alfabètic" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Les icones d'aplicacions i les carpetes s'ordenaran per ordre alfabètic. Es descartaran les personalitzacions que hagi fet." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Afegir Dynamic Box" @@ -451,3 +460,18 @@ msgstr "Es deshabilitarà %s i totes les funcions relacionades. Per tornar-ho a msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "S'ha assolit el nombre màxim d'aplicacions a la carpeta (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Canviar graella aplicació" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Canviar graella aplicació" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Veure totes pàg" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Decorador" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "S'ha assolit el nombre màxim d'aplicacions preferides (%d)." + diff --git a/res/po/cs.po b/res/po/cs.po index 8d17e6d..d963ac5 100755 --- a/res/po/cs.po +++ b/res/po/cs.po @@ -23,7 +23,7 @@ msgid "IDS_MF_OPT_DELETEFOLDER" msgstr "Odstranit složku" msgid "IDS_MF_POP_ERR_FOLDER_NAME_EMPTY" -msgstr "Zadejte název složky." +msgstr "Zadejte název složky" msgid "IDS_PB_SK_CREATE_ABB" msgstr "Vytv." @@ -58,12 +58,6 @@ msgstr "Zrušit zaškrtnutí" msgid "IDS_AT_BODY_UNINSTALL" msgstr "Odinstalovat" -msgid "IDS_AT_BUTTON_CHANGE_VIEW" -msgstr "Změnit zob." - -msgid "IDS_AT_HEADER_PD_SELECTED" -msgstr "Vybráno: %d" - msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "Vyberte přid. apl." @@ -73,12 +67,6 @@ msgstr "Vyberte skryté aplikace" msgid "IDS_AT_HEADER_SELECT_APPS_TO_SHOW_ABB" msgstr "Vyberte zobr. aplikace" -msgid "IDS_AT_OPT_ALPHABETICAL_GRID_ABB" -msgstr "Abecední tabulka" - -msgid "IDS_AT_OPT_CUSTOMISABLE_GRID_ABB" -msgstr "Vlastní tabulka" - msgid "IDS_AT_OPT_VIEW_AS" msgstr "Zobrazit jako" @@ -307,6 +295,12 @@ msgstr "Bylo dosaženo maximálního počtu znaků." msgid "IDS_COM_SK_OK" msgstr "OK" +msgid "IDS_COM_SK_CANCEL" +msgstr "Zrušit" + +msgid "IDS_COM_SK_DONE" +msgstr "Hotovo" + msgid "IDS_CAM_BODY_SHOWING_PD_ITEMS_T_TTS" msgstr "Zobrazení %d položek" @@ -343,12 +337,12 @@ msgstr "Vybrat" msgid "IDS_COM_BODY_INTERNET" msgstr "Internet" +msgid "IDS_MEMO_HEADER_PD_SELECTED_ABB2" +msgstr "Vybráno %d" + msgid "IDS_ST_SK_NEXT" msgstr "Další" -msgid "IDS_HS_OPT_MANAGE_APPLICATIONS_ABB" -msgstr "Správa aplikací" - msgid "IDS_HS_POP_PD_ITEMS_WILL_BE_HIDDEN" msgstr "%d položek bude skryto." @@ -400,3 +394,84 @@ msgstr "Seřadit položky abecedně" msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" msgstr "Ikony aplikací a složky budou upořádány v abecedním pořadí. Veškeré provedené vlastní úpravy budou zrušeny." +msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" +msgstr "Přidat Dynamic Box" + +msgid "IDS_ST_BUTTON_REMOVE_ABB2" +msgstr "Odebrat" + +msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" +msgstr "Odebrat složku" + +msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" +msgstr "Složka bude odebrána. Aplikace v této složce nebudou odinstalovány." + +msgid "IDS_HS_OPT_MANUALLY_ABB" +msgstr "Ručně" + +msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" +msgstr "Podle názvu (A-Z)" + +msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" +msgstr "%s bude odinstalována." + +msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" +msgstr "Není možné změnit uspořádání ikon seřazených podle názvu (A-Z)." + +msgid "IDS_TPLATFORM_ACBUTTON_DONE_ABB" +msgstr "HOTOVO" + +msgid "IDS_TPLATFORM_ACBUTTON_CANCEL_ABB" +msgstr "ZRUŠIT" + +msgid "IDS_HS_OPT_SORT_ITEMS" +msgstr "Řadit položky" + +msgid "IDS_HS_HEADER_SORT_ITEMS" +msgstr "Řadit položky" + +msgid "IDS_HS_BODY_WIDGETS_ABB" +msgstr "Pomůcky" + +msgid "IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB" +msgstr "Pomůcku nelze přidat" + +msgid "IDS_HS_HEADER_ADD_WIDGET" +msgstr "Přidat nástroj" + +msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" +msgstr "Na domovské obrazovce není dostatek volného místa. Odeberte některé pomůcky a opakujte akci." + +msgid "IDS_HS_HEADER_EDIT" +msgstr "Upravit" + +msgid "IDS_HS_OPT_EDIT" +msgstr "Upravit" + +msgid "IDS_HS_BODY_THEMES_ABB" +msgstr "Témata" + +msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" +msgstr "Aplikace není nainstalována." + +msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" +msgstr "%s a všechny související funkce budou zakázány. Když je budete chtít opět povolit, přejděte na Nastavení > Správce aplikací." + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" +msgstr "Bylo dosaženo maximálního počtu aplikací ve složce (%d)." + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Změnit mřížku aplikace" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Změnit mřížku aplikace" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Zobr. vš. str." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Návrhář stylu" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Bylo dosaženo maximálního počtu oblíbených aplikací (%d)." + diff --git a/res/po/da.po b/res/po/da.po index 42c9efd..e6a8198 100755 --- a/res/po/da.po +++ b/res/po/da.po @@ -1,5 +1,5 @@ msgid "IDS_CAM_SK_CANCEL" -msgstr "Annullér" +msgstr "Annuller" msgid "IDS_CAM_SK_OK" msgstr "OK" @@ -14,7 +14,7 @@ msgid "IDS_COM_SK_OPEN" msgstr "Åbn" msgid "IDS_MB_SK_EDIT" -msgstr "Redigér" +msgstr "Rediger" msgid "IDS_MEMO_SK_ADD_ABB" msgstr "Tilføj" @@ -47,7 +47,7 @@ msgid "IDS_TPLATFORM_BODY_TICKBOX_T_TTS" msgstr "Afkrydsningsfelt" msgid "IDS_TPLATFORM_BODY_TICK_T_TTS" -msgstr "Markér" +msgstr "Marker" msgid "IDS_TPLATFORM_BODY_TITLE" msgstr "Titel" @@ -56,7 +56,7 @@ msgid "IDS_TPLATFORM_BODY_UNTICK_T_TTS" msgstr "Fjern markering" msgid "IDS_AT_BODY_UNINSTALL" -msgstr "Afinstallér" +msgstr "Afinstaller" msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "Vælg app at tilf." @@ -74,10 +74,10 @@ msgid "IDS_AT_POP_TO_REARRANGE_PAGES_YOU_NEED_TO_CHANGE_THE_VIEW_TYPE_TO_A_CUSTO msgstr "For at omorganisere sider skal du ændre visningstypen til et brugerdefinerbart gitter." msgid "IDS_AT_POP_UNINSTALL_PS_Q" -msgstr "Afinstallér %s?" +msgstr "Afinstaller %s?" msgid "IDS_AT_TAB4_MINI_APPS" -msgstr "Mini-apps" +msgstr "Miniapps" msgid "IDS_CAM_OPT_MULTISHOT_DESELECT" msgstr "Fjern markering" @@ -86,7 +86,7 @@ msgid "IDS_COM_HEADER_UNNAMED_FOLDER" msgstr "Mappe uden navn" msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_CLOSE_APP_TRAY_TTS" -msgstr "Dobbelttryk for at lukke app-bakken." +msgstr "Dobbelttryk for at lukke appbakken." msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS" msgstr "Dobbelttryk for at åbne app-bakken." @@ -101,7 +101,7 @@ msgid "IDS_HS_BODY_DELETE_OPT_TTS" msgstr "Slet" msgid "IDS_HS_BODY_DOUBLE_TAP_AND_HOLD_TO_MOVE_T_TTS" -msgstr "Dobbelttap og hold nede for at flytte." +msgstr "Dobbelttryk og hold for at flytte." msgid "IDS_HS_BODY_DOUBLE_TAP_TO_CLOSE_T_TTS" msgstr "Dobbelttryk for at lukke." @@ -158,7 +158,7 @@ msgid "IDS_HS_BUTTON_DELETE" msgstr "Slet" msgid "IDS_HS_BUTTON_DISABLE_ABB" -msgstr "Deaktivér" +msgstr "Deaktiver" msgid "IDS_HS_BUTTON_HELP" msgstr "Hjælp" @@ -209,7 +209,7 @@ msgid "IDS_HS_OPT_EXTRACT_APPS_AND_DELETE_FOLDER_ABB" msgstr "Pak apps ud, og slet mappen" msgid "IDS_HS_POP_DISABLE_THIS_APPLICATION_Q" -msgstr "Deaktivér denne applikation?" +msgstr "Deaktiver denne applikation?" msgid "IDS_HS_POP_THE_NEW_PAGE_WILL_CONSIST_OF_THE_S_PLANNER_TASKS_AND_S_MEMO_DYNAMIC_BOXES" msgstr "Den nye side vil bestå af S Planner, Opgaver og S Memo Dynamic Box." @@ -269,7 +269,7 @@ msgid "IDS_TPLATFORM_BODY_NOT_SELECTED_T_TTS" msgstr "Ikke valgt" msgid "IDS_TPLATFORM_BODY_RADIO_BUTTON_T_TTS" -msgstr "Radioknap" +msgstr "Alternativknap" msgid "IDS_TPLATFORM_BODY_SELECTED_T_TTS" msgstr "Valgt" @@ -385,6 +385,15 @@ msgstr "Alle sider" msgid "IDS_JAVA_POP_BLANK" msgstr "Tom" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sorter elementer alfabetisk" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sorter elementer alfabetisk" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Appikoner og mapper vil blive sorteret i alfabetisk rækkefølge. Eventuelle tilpasninger, du har foretaget, vil blive kasseret." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Tilføj Dynamic Box" @@ -434,10 +443,10 @@ msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGE msgstr "Der er ikke tilstrækkelig plads på startskærmen. Fjern nogle widgets, og prøv igen." msgid "IDS_HS_HEADER_EDIT" -msgstr "Redigér" +msgstr "Rediger" msgid "IDS_HS_OPT_EDIT" -msgstr "Redigér" +msgstr "Rediger" msgid "IDS_HS_BODY_THEMES_ABB" msgstr "Temaer" @@ -451,3 +460,18 @@ msgstr "%s og alle funktioner knyttet hertil vil blive deaktiveret. For at aktiv msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Det maksimale antal applikationer i mappen er blevet nået (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Skift appgitter" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Skift appgitter" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Vis alle sider" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Det maksimale antal yndlingsapps er nået (%d)." + diff --git a/res/po/de.po b/res/po/de.po index 732caf7..4f0d821 100755 --- a/res/po/de.po +++ b/res/po/de.po @@ -29,7 +29,7 @@ msgid "IDS_PB_SK_CREATE_ABB" msgstr "Erstellen" msgid "IDS_ST_BODY_LOADING_ING" -msgstr "Ladevorgang läuft" +msgstr "Lädt..." msgid "IDS_ST_HEADER_APPLICATIONS" msgstr "Anwendungen" @@ -385,6 +385,15 @@ msgstr "Alle Seiten" msgid "IDS_JAVA_POP_BLANK" msgstr "Leer" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Alphabetische Elementsortierung" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Alphabetische Elementsortierung" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "App-Symbole und Ordner werden in alphabetischer Reihenfolge sortiert. Alle von Ihnen vorgenommenen Anpassungen werden verworfen." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box hinzufügen" @@ -451,3 +460,18 @@ msgstr "%s und alle damit zusammenhängenden Funktionen werden deaktiviert. Unte msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Maximale Anzahl an Anwendungen im Ordner (%d) erreicht." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "App-Gitter ändern" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Ändern des App-Gitters" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Alle anzeigen" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maximale Anzahl an bevorzugten Apps (%d) erreicht." + diff --git a/res/po/el_GR.po b/res/po/el_GR.po index 32b459d..834afb0 100755 --- a/res/po/el_GR.po +++ b/res/po/el_GR.po @@ -385,6 +385,15 @@ msgstr "Όλες οι σελίδες" msgid "IDS_JAVA_POP_BLANK" msgstr "Κενό" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Αλφαβητική ταξινόμηση στοιχείων" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Αλφαβητική ταξιν. στοιχείων" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Τα εικονίδια και οι φάκελοι εφαρμογών θα ταξινομηθούν με αλφαβητική σειρά. Θα απορριφθούν οποιεσδήποτε προσαρμογές έχετε κάνει." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Προσθήκη Dynamic Box" @@ -451,3 +460,18 @@ msgstr "Η εφαρμογή %s και οι σχετικές λειτουργίε msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Συμπληρώθηκε ο μέγιστος αριθμός εφαρμογών στο φάκελο (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Αλλαγή πλέγματος εφαρμογής" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Αλλαγή πλέγματος εφαρμογής" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Προβ. σελίδων" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Εφαρμογή\nεπιλ. στυλ" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Συμπληρώθηκε ο μέγιστος αριθμός αγαπημένων εφαρμογών (%d)." + diff --git a/res/po/en.po b/res/po/en.po index ab8d2f0..8f936f0 100755 --- a/res/po/en.po +++ b/res/po/en.po @@ -58,12 +58,6 @@ msgstr "Untick" msgid "IDS_AT_BODY_UNINSTALL" msgstr "Uninstall" -msgid "IDS_AT_BUTTON_CHANGE_VIEW" -msgstr "Change view" - -msgid "IDS_AT_HEADER_PD_SELECTED" -msgstr "%d selected" - msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "Select apps to add" @@ -73,12 +67,6 @@ msgstr "Select apps to hide" msgid "IDS_AT_HEADER_SELECT_APPS_TO_SHOW_ABB" msgstr "Select apps to show" -msgid "IDS_AT_OPT_ALPHABETICAL_GRID_ABB" -msgstr "Alphabetical grid" - -msgid "IDS_AT_OPT_CUSTOMISABLE_GRID_ABB" -msgstr "Customisable grid" - msgid "IDS_AT_OPT_VIEW_AS" msgstr "View as" @@ -355,9 +343,6 @@ msgstr "%d selected" msgid "IDS_ST_SK_NEXT" msgstr "Next" -msgid "IDS_HS_OPT_MANAGE_APPLICATIONS_ABB" -msgstr "Manage applications" - msgid "IDS_HS_POP_PD_ITEMS_WILL_BE_HIDDEN" msgstr "%d items will be hidden." @@ -386,7 +371,7 @@ msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "1 item will be hidden." msgid "IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG" -msgstr "Unable to add this Home Box to the home screen. There is not enough space on the home screen. Remove some Home Boxes and try again." +msgstr "Unable to add this Widget to the home screen. There is not enough space on the home screen. Remove some Home Boxes and try again." msgid "IDS_MSG_HEADER_UNABLE_TO_ADD" msgstr "Unable to add" @@ -400,6 +385,15 @@ msgstr "All pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Blank" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "App icons and folders will be sorted into alphabetical order. Any customisations you have made will be discarded." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Add Dynamic Box" @@ -446,7 +440,7 @@ msgid "IDS_HS_HEADER_ADD_WIDGET" msgstr "Add widget" msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" -msgstr "There is not enough space on the Home screen. Remove some widgets and try again." +msgstr "There is not enough space on the home screen. Remove some widgets and try again." msgid "IDS_HS_HEADER_EDIT" msgstr "Edit" @@ -457,14 +451,27 @@ msgstr "Edit" msgid "IDS_HS_BODY_THEMES_ABB" msgstr "Themes" -msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" -msgstr "Sort items alphabetically" +msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" +msgstr "Application not installed." -msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" -msgstr "Sort items alphabetically" - -msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" -msgstr "App icons and folders will be sorted into alphabetical order. Any customisations you have made will be discarded." +msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" +msgstr "%s and all the features related to it will be disabled. To enable it again, go to Settings > Application manager." msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" -msgstr "Maximum number of applications in folder (%d) reached." \ No newline at end of file +msgstr "Maximum number of applications in folder (%d) reached." + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "View all pages" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maximum number of favourite apps (%d) reached." + diff --git a/res/po/en_PH.po b/res/po/en_PH.po index d8dc1a1..953946e 100755 --- a/res/po/en_PH.po +++ b/res/po/en_PH.po @@ -385,6 +385,15 @@ msgstr "All pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Blank" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "App icons and folders will be sorted into alphabetical order. Any customizations you have made will be discarded." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Add Dynamic Box" @@ -392,7 +401,7 @@ msgid "IDS_ST_BUTTON_REMOVE_ABB2" msgstr "Remove" msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" -msgstr "Remove folder" +msgstr "Alisin ang folder" msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" msgstr "Folder will be removed. Applications in this folder will not be uninstalled." @@ -451,3 +460,18 @@ msgstr "%s and all the features related to it will be disabled. To enable it aga msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Maximum number of applications in folder (%d) reached." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "View all pages" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maximum number of favorite apps (%d) reached." + diff --git a/res/po/en_US.po b/res/po/en_US.po index b93d17c..74e40d6 100755 --- a/res/po/en_US.po +++ b/res/po/en_US.po @@ -23,7 +23,7 @@ msgid "IDS_MF_OPT_DELETEFOLDER" msgstr "Delete folder" msgid "IDS_MF_POP_ERR_FOLDER_NAME_EMPTY" -msgstr "Enter folder name." +msgstr "Enter folder name" msgid "IDS_PB_SK_CREATE_ABB" msgstr "Create" @@ -32,7 +32,7 @@ msgid "IDS_ST_BODY_LOADING_ING" msgstr "Loading..." msgid "IDS_ST_HEADER_APPLICATIONS" -msgstr "Applications" +msgstr "Apps" msgid "IDS_ST_HEADER_MUSIC" msgstr "Music" @@ -170,7 +170,7 @@ msgid "IDS_HS_BUTTON_MAGAZINE_ABB" msgstr "Magazine" msgid "IDS_HS_BUTTON_PHONE" -msgstr "Device" +msgstr "Phone" msgid "IDS_HS_HEADER_ADD_ITEMS" msgstr "Add items" @@ -371,7 +371,7 @@ msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "1 item will be hidden." msgid "IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG" -msgstr "Unable to add this Home Box to the Home screen. There is not enough space on the Home screen. Remove some Home Boxes and try again." +msgstr "Unable to add this Widget to the Home screen. There is not enough space on the Home screen. Remove some Home Boxes and try again." msgid "IDS_MSG_HEADER_UNABLE_TO_ADD" msgstr "Unable to add" @@ -385,6 +385,15 @@ msgstr "All pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Blank" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort items alphabetically" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "App icons and folders will be sorted into alphabetical order. Any customizations you have made will be discarded." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Add Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s and all the features related to it will be turned off. To turn it on msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Maximum number of applications in folder (%d) reached." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Change app grid" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "View all pages" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maximum number of favorite apps (%d) reached." + diff --git a/res/po/es_ES.po b/res/po/es_ES.po index b0239ce..5da2f04 100755 --- a/res/po/es_ES.po +++ b/res/po/es_ES.po @@ -385,6 +385,15 @@ msgstr "Todas las páginas" msgid "IDS_JAVA_POP_BLANK" msgstr "Vacío" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar alfabéticamente" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar alfabéticamente" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Las carpetas y los iconos de las aplicaciones se organizarán por orden alfabético. Se descartarán las personalizaciones que haya hecho." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Añadir Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s y todas las funciones relacionadas se desactivarán. Para volver a ac msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Se ha alcanzado el número máximo de aplicaciones en la carpeta (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Cambiar cuadrícula aplicación" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Cambiar cuadrícula" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ver todas pág" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Ajustes de estilo" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Se ha alcanzado el número máximo de aplicaciones favoritas (%d)." + diff --git a/res/po/es_US.po b/res/po/es_US.po index 6088b51..4b84417 100755 --- a/res/po/es_US.po +++ b/res/po/es_US.po @@ -149,7 +149,7 @@ msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" msgstr "No es posible cargar los datos. Pulse para intentarlo de nuevo." msgid "IDS_HS_BODY_WALLPAPERS_ABB" -msgstr "Fondos de pant." +msgstr "Fondos pantalla" msgid "IDS_HS_BUTTON_APPS" msgstr "Aplic." @@ -385,6 +385,15 @@ msgstr "Todas las páginas" msgid "IDS_JAVA_POP_BLANK" msgstr "Vacío" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar alfabéticamente" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar alfabéticamente" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Las carpetas y los atajos de aplicaciones se ordenarán alfabéticamente. Se descartarán todas las personalizaciones que haya realizado." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Añadir Dynamic Box" @@ -446,8 +455,23 @@ msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" msgstr "Aplicación no instalada." msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" -msgstr "%s y todas las funciones relacionadas se desactivarán. Para volver a activarlas, vaya a Configuración > Administrador de aplicaciones." +msgstr "%s y todas las funciones relacionadas se desactivarán. Para volver a activarlas, vaya Ajustes > Administrador de aplicaciones." msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Se alcanzó el número máximo de aplicaciones en la carpeta (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Cambiar cuadrícula aplicaciones" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Cambiar la cuadrícula" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ver todas pág." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Ajustes de estilo" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Se alcanzó el número máximo de aplicaciones favoritas (%d)." + diff --git a/res/po/et.po b/res/po/et.po index ece166b..837c2bd 100755 --- a/res/po/et.po +++ b/res/po/et.po @@ -385,6 +385,15 @@ msgstr "Kõik lehed" msgid "IDS_JAVA_POP_BLANK" msgstr "Tühi" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sordi üksused tähestikuliselt" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Üksuste tähestikul. sortim." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Rakenduste ikoonid ja kaustad sorditakse tähestikulisse järjestusse. Kõiki teie kohandusi eiratakse." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Lisa Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s ja kõik sellega seotud funktsioonid desaktiveeritakse. Selle uuesti msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Rakenduste maksimaalne arv kaustas (%d) on täis." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Rakenduse ruudustiku muutmine" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Rakenduse ruudustiku muutm." + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Kuva kõik lehed" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stilist" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Lemmikrakenduste maksimaalne arv (%d) on täis." + diff --git a/res/po/eu.po b/res/po/eu.po index c3a5738..7588680 100755 --- a/res/po/eu.po +++ b/res/po/eu.po @@ -290,7 +290,7 @@ msgid "IDS_COM_BODY_CONTACTS" msgstr "Kontaktuak" msgid "IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED" -msgstr "Gehienezko karaktere kopurura heldu zara" +msgstr "Gehienezko karaktere kopurura heldu zara." msgid "IDS_COM_SK_OK" msgstr "Ados" @@ -385,6 +385,15 @@ msgstr "Orri guztiak" msgid "IDS_JAVA_POP_BLANK" msgstr "Hutsik" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenatu elementuak alfabetikoki" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenatu alfabetikoki" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Aplikazio ikonoak eta karpetak alfabetikoki ordenatuko dira. Egin dituzun pertsonalizazioak baztertuko dira." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Gehitu Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s eta berari lotutako eginkizun guztiak desgaituko dira. Berriz ere gai msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Karpeta bakoitzeko aplikazioen gehieneko kopurura (%d) iritsi zara." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Aldatu aplikazioaren sareta" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Aldatu aplikazioaren sareta" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ikusi orri denak" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Estilo\nxehetas." + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Gogoko aplikazioen gehienezko kopurura (%d) iritsi zara." + diff --git a/res/po/fi.po b/res/po/fi.po index 645a8be..38c43d2 100755 --- a/res/po/fi.po +++ b/res/po/fi.po @@ -385,6 +385,15 @@ msgstr "Kaikki sivut" msgid "IDS_JAVA_POP_BLANK" msgstr "Tyhjä" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Lajittele kohteet aakkosell." + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Lajittele kohteet aakkosell." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Sovelluskuvakkeet ja kansiot lajitellaan aakkosellisesti. Tekemäsi muutokset hylätään." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Lisää Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s ja kaikki siihen liittyvät toiminnot poistetaan käytöstä. Voit ot msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Kansiossa olevien sovellusten enimmäismäärä (%d) on saavutettu." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Muuta sovellusruudukkoa" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Muuta sovellusruudukkoa" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Näytä kaikki siv." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Tyylittely" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Suosikkisovellusten enimmäismäärä (%d) on saavutettu." + diff --git a/res/po/fr.po b/res/po/fr.po index 24ce9bb..aec5eb2 100755 --- a/res/po/fr.po +++ b/res/po/fr.po @@ -29,7 +29,7 @@ msgid "IDS_PB_SK_CREATE_ABB" msgstr "Créer" msgid "IDS_ST_BODY_LOADING_ING" -msgstr "Chargement..." +msgstr "Chargement en cours." msgid "IDS_ST_HEADER_APPLICATIONS" msgstr "Applications" @@ -385,6 +385,15 @@ msgstr "Toutes les pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Vide" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Trier éléments dans ordre alpha." + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Tri éléments ds ordre alpha." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Les icônes d'application et les dossiers vont être triés par ordre alphabétique. Les personnalisations effectuées seront ignorées." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Ajouter une Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s et l'ensemble des fonctions qui lui sont associées vont être désac msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Le nombre maximal d'applications dans le dossier (%d) a été atteint." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Modifier grille d'applications" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Modification grille d'appli." + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Aff. ttes pages" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Style" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Le nombre maximal d'applications favorites (%d) a été atteint." + diff --git a/res/po/fr_CA.po b/res/po/fr_CA.po index 901ce08..dd863c3 100755 --- a/res/po/fr_CA.po +++ b/res/po/fr_CA.po @@ -385,6 +385,15 @@ msgstr "Toutes les pages" msgid "IDS_JAVA_POP_BLANK" msgstr "Vide" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Trier éléments dans ordre alpha." + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Tri éléments ds ordre alpha." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Les icônes d'application et les dossiers vont être triés par ordre alphabétique. Les personnalisations effectuées seront ignorées." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Ajouter une boite dynamique" @@ -451,3 +460,18 @@ msgstr "%s et l'ensemble des fonctions qui lui sont associées vont être désac msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Le nombre maximal d'applications dans le dossier (%d) a été atteint." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Modifier grille d'applications" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Modification grille d'appli." + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Aff. ttes pages" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Style" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Le nombre maximal d'applications favorites (%d) a été atteint." + diff --git a/res/po/ga.po b/res/po/ga.po index 4112bae..2c9ff4c 100755 --- a/res/po/ga.po +++ b/res/po/ga.po @@ -385,6 +385,15 @@ msgstr "Gach leathanach" msgid "IDS_JAVA_POP_BLANK" msgstr "Bán" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sórtáil míreanna go haibítreach" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sórtáil go haibítreach" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Stórálfar íocóin agus fillteáin feidhmchláir in ord aibítreach. Cuileálfar aon saincheapadh a rinne tú." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Cuir Dynamic Box leis" @@ -451,3 +460,18 @@ msgstr "Díchumasófar %s mar aon leis na gnéithe go léir a bhaineann leis. Le msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Uaslíon na bhfeidhmchlár i bhfillteán (%d) bainte amach." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Athraigh greille feidhmchlár" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Athraigh greille feidhmchlár" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Amharc ar gach lch" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stíleoir" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Uaslíon na bhfeidhmchlar ceanáin (%d) bainte amach." + diff --git a/res/po/gl.po b/res/po/gl.po index ef2415b..7fc475a 100755 --- a/res/po/gl.po +++ b/res/po/gl.po @@ -385,6 +385,15 @@ msgstr "Todas as páxinas" msgid "IDS_JAVA_POP_BLANK" msgstr "Baleira" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar elementos alfabeticam." + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar elementos alfabetic." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "As iconas e carpetas das aplicacións ordenaranse alfabeticamente. Todas as personalizacións efectuadas descartaranse." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Engadir Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s e todas as funcións relacionadas desactivaranse. Para activala de no msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Alcanzouse o número máximo de aplicacións da carpeta (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Cambiar cuadrícula aplicacións" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Cambiar cuadrícula aplicac." + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ver todas páx." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Axustes de estilo" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Alcanzouse o número máximo de aplicacións favoritas (%d)." + diff --git a/res/po/hi.po b/res/po/hi.po index 476442f..7ee0ed3 100755 --- a/res/po/hi.po +++ b/res/po/hi.po @@ -58,12 +58,6 @@ msgstr "अनटिक करें" msgid "IDS_AT_BODY_UNINSTALL" msgstr "स्थापना रद्द करें" -msgid "IDS_AT_BUTTON_CHANGE_VIEW" -msgstr "दृश्य बदलें" - -msgid "IDS_AT_HEADER_PD_SELECTED" -msgstr "%d चयनित" - msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "जोड़ने के लिए एप्स चुनें" @@ -73,12 +67,6 @@ msgstr "छिपाने के लिए एप्स चुनें" msgid "IDS_AT_HEADER_SELECT_APPS_TO_SHOW_ABB" msgstr "दिखाने के लिए एप्स चुनें" -msgid "IDS_AT_OPT_ALPHABETICAL_GRID_ABB" -msgstr "वर्णक्रमानुसार ग्रिड" - -msgid "IDS_AT_OPT_CUSTOMISABLE_GRID_ABB" -msgstr "अनुकूलित करने योग्य ग्रिड" - msgid "IDS_AT_OPT_VIEW_AS" msgstr "इस रूप में देखें" @@ -113,7 +101,7 @@ msgid "IDS_HS_BODY_DELETE_OPT_TTS" msgstr "हटाएँ" msgid "IDS_HS_BODY_DOUBLE_TAP_AND_HOLD_TO_MOVE_T_TTS" -msgstr "अन्यत्र ले जाने के लिए डबल टैप और होल्ड करें।" +msgstr "अन्यत्र ले जाने के लिए दो बार टैप और होल्ड करें।" msgid "IDS_HS_BODY_DOUBLE_TAP_TO_CLOSE_T_TTS" msgstr "बंद करने के लिए दो बार टैप करें।" @@ -152,7 +140,7 @@ msgid "IDS_HS_BODY_THE_FOLDER_IS_OPEN" msgstr "फोल्डर खुला है।" msgid "IDS_HS_BODY_THIS_WILL_DELETE_THE_FOLDER_AND_ALL_THE_ITEMS_IT_CONTAINS" -msgstr "यह फ़ोल्डर और इसकी सभी सामग्री को हटा देगा" +msgstr "यह फोल्डर और इसकी सभी सामग्री को हटा देगा।" msgid "IDS_HS_BODY_UNABLE_TO_ADD_MORE_APPS_MAXIMUM_NUMBER_OF_APPS_REACHED" msgstr "अधिक ऐप जोड़ने में अक्षम। ऐप्स की अधिकतम संख्‍या पास हो गई है।" @@ -307,6 +295,12 @@ msgstr "वर्णो की संख्‍या अधिकतम पह msgid "IDS_COM_SK_OK" msgstr "ओके" +msgid "IDS_COM_SK_CANCEL" +msgstr "रद्द" + +msgid "IDS_COM_SK_DONE" +msgstr "पूर्ण" + msgid "IDS_CAM_BODY_SHOWING_PD_ITEMS_T_TTS" msgstr "%d मदें दिखाना" @@ -343,12 +337,12 @@ msgstr "चुनें" msgid "IDS_COM_BODY_INTERNET" msgstr "इंटरनेट" +msgid "IDS_MEMO_HEADER_PD_SELECTED_ABB2" +msgstr "%d चयनित" + msgid "IDS_ST_SK_NEXT" msgstr "अगला" -msgid "IDS_HS_OPT_MANAGE_APPLICATIONS_ABB" -msgstr "एप्लीकेशंस व्यवस्थित करें" - msgid "IDS_HS_POP_PD_ITEMS_WILL_BE_HIDDEN" msgstr "%d मदें छिपाई जाएँगी।" @@ -380,7 +374,7 @@ msgid "IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_EN msgstr "इस होम बॉक्स को होम स्क्रीन पर जोड़ने में असमर्थ। होम स्क्रीन पर पर्याप्त स्थान नहीं है। कुछ होम बॉक्सेज निकालें और फिर से प्रयास करें।" msgid "IDS_MSG_HEADER_UNABLE_TO_ADD" -msgstr "जोड़ने में अक्षम" +msgstr "जोड़ने में असमर्थ" msgid "IDS_HS_OPT_HOME_BOXES" msgstr "होम बॉक्सेज" @@ -400,3 +394,84 @@ msgstr "वर्ण क्रम में मदें सॉर्ट कर msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" msgstr "एप चिह्न और फोल्डर्स अक्षरक्रमानुसार क्रम में क्रमबद्ध किए जाएँगे। आपके द्वारा किए गए कोई भी अनुकूलन निरस्त किए जाएँगे।" +msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" +msgstr "Dynamic Box जोड़ें" + +msgid "IDS_ST_BUTTON_REMOVE_ABB2" +msgstr "निकालें" + +msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" +msgstr "फोल्डर निकालें" + +msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" +msgstr "फोल्डर को निकाल दिया जाएगा। इस फोल्डर के एप्लीकेशंस को अस्थापित नहीं किया जाएगा।" + +msgid "IDS_HS_OPT_MANUALLY_ABB" +msgstr "मैनुअल रूप से" + +msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" +msgstr "नाम (A-Z) द्वारा" + +msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" +msgstr "%s अस्थापित किया जाएगा।" + +msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" +msgstr "नाम (A-Z) के अनुसार क्रमबद्ध किए गए चिह्नों को पुनः व्यवस्थित करने में असमर्थ।" + +msgid "IDS_TPLATFORM_ACBUTTON_DONE_ABB" +msgstr "पूर्ण" + +msgid "IDS_TPLATFORM_ACBUTTON_CANCEL_ABB" +msgstr "रद्द करें" + +msgid "IDS_HS_OPT_SORT_ITEMS" +msgstr "मदें क्रमबद्ध करें" + +msgid "IDS_HS_HEADER_SORT_ITEMS" +msgstr "मदें क्रमबद्ध करें" + +msgid "IDS_HS_BODY_WIDGETS_ABB" +msgstr "विजेट्स" + +msgid "IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB" +msgstr "विजेट जोड़ने में असमर्थ" + +msgid "IDS_HS_HEADER_ADD_WIDGET" +msgstr "विजेट जोड़ें" + +msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" +msgstr "होम स्क्रीन पर पर्याप्त स्थान नहीं है। कुछ विजेट्स निकालें और फिर से प्रयास करें।" + +msgid "IDS_HS_HEADER_EDIT" +msgstr "संपादन" + +msgid "IDS_HS_OPT_EDIT" +msgstr "संपादन" + +msgid "IDS_HS_BODY_THEMES_ABB" +msgstr "थीम्स" + +msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" +msgstr "एप्लीकेशन स्थापित नहीं हुई।" + +msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" +msgstr "%s और इससे जुड़ी सभी सुविधाएँ असमर्थ कर दी जाएँगी। इसे फिर से सक्षम करने के लिए सेटिंग्स > एप्लीकेशन प्रबंधक पर जाएँ।" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" +msgstr "फोल्डर में अधिकतम एप्लीकेशंस की संख्या (%d) पूरी हुई।" + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "एप ग्रिड बदलें" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "एप ग्रिड बदलें" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "सभी पेज देखें" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "स्टायलर" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "पसंदीदा एप्स की अधिकतम संख्‍या (%d) पूरी हो गई है।" + diff --git a/res/po/hr.po b/res/po/hr.po index 0116309..064b01f 100755 --- a/res/po/hr.po +++ b/res/po/hr.po @@ -385,6 +385,15 @@ msgstr "Sve stranice" msgid "IDS_JAVA_POP_BLANK" msgstr "Prazno" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Razvrstaj stavke po abecedi" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Razvrstav. stavki po abecedi" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ikone i mape aplikacija rasporedit će se abecednim redom. Odbacit će se sva prilagođavanja koja ste napravili." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dodajte Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s i sve značajke povezane s time bit će isključene. Da biste ga pono msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Dosegnut je maksimalan broj aplikacija u mapi (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Promijeni mrežu aplikacija" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Promjena mreže aplikacija" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Vidi sve str." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stilist" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Dosegnut je maksimalan broj (%d) omiljenih aplikacija." + diff --git a/res/po/hu.po b/res/po/hu.po index 5c8f6e8..72c2b11 100755 --- a/res/po/hu.po +++ b/res/po/hu.po @@ -5,7 +5,7 @@ msgid "IDS_CAM_SK_OK" msgstr "OK" msgid "IDS_COM_BODY_CREATE_FOLDER" -msgstr "Mappát létrehoz" +msgstr "Mappa létrehozása" msgid "IDS_COM_POP_SHOW_A" msgstr "Mutass" @@ -385,6 +385,15 @@ msgstr "Összes oldal" msgid "IDS_JAVA_POP_BLANK" msgstr "Üres" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Elemek betűrendes rendezése" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Elemek betűrendes rendezése" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Betűrendbe állítja az alkalmazások ikonjait és a mappákat. Ezzel törli a korábbi testreszabásokat." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box hozzáadása" @@ -451,3 +460,18 @@ msgstr "A(z) %s és minden kapcsolódó funkció le lesz tiltva. Az újbóli eng msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Elérte az egy mappához adható alkalmazások maximális számát (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Alkalmazásrács módosítása" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Alkalmazásrács módosítása" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ö. old. látható" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stílus-\ntervező" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Elérte a kedvenc alkalmazások maximális számát (%d)." + diff --git a/res/po/hy.po b/res/po/hy.po index b5ed403..6ea95a3 100755 --- a/res/po/hy.po +++ b/res/po/hy.po @@ -385,6 +385,15 @@ msgstr "Բոլոր էջերը" msgid "IDS_JAVA_POP_BLANK" msgstr "Դատարկ" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Տարրերը տեսակավորել այբբ. կարգով" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Տարրերը տեսակ. այբբ. կարգով" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ծրագրի պատկերակներն ու պանակները տեսակավորվելու են այբբենական կարգով: Ձեր կատարած բոլոր ընտրակայումները կանտեսվեն:" + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Ավելացնել Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s-ն ու դրան առնչվող բոլոր գործառական հն msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Հասել է պանակում ծրագրերի առավելագույն քանակին (%d):" +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Փոխել ծրագրի վանդակացանցը" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Փոխել ծրագրի վանդակացանցը" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Դիտ. բոլոր էջեր" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Ոճ" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Հասել է սիրված ծրագրերի առավելագույն քանակին (%d):" + diff --git a/res/po/is.po b/res/po/is.po index 0c8cc93..93560dc 100755 --- a/res/po/is.po +++ b/res/po/is.po @@ -385,6 +385,15 @@ msgstr "Allar síður" msgid "IDS_JAVA_POP_BLANK" msgstr "Autt" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Raða atriðum í stafrófsröð" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Raða atriðum í stafrófsröð" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Forritatáknum og möppum verður raðað í stafrófsröð. Öllum sérstillingum verður fleygt." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Bæta við Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s og allir tengdir eiginleikar verða gerðir óvirkir. Farðu í Still msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Hámarksfjölda forrita í möppu (%d) hefur verið náð." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Breyta uppröðun forrita" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Breyta uppröðun forrita" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Allar síður" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stíll" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Hámarksfjölda uppáhaldsforrita (%d) náð." + diff --git a/res/po/it_IT.po b/res/po/it_IT.po index d59d4b1..24b8c2c 100755 --- a/res/po/it_IT.po +++ b/res/po/it_IT.po @@ -385,6 +385,15 @@ msgstr "Tutte le pagine" msgid "IDS_JAVA_POP_BLANK" msgstr "Vuoto" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordina alfabeticamente elementi" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordina elem. alfabeticamente" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Le icone e le cartelle delle applicazioni verranno riordinate in ordine alfabetico. Le personalizzazioni applicate verranno eliminate." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Aggiungi Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s e tutte le funzionalità correlate verranno disattivate. Per abilitar msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "È stato raggiunto il numero massimo di applicazioni nella cartella (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Modifica griglia applicazioni" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Modifica griglia app" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Vedi tutte le pagine" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Il numero massimo di applicazioni preferite (%d) è stato raggiunto." + diff --git a/res/po/ja_JP.po b/res/po/ja_JP.po index 2f286cf..03571e2 100755 --- a/res/po/ja_JP.po +++ b/res/po/ja_JP.po @@ -385,6 +385,15 @@ msgstr "全てのページ" msgid "IDS_JAVA_POP_BLANK" msgstr "空白です。" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "アルファベット順に並べ替え" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "アルファベット順に並べ替え" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "アプリアイコンおよびフォルダをアルファベット順に並べ替えます。カスタマイズした並び順は破棄されます。" + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Boxを追加" @@ -404,7 +413,7 @@ msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" msgstr "名前順(A~Z)" msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" -msgstr "%sをアンインストールします。" +msgstr "%sを​アンインストールします。" msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" msgstr "名前順(A~Z)で表示しているアイコンを並べ替えることはできません。" @@ -451,3 +460,18 @@ msgstr "%sと関連する全ての機能が無効になります。再度有効 msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "フォルダ内のアプリケーションの最大件数(%d件)に達しました。" +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "アプリグリッドを変更" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "アプリグリッドを変更" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "全ページを表示" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "スタイル" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "お気に入りのアプリの最大数(%d件)に達しました。" + diff --git a/res/po/ka.po b/res/po/ka.po index ac82594..7f13a41 100755 --- a/res/po/ka.po +++ b/res/po/ka.po @@ -385,6 +385,15 @@ msgstr "ყველა გვერდი" msgid "IDS_JAVA_POP_BLANK" msgstr "ცარიელი" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "ელემენტების დალაგება ანბანით" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "ელემენტების დალაგება ანბანით" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "აპლიკაციის ნიშნები და საქაღალდეები დალაგდება ანბანით. თქვენ მიერ შერჩეული ყველა პარამეტრი გაუქმდება." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box-ის დამატება" @@ -451,3 +460,18 @@ msgstr "%s და მასთან დაკავშირებული ყ msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "საქაღალდეში მიღწეულია აპლიკაციის მაქსიმალური რაოდენობა (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "აპლიკაციის ბადის შეცვლა" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "აპლიკაციის ბადის შეცვლა" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "იხ.ყველა გვერდი" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "სტილი" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "მიღწეულია შეტყობინების რჩეული აპლიკაციების მაქსიმალური რაოდენობა (%d)." + diff --git a/res/po/kk.po b/res/po/kk.po index 5c2f713..4bc945d 100755 --- a/res/po/kk.po +++ b/res/po/kk.po @@ -385,6 +385,15 @@ msgstr "Барлық беттер" msgid "IDS_JAVA_POP_BLANK" msgstr "Бос" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Элем-ді алфавит ретімен сұрыптау" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Элем. алфавит реті. сұрыптау" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Қолданба белгішелері мен қалталар алфавит ретімен сұрыпталады. Жасалған кез келген реттеулер алынып тасталынады." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box қосу" @@ -451,3 +460,18 @@ msgstr "%s және оған қатысты барлық мүмкіндікте msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Қалтадағы қолданбалардың ең көп саны (%d) шегіне жетті." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Қолданба торын өзгерту" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Қолданба торын өзгерту" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Беттерді көру" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Стильдеуші" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Таңдаулы қолданбалардың ең көп саны (%d) шегіне жетті." + diff --git a/res/po/ko_KR.po b/res/po/ko_KR.po index af79420..40774e8 100755 --- a/res/po/ko_KR.po +++ b/res/po/ko_KR.po @@ -143,7 +143,7 @@ msgid "IDS_HS_BODY_THIS_WILL_DELETE_THE_FOLDER_AND_ALL_THE_ITEMS_IT_CONTAINS" msgstr "폴더 및 포함된 항목을 모두 삭제합니다." msgid "IDS_HS_BODY_UNABLE_TO_ADD_MORE_APPS_MAXIMUM_NUMBER_OF_APPS_REACHED" -msgstr "최대 애플리케이션 수에 도달하여 더 이상 추가할 수 없습니다." +msgstr "최대 앱 수에 도달하여 더 이상 추가할 수 없습니다." msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" msgstr "데이터를 불러올 수 없습니다. 다시 시도하려면 누르세요." @@ -218,7 +218,7 @@ msgid "IDS_HS_POP_THE_NEW_PAGE_WILL_CONSIST_OF_TWITTER_DYNAMIC_BOXES_MSG" msgstr "Twitter Dynamic Box로 새 페이지를 구성합니다. 다음 화면에서 새 페이지에 표시할 팔로우하고 있는 사람들의 타임라인을 최대 %d개까지 선택하세요." msgid "IDS_HS_POP_THIS_FOLDER_WILL_BE_DELETED_BUT_THE_APPLICATIONS_WITHIN_IT_WILL_REMAIN_AVAILABLE_ON_YOUR_HOME_SCREEN_DELETE_THIS_FOLDER_Q" -msgstr "이 폴더를 삭제하더라도 폴더에 포함된 애플리케이션은 홈 화면에서 사용할 수 있습니다. 폴더를 삭제할까요?" +msgstr "이 폴더를 삭제하더라도 폴더에 포함된 앱은 홈 화면에서 사용할 수 있습니다. 폴더를 삭제할까요?" msgid "IDS_HS_TPOP_FAILED_TO_RELOAD_DEVICE_MEMORY_FULL" msgstr "디바이스 저장공간이 없어 다시 불러오지 못하였습니다." @@ -371,7 +371,7 @@ msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "항목 1개를 숨깁니다." msgid "IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG" -msgstr "홈 화면에 공간이 부족하여 이 Home Box를 홈 화면에 추가할 수 없습니다. 일부 Home Box를 제거한 후 다시 시도하세요." +msgstr "홈 화면에 공간이 부족하여 이 Home Box를 홈 화면에 추가할 수 없습니다. 일부 Home Box를 삭제한 후 다시 시도하세요." msgid "IDS_MSG_HEADER_UNABLE_TO_ADD" msgstr "추가할 수 없음" @@ -385,17 +385,26 @@ msgstr "전체 페이지" msgid "IDS_JAVA_POP_BLANK" msgstr "비어 있음" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "가나다 순 정렬" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "가나다 순 정렬" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "앱 아이콘 및 폴더는 가나다 순으로 정렬합니다. 이전에 배열한 순서는 저장되지 않습니다." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box 추가" msgid "IDS_ST_BUTTON_REMOVE_ABB2" -msgstr "제거" +msgstr "삭제" msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" -msgstr "폴더 제거" +msgstr "폴더 삭제" msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" -msgstr "폴더를 제거합니다. 폴더 안에 있는 애플리케이션은 삭제되지 않습니다." +msgstr "폴더를 삭제합니다. 폴더 안에 있는 앱은 삭제되지 않습니다." msgid "IDS_HS_OPT_MANUALLY_ABB" msgstr "직접 정렬" @@ -431,7 +440,7 @@ msgid "IDS_HS_HEADER_ADD_WIDGET" msgstr "위젯 추가" msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" -msgstr "홈 화면에 공간이 부족합니다. 일부 위젯을 제거한 후 다시 시도하세요." +msgstr "홈 화면에 공간이 부족합니다. 일부 위젯을 삭제한 후 다시 시도하세요." msgid "IDS_HS_HEADER_EDIT" msgstr "편집" @@ -446,8 +455,23 @@ msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" msgstr "애플리케이션이 설치되지 않았습니다." msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" -msgstr "%s 및 관련된 모든 기능을 해제합니다. 다시 실행하려면 [설정] > [애플리케이션 관리자]로 이동하세요." +msgstr "%s 및 관련된 모든 기능을 해제합니다. 다시 실행하려면 [설정 > 애플리케이션 관리자]로 이동하세요." msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" -msgstr "폴더에는 애플리케이션 %d개까지 추가할 수 있습니다." +msgstr "폴더에는 앱 %d개까지 추가할 수 있습니다." + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "앱 배열 변경" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "앱 배열 변경" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "모든 페이지 보기" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "스타일러" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "자주 사용하는 앱은 %d개까지 추가할 수 있습니다." diff --git a/res/po/lt.po b/res/po/lt.po index a52a41d..1d67964 100755 --- a/res/po/lt.po +++ b/res/po/lt.po @@ -385,6 +385,15 @@ msgstr "Visi puslapiai" msgid "IDS_JAVA_POP_BLANK" msgstr "Tuščia" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Rūšiuoti elementus pagal abėcėlę" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Rūšiuoti elem. pagal abėcėlę" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Programų piktogramos ir aplankai bus surūšiuoti pagal abėcėlę. Visi atlikti tinkinimai bus panaikinti." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Pridėti „Dynamic Box“" @@ -451,3 +460,18 @@ msgstr "%s ir visos su ja susijusios funkcijos bus išjungtos. Norėdami ją įj msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Pasiektas didžiausias programų skaičius aplanke (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Keisti programų tinklelį" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Keisti programų tinklelį" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Rod. visus psl." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stiliaus priemonė" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Pasiektas didžiausias mėgstamų programų skaičius (%d)." + diff --git a/res/po/lv.po b/res/po/lv.po index 8431d67..e6ba29d 100755 --- a/res/po/lv.po +++ b/res/po/lv.po @@ -385,6 +385,15 @@ msgstr "Visas lapas" msgid "IDS_JAVA_POP_BLANK" msgstr "Tukšs" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Kārtot objektus alfabētiski" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Kārtot objektus alfabētiski" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Programmu ikonas un mapes tiks kārtotas alfabētiski. Visi jūsu veiktie pielāgojumi tiks atmesti." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Pievienot Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s un visas ar to saistītās funkcijas tiks deaktivizētas. Lai to akti msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Sasniegts maksimālais programmu skaits mapē (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Mainīt programmas režģi" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Mainīt programmas režģi" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Sk. visas lapas" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Styler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Sasniegts maksimālais izlases programmu skaits (%d)." + diff --git a/res/po/mk.po b/res/po/mk.po index b577f86..15aa870 100755 --- a/res/po/mk.po +++ b/res/po/mk.po @@ -385,6 +385,15 @@ msgstr "Сите страници" msgid "IDS_JAVA_POP_BLANK" msgstr "Празно" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортирај ставки по азбучен ред" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортирај ставки по азб. ред" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Иконите на апликациите и папките ќе се подредат по азбучен ред. Направените приспособувања ќе се отфрлат." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Додај Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s и сите други функции поврзани со него msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Достигнат е максималниот број апликации (%d) во папка." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Промени мрежа на апликација" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Промени мрежа на апликација" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Види ги сите стр." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Стилист" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Достигнат е максималниот број омилени апликации (%d)." + diff --git a/res/po/nb.po b/res/po/nb.po index 12c3cf8..43e39c1 100755 --- a/res/po/nb.po +++ b/res/po/nb.po @@ -26,7 +26,7 @@ msgid "IDS_MF_POP_ERR_FOLDER_NAME_EMPTY" msgstr "Angi mappenavn." msgid "IDS_PB_SK_CREATE_ABB" -msgstr "Oppr." +msgstr "Lag ny" msgid "IDS_ST_BODY_LOADING_ING" msgstr "Åpner..." @@ -385,6 +385,15 @@ msgstr "Alle sider" msgid "IDS_JAVA_POP_BLANK" msgstr "Tom" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sorter elementer alfabetisk" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sorter elementer alfabetisk" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Appikoner og mapper blir sortert i alfabetisk rekkefølge. Eventuelle tilpasninger du har gjort, blir forkastet." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Legg til Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s og alle relaterte funksjoner blir deaktivert. Du kan reaktivere appen msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Maksimalt antall apper i mappe (%d) er nådd." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Endre apprutenett" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Endre apprutenett" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Vis alle sider" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stiler" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maksimalt antall favorittapper (%d) er nådd." + diff --git a/res/po/nl.po b/res/po/nl.po index c9e5db4..57a0be6 100755 --- a/res/po/nl.po +++ b/res/po/nl.po @@ -1,11 +1,11 @@ msgid "IDS_CAM_SK_CANCEL" -msgstr "Annuleer" +msgstr "Annuleren" msgid "IDS_CAM_SK_OK" msgstr "OK" msgid "IDS_COM_BODY_CREATE_FOLDER" -msgstr "Nieuwe map" +msgstr "Map maken" msgid "IDS_COM_POP_SHOW_A" msgstr "Tonen" @@ -14,7 +14,7 @@ msgid "IDS_COM_SK_OPEN" msgstr "Openen" msgid "IDS_MB_SK_EDIT" -msgstr "Bewerk" +msgstr "Bewerken" msgid "IDS_MEMO_SK_ADD_ABB" msgstr "Toev." @@ -32,7 +32,7 @@ msgid "IDS_ST_BODY_LOADING_ING" msgstr "Laden..." msgid "IDS_ST_HEADER_APPLICATIONS" -msgstr "Applicaties" +msgstr "Apps" msgid "IDS_ST_HEADER_MUSIC" msgstr "Muziek" @@ -56,7 +56,7 @@ msgid "IDS_TPLATFORM_BODY_UNTICK_T_TTS" msgstr "Deselecteren" msgid "IDS_AT_BODY_UNINSTALL" -msgstr "Verwijder" +msgstr "Verwijderen" msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "Select. extra apps" @@ -296,7 +296,7 @@ msgid "IDS_COM_SK_OK" msgstr "OK" msgid "IDS_COM_SK_CANCEL" -msgstr "Annuleer" +msgstr "Annuleren" msgid "IDS_COM_SK_DONE" msgstr "Gereed" @@ -385,6 +385,15 @@ msgstr "Alle pagina's" msgid "IDS_JAVA_POP_BLANK" msgstr "Leeg" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Items alfabetisch sorteren" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Items alfabetisch sorteren" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "App-pictogrammen en mappen worden in alfabetische volgorde gesorteerd. Eventuele aanpassingen worden verwijderd." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box toevoegen" @@ -451,3 +460,18 @@ msgstr "%s en alle functies die ermee samenhangen, worden uitgeschakeld. Als u d msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Maximumaantal applicaties in map (%d) is bereikt." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "App-raster wijzigen" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "App-raster wijzigen" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Alle pag. tonen" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stijl" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maximumaantal favoriete apps (%d) bereikt." + diff --git a/res/po/pl.po b/res/po/pl.po index f68e9b0..90e9a9b 100755 --- a/res/po/pl.po +++ b/res/po/pl.po @@ -287,7 +287,7 @@ msgid "IDS_ST_BODY_FONTSTYLE_ROSEMARY" msgstr "Rosemary" msgid "IDS_COM_BODY_CONTACTS" -msgstr "Książka telefoniczna" +msgstr "Kontakty" msgid "IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED" msgstr "Osiągnięto maksymalną liczbę znaków." @@ -385,6 +385,15 @@ msgstr "Wszystkie strony" msgid "IDS_JAVA_POP_BLANK" msgstr "Pusty" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sortuj elementy alfabetyczne" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort. element. alfabetyczne" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ikony i katalogi aplikacji zostaną posortowane w kolejności alfabetycznej. Wszystkie wykonane dostosowania zostaną odrzucone." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dodaj Dynamic Box" @@ -451,3 +460,18 @@ msgstr "Aplikacje %s i wszystkie funkcje z nią związane zostaną wyłączone. msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Osiągnięto maksymalną liczbę aplikacji w katalogu (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Zmień siatkę aplikacji" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Zmiana siatki aplikacji" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Wyświetl strony" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Edytor\nstylu" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Osiągnięto maksymalną liczbę ulubionych aplikacji (%d)." + diff --git a/res/po/pt_BR.po b/res/po/pt_BR.po index 50f439a..f0ad2f0 100755 --- a/res/po/pt_BR.po +++ b/res/po/pt_BR.po @@ -58,12 +58,6 @@ msgstr "Desmarcar" msgid "IDS_AT_BODY_UNINSTALL" msgstr "Desinstalar" -msgid "IDS_AT_BUTTON_CHANGE_VIEW" -msgstr "Alt. exib." - -msgid "IDS_AT_HEADER_PD_SELECTED" -msgstr "%d selecionado(s)" - msgid "IDS_AT_HEADER_SELECT_APPS_TO_ADD_ABB2" msgstr "Sel. aplic. adic." @@ -73,12 +67,6 @@ msgstr "Selec. aplic. p/ ocultar" msgid "IDS_AT_HEADER_SELECT_APPS_TO_SHOW_ABB" msgstr "Selec. aplic. p/ exibir" -msgid "IDS_AT_OPT_ALPHABETICAL_GRID_ABB" -msgstr "Grade alfabética" - -msgid "IDS_AT_OPT_CUSTOMISABLE_GRID_ABB" -msgstr "Grade personalizável" - msgid "IDS_AT_OPT_VIEW_AS" msgstr "Visualizar como" @@ -107,7 +95,7 @@ msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_TTS" msgstr "Tocar duas vezes para abrir." msgid "IDS_HS_BODY_BUTTON_T_TTS" -msgstr "Tecla" +msgstr "Botão" msgid "IDS_HS_BODY_DELETE_OPT_TTS" msgstr "Excluir" @@ -307,6 +295,12 @@ msgstr "Número máximo de caracteres atingido." msgid "IDS_COM_SK_OK" msgstr "OK" +msgid "IDS_COM_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_COM_SK_DONE" +msgstr "Concluir" + msgid "IDS_CAM_BODY_SHOWING_PD_ITEMS_T_TTS" msgstr "Exibir %d itens" @@ -343,12 +337,12 @@ msgstr "Selecionar" msgid "IDS_COM_BODY_INTERNET" msgstr "Internet" +msgid "IDS_MEMO_HEADER_PD_SELECTED_ABB2" +msgstr "%d selecionado(s)" + msgid "IDS_ST_SK_NEXT" msgstr "Próximo" -msgid "IDS_HS_OPT_MANAGE_APPLICATIONS_ABB" -msgstr "Gerenciar aplicativos" - msgid "IDS_HS_POP_PD_ITEMS_WILL_BE_HIDDEN" msgstr "%d itens serão ocultos." @@ -400,3 +394,84 @@ msgstr "Organ. itens alfabeticamente" msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" msgstr "Ícones e pastas de aplicativos serão organizados em ordem alfabética. Qualquer personalização feita será descartada." +msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" +msgstr "Adicionar Dynamic Box" + +msgid "IDS_ST_BUTTON_REMOVE_ABB2" +msgstr "Remover" + +msgid "IDS_HS_HEADER_REMOVE_FOLDER_ABB" +msgstr "Remover pasta" + +msgid "IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED" +msgstr "A pasta será removida. Os aplicativos nesta pasta não serão removidos." + +msgid "IDS_HS_OPT_MANUALLY_ABB" +msgstr "Manualmente" + +msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" +msgstr "Por nome (A-Z)" + +msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" +msgstr "%s será desinstalado." + +msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" +msgstr "Não é possível reorganizar os ícones organizados por nome (A-Z)." + +msgid "IDS_TPLATFORM_ACBUTTON_DONE_ABB" +msgstr "CONCLUÍDO" + +msgid "IDS_TPLATFORM_ACBUTTON_CANCEL_ABB" +msgstr "CANCELAR" + +msgid "IDS_HS_OPT_SORT_ITEMS" +msgstr "Ordenar itens" + +msgid "IDS_HS_HEADER_SORT_ITEMS" +msgstr "Ordenar itens" + +msgid "IDS_HS_BODY_WIDGETS_ABB" +msgstr "Widgets" + +msgid "IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB" +msgstr "Impossível adicionar widget" + +msgid "IDS_HS_HEADER_ADD_WIDGET" +msgstr "Adicionar widget" + +msgid "IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN" +msgstr "Não existe espaço suficiente na tela de início. Remova alguns widgets e tente novamente." + +msgid "IDS_HS_HEADER_EDIT" +msgstr "Editar" + +msgid "IDS_HS_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_HS_BODY_THEMES_ABB" +msgstr "Temas" + +msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" +msgstr "Aplicação não instalada." + +msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" +msgstr "%s e todos os recursos relacionados à ele serão desativados. Para ativá-lo novamente, vá para Configurações > Gerenciador de aplicativos." + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" +msgstr "Número máximo de aplicativos na pasta (%d) atingido." + +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Alterar grade do aplicativo" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Alterar grade do aplicativo" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Vis. páginas" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Estilo" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Número máximo de aplicativos favoritos (%d) atingido." + diff --git a/res/po/pt_PT.po b/res/po/pt_PT.po index b278bb5..34e6db5 100755 --- a/res/po/pt_PT.po +++ b/res/po/pt_PT.po @@ -385,6 +385,15 @@ msgstr "Todas as páginas" msgid "IDS_JAVA_POP_BLANK" msgstr "Em branco" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar itens alfabeticamente" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Ordenar itens alfabeticamente" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Os ícones e pastas de aplicações serão organizados por ordem alfabética. Quaisquer personalizações que tenha feito serão eliminadas." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Adicionar Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s e todas as funções relacionadas serão desactivados. Para o reactiv msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Número máximo de aplicações na pasta (%d) atingido." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Alterar grelha de aplicações" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Alterar grelha de aplicações" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ver tds. págs." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Estilista" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Número máximo de aplicações favoritas (%d) atingido." + diff --git a/res/po/ro.po b/res/po/ro.po index 0817de5..9c1fdfe 100755 --- a/res/po/ro.po +++ b/res/po/ro.po @@ -5,7 +5,7 @@ msgid "IDS_CAM_SK_OK" msgstr "OK" msgid "IDS_COM_BODY_CREATE_FOLDER" -msgstr "Creare folder" +msgstr "Creare director" msgid "IDS_COM_POP_SHOW_A" msgstr "Afişare" @@ -385,6 +385,15 @@ msgstr "Toate paginile" msgid "IDS_JAVA_POP_BLANK" msgstr "Necompletat" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort. elem. în ordine alfabetică" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sort. elem. în ordine alfab." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Pictogramele şi folderele aplicaţiilor vor fi sortate în ordine alfabetică. Orice personalizare pe care aţi făcut-o va fi anulată." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Adăugare Dynamic Box" @@ -451,3 +460,18 @@ msgstr "Aplicaţia %s şi toate caracteristicile asociate vor fi dezactivate. Pe msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "A fost atins numărul maxim de aplicaţii în folder (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Schimbare grilă aplicaţii" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Schimbare grilă aplicaţii" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Viz. toate pag." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stilizare" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "S-a atins numărul maxim de aplicaţii preferate (%d)." + diff --git a/res/po/ru_RU.po b/res/po/ru_RU.po index 82afe2b..0218a16 100755 --- a/res/po/ru_RU.po +++ b/res/po/ru_RU.po @@ -385,6 +385,15 @@ msgstr "Все страницы" msgid "IDS_JAVA_POP_BLANK" msgstr "Пусто" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортировать элементы по алфавиту" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сорт. элементы по алфавиту" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Значки и папки приложений будут сохранены в алфавитном порядке. Все выполненные вами настройки будут отменены." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Добавить Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s и все связанные возможности отключат msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Достигнуто максимальное число приложений в папке (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Изменить сетку приложения" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Изменение сетки приложения" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Все страницы" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Оформление" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Достигнуто максимальное число избранных приложений (%d)." + diff --git a/res/po/sk.po b/res/po/sk.po index ffdde0a..c20a33f 100755 --- a/res/po/sk.po +++ b/res/po/sk.po @@ -385,6 +385,15 @@ msgstr "Všetky stránky" msgid "IDS_JAVA_POP_BLANK" msgstr "Prázdne" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Zoradiť položky abecedne" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Abecedné zoradenie položiek" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ikony aplikácií a priečinky sa usporiadajú v abecednom poradí. Všetky prispôsobenia, ktoré ste vykonali, sa zahodia." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Pridať Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s a všetky funkcie súvisiace s ňou sa vypnú. Ak ju chcete znova zap msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Dosiahol sa maximálny počet aplikácií v priečinku (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Zmeniť mriežku aplikácií" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Zmena mriežky aplikácií" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Zobr. vš. str." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Štýly" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Dosiahol sa maximálny počet obľúbených aplikácií (%d)." + diff --git a/res/po/sl.po b/res/po/sl.po index 898bc9d..27bfcb1 100755 --- a/res/po/sl.po +++ b/res/po/sl.po @@ -385,6 +385,15 @@ msgstr "Vse strani" msgid "IDS_JAVA_POP_BLANK" msgstr "Prazno" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Razvrstitev elementov po abecedi" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Razvrstitev elem. po abecedi" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ikone in mape aplikacije bodo razvrščene po abecednem vrstnem redu. Vse prilagoditve, ki ste jih napravili, bodo zavržene." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dodaj Dynamic Box" @@ -451,3 +460,18 @@ msgstr "Aplikacija %s in vse z njo povezane funkcije bodo onemogočene. Če jo msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Doseženo je največje dovoljeno število aplikacij v mapi (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Spremeni mrežo aplikacij" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Spremenite mrežo aplikacij" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Ogled vseh str." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Ustvar-\njalec" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Doseženo je največje število priljubljenih aplikacij (%d)." + diff --git a/res/po/sr.po b/res/po/sr.po index 2849cdb..312765d 100755 --- a/res/po/sr.po +++ b/res/po/sr.po @@ -385,6 +385,15 @@ msgstr "Sve strane" msgid "IDS_JAVA_POP_BLANK" msgstr "Prazno" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sortiraj stavke abecedno" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sortiraj stavke abecedno" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ikone aplikacija i folderi će biti sortirani prema abecednom redosledu. Sva uneta prilagođavanja će biti odbačena." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dodaj Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s i sve druge funkcije s tim u vezi će biti onemogućene. Da bi ih pon msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Dostignut je maksimalan broj aplikacija u folderu (%d)." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Promena mreže aplikacije" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Promena mreže aplikacije" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Prik. sve str." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Uređivač" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Dostignut je maksimalan broj omiljenih aplikacija (%d)." + diff --git a/res/po/sv.po b/res/po/sv.po index b21c867..a02c397 100755 --- a/res/po/sv.po +++ b/res/po/sv.po @@ -385,6 +385,15 @@ msgstr "Alla sidor" msgid "IDS_JAVA_POP_BLANK" msgstr "Tom" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sortera objekt i bokstavsordning" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Sortera obj. i bokstavsordn." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Programgenvägar och mappar sorteras i bokstavsordning. Eventuella anpassningar som du har gjort kommer att raderas." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Lägg till Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s och alla relaterade funktioner kommer att inaktiveras. Aktivera det i msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Max antal tillåtna program i mappen (%d) har uppnåtts." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Ändra programrutnät" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Ändra programrutnät" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Visa alla sidor" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Designer" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Det högsta antalet favoritprogram (%d) har uppnåtts." + diff --git a/res/po/tr_TR.po b/res/po/tr_TR.po index c5c92d6..0bf3b18 100755 --- a/res/po/tr_TR.po +++ b/res/po/tr_TR.po @@ -71,7 +71,7 @@ msgid "IDS_AT_OPT_VIEW_AS" msgstr "Farklı görüntüle" msgid "IDS_AT_POP_TO_REARRANGE_PAGES_YOU_NEED_TO_CHANGE_THE_VIEW_TYPE_TO_A_CUSTOMISABLE_GRID" -msgstr "Sayfaları yeniden düzenlemek için özelleştirilebilir kılavuzun görünüm tipini değiştirmeniz gerekir." +msgstr "Sayfaları yeniden düzenlemek için özelleştirilebilir matrisin görünüm tipini değiştirmeniz gerekir." msgid "IDS_AT_POP_UNINSTALL_PS_Q" msgstr "%s kaldırılsın mı?" @@ -385,6 +385,15 @@ msgstr "Tüm sayfalar" msgid "IDS_JAVA_POP_BLANK" msgstr "Boş" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Öğeleri alfabetik olarak sırala" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Öğeleri alfabetk olrk sırala" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Uygulama simgeleri ve klasörleri alfabetik olarak sıralanacak. Yaptığınız tüm özelleştirmeler silinecek." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box ekle" @@ -451,3 +460,18 @@ msgstr "%s ve tüm ilgili özellikleri devre dışı bırakılacak. Tekrar etkin msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Klasörde maksimum uygulama sayısına (%d) ulaşıldı." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Uygulama matrisini değiştir" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Uygulama matrisini değiştir" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Tüm syflr göst" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Stilist" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Maksimum favori uygulama sayısına (%d) ulaşıldı." + diff --git a/res/po/uk.po b/res/po/uk.po index 29d63d8..0bc269a 100755 --- a/res/po/uk.po +++ b/res/po/uk.po @@ -385,6 +385,15 @@ msgstr "Всі сторінки" msgid "IDS_JAVA_POP_BLANK" msgstr "Пустий" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортув. елементи за алфавітом" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Сортування елементів за алф." + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Значки програм та папки будуть упорядковані в алфавітному порядку. Усі ваші налаштування буде скасовано." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Додати Dynamic Box" @@ -451,3 +460,18 @@ msgstr "%s і всі пов'язані з нею функції буде вим msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Досягнуто максимальної кількості програм у папці: %d." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Змінити сітку програми" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Змінити сітку програми" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Перег.усі стор." + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Оформлення" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Досягнуто максимальної кількості улюблених програм (%d)." + diff --git a/res/po/uz.po b/res/po/uz.po index b7f3d12..6f565b5 100755 --- a/res/po/uz.po +++ b/res/po/uz.po @@ -269,7 +269,7 @@ msgid "IDS_TPLATFORM_BODY_NOT_SELECTED_T_TTS" msgstr "Tanlanmagan" msgid "IDS_TPLATFORM_BODY_RADIO_BUTTON_T_TTS" -msgstr "Radio button" +msgstr "Radio tugma" msgid "IDS_TPLATFORM_BODY_SELECTED_T_TTS" msgstr "Selected" @@ -385,6 +385,15 @@ msgstr "Barcha sahifalar" msgid "IDS_JAVA_POP_BLANK" msgstr "Bo‘sh" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Alifbo tartibida saralash" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "Alifbo tartibida saralash" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "Ilova ikonacha va jildlari alifbo tartibida saralanadi. Siz kiritgan barcha o‘zgarishlar tashlab yuboriladi." + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "Dynamic Box qo‘shish" @@ -451,3 +460,18 @@ msgstr "%s va unga tegishli barcha funksiyalar o‘chiriladi. Uni yoqish uchun P msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "Jilddagi ilovalar soni maksimal miqdorga (%d) yetdi." +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "Ilova to‘rini o‘zgartirish" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "Ilova to‘rini o‘zgartirish" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "Bari shf. ko‘r" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "Uslubchi" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "Tanlangan ilovalar soni maksimal miqdorga (%d) yetdi." + diff --git a/res/po/zh_CN.po b/res/po/zh_CN.po index f9ffc42..6025bdb 100755 --- a/res/po/zh_CN.po +++ b/res/po/zh_CN.po @@ -74,7 +74,7 @@ msgid "IDS_AT_POP_TO_REARRANGE_PAGES_YOU_NEED_TO_CHANGE_THE_VIEW_TYPE_TO_A_CUSTO msgstr "若要重新排列页面,您需要将视图类型更改为可自定义网格。" msgid "IDS_AT_POP_UNINSTALL_PS_Q" -msgstr "是否卸载 %s?" +msgstr "是否卸载%s?" msgid "IDS_AT_TAB4_MINI_APPS" msgstr "迷你应用程序" @@ -116,16 +116,16 @@ msgid "IDS_HS_BODY_FAVOURITE_APPS_TTS" msgstr "常用应用程序" msgid "IDS_HS_BODY_HOME_SCREEN_WILL_BE_FORMED_WITH_UP_TO_PD_ITEMS_SELECTED_IN_THE_NEXT_SCREEN" -msgstr "主屏将由在下一屏幕中选中的多达 %d 个项目构成" +msgstr "主屏幕将由在下一屏幕中选中的最多 %d 个项目构成。" msgid "IDS_HS_BODY_IN_FAVOURITE_APPLICATIONS_TTS" msgstr "在收藏应用程序中" msgid "IDS_HS_BODY_MOVE_INTO_PS_FOLDER_TTS" -msgstr "移至 %s 文件夹。" +msgstr "移至%s文件夹。" msgid "IDS_HS_BODY_MOVING_PS_M_PROGRESS_TTS" -msgstr "移动中的 %s" +msgstr "移动中的%s" msgid "IDS_HS_BODY_NO_CONTENT" msgstr "无内容" @@ -149,7 +149,7 @@ msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" msgstr "无法载入数据。轻敲以重试。" msgid "IDS_HS_BODY_WALLPAPERS_ABB" -msgstr "墙纸" +msgstr "壁纸" msgid "IDS_HS_BUTTON_APPS" msgstr "应用程序" @@ -164,7 +164,7 @@ msgid "IDS_HS_BUTTON_HELP" msgstr "帮助" msgid "IDS_HS_BUTTON_HOME_ABB" -msgstr "主界面" +msgstr "主屏幕" msgid "IDS_HS_BUTTON_MAGAZINE_ABB" msgstr "杂志" @@ -194,16 +194,16 @@ msgid "IDS_HS_OPT_ADD_TEXT_BOX_ABB" msgstr "添加文本框" msgid "IDS_HS_OPT_CHANGE_WALLPAPER_ABB" -msgstr "更改墙纸" +msgstr "更改壁纸" msgid "IDS_HS_OPT_CREATE_FOLDER_OPT_TTS" -msgstr "创建文件夹" +msgstr "新建文件夹" msgid "IDS_HS_OPT_DELETE_FOLDER_TTS" msgstr "删除文件夹" msgid "IDS_HS_OPT_DOWNLOADED_APPS" -msgstr "已下载应用程序" +msgstr "已下载的应用程序" msgid "IDS_HS_OPT_EXTRACT_APPS_AND_DELETE_FOLDER_ABB" msgstr "提取应用程序并删除文件夹" @@ -212,10 +212,10 @@ msgid "IDS_HS_POP_DISABLE_THIS_APPLICATION_Q" msgstr "是否禁用该应用程序?" msgid "IDS_HS_POP_THE_NEW_PAGE_WILL_CONSIST_OF_THE_S_PLANNER_TASKS_AND_S_MEMO_DYNAMIC_BOXES" -msgstr "新页面将包含 S 日历、任务和 S 备忘录动态窗口" +msgstr "新页面将包含 S 日历、任务和 S 备忘录动态窗口。" msgid "IDS_HS_POP_THE_NEW_PAGE_WILL_CONSIST_OF_TWITTER_DYNAMIC_BOXES_MSG" -msgstr "新页面将包含 Twitter 动态窗口。在下一个屏幕上,选择多达 %d 个您正在关注的人的时间轴以在新页面上显示。" +msgstr "将由新页面构成 Twitter 动态窗口。请在下一个屏幕上选择要在新页面上显示的最多 %d 个您正在关注的人的时间轴。" msgid "IDS_HS_POP_THIS_FOLDER_WILL_BE_DELETED_BUT_THE_APPLICATIONS_WITHIN_IT_WILL_REMAIN_AVAILABLE_ON_YOUR_HOME_SCREEN_DELETE_THIS_FOLDER_Q" msgstr "该文件夹将被删除,但其内的应用程序将在您的主屏幕上保持可用。是否删除该文件夹?" @@ -227,7 +227,7 @@ msgid "IDS_HS_TPOP_FONT_NOT_SUPPORTED_AT_THIS_SIZE" msgstr "不支持此大小的字体" msgid "IDS_HS_TPOP_UNABLE_TO_ADD_EXTRA_LINE_DUE_TO_SPACE_RESTRICTION_ABB" -msgstr "由于空间限制,无法添加额外的行" +msgstr "由于空间限制,无法添加其他行。" msgid "IDS_SCR_BODY_1_UNREAD_ITEM" msgstr "1 个未读项目" @@ -254,7 +254,7 @@ msgid "IDS_ST_BODY_TEXT_IN_BODY_OF_POP_UP_T_TALKBACK" msgstr "提示窗口正文文本" msgid "IDS_ST_HEADER_HOME_SCREEN" -msgstr "Home screen" +msgstr "主屏幕" msgid "IDS_TTS_BODY_PAGE_MOVED_TO_P1SD_OF_P2SD" msgstr "页面已移动至 %2$d 之 %1$d。" @@ -338,7 +338,7 @@ msgid "IDS_COM_BODY_INTERNET" msgstr "互联网" msgid "IDS_MEMO_HEADER_PD_SELECTED_ABB2" -msgstr "%d 已选中" +msgstr "已选择 %d" msgid "IDS_ST_SK_NEXT" msgstr "下一步" @@ -365,7 +365,7 @@ msgid "IDS_HS_OPT_SHOW_DISABLED_APPLICATIONS_ABB" msgstr "显示已禁用的应用程序" msgid "IDS_HS_POP_PS_CANNOT_BE_UNINSTALLED_IT_WILL_BE_DISABLED_INSTEAD" -msgstr "%s 无法卸载。将改为禁用。" +msgstr "%s无法卸载。将改为禁用。" msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "将隐藏 1 个项目。" @@ -377,7 +377,7 @@ msgid "IDS_MSG_HEADER_UNABLE_TO_ADD" msgstr "无法添加" msgid "IDS_HS_OPT_HOME_BOXES" -msgstr "主页框" +msgstr "主屏幕方框" msgid "IDS_HS_OPT_ALL_PAGES" msgstr "全部页面" @@ -385,6 +385,15 @@ msgstr "全部页面" msgid "IDS_JAVA_POP_BLANK" msgstr "无内容" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "按字母顺序排列" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "按字母顺序排列" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "将按字母顺序排列应用程序图标和文件夹。将放弃您做的所有自定义设置。" + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "添加 Dynamic Box" @@ -446,8 +455,23 @@ msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" msgstr "未安装应用程序。" msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" -msgstr "将停用 %s 及所有相关功能。若要重新启用,请前往设定 > 应用程序管理器。" +msgstr "将停用%s及所有相关功能。若要重新启用,请进入【设置】 > 【应用程序管理器】。" msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "已达到文件夹中的最大应用程序数 (%d)" +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "更改应用程序网格" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "更改应用程序网格" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "查看所有页面" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "风格设计" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "已达到最大收藏应用程序数 (%d)" + diff --git a/res/po/zh_HK.po b/res/po/zh_HK.po index e426519..a754416 100755 --- a/res/po/zh_HK.po +++ b/res/po/zh_HK.po @@ -74,7 +74,7 @@ msgid "IDS_AT_POP_TO_REARRANGE_PAGES_YOU_NEED_TO_CHANGE_THE_VIEW_TYPE_TO_A_CUSTO msgstr "若要重新安排頁面,您需要將檢視類型變更為可自訂網格。" msgid "IDS_AT_POP_UNINSTALL_PS_Q" -msgstr "解除安裝 %s 嗎?" +msgstr "解除安裝%s嗎?" msgid "IDS_AT_TAB4_MINI_APPS" msgstr "迷你應用程式" @@ -122,10 +122,10 @@ msgid "IDS_HS_BODY_IN_FAVOURITE_APPLICATIONS_TTS" msgstr "在我的最愛應用程式中" msgid "IDS_HS_BODY_MOVE_INTO_PS_FOLDER_TTS" -msgstr "移至 %s 資料夾。" +msgstr "移至%s資料夾。" msgid "IDS_HS_BODY_MOVING_PS_M_PROGRESS_TTS" -msgstr "正在移動 %s" +msgstr "正在移動%s" msgid "IDS_HS_BODY_NO_CONTENT" msgstr "無內容" @@ -365,7 +365,7 @@ msgid "IDS_HS_OPT_SHOW_DISABLED_APPLICATIONS_ABB" msgstr "顯示已停用的應用程式" msgid "IDS_HS_POP_PS_CANNOT_BE_UNINSTALLED_IT_WILL_BE_DISABLED_INSTEAD" -msgstr "%s 無法解除安裝。將改為停用。" +msgstr "%s無法解除安裝。將改為停用。" msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "1 個項目將被隱藏。" @@ -385,6 +385,15 @@ msgstr "全部頁面" msgid "IDS_JAVA_POP_BLANK" msgstr "空白" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "按字母排序項目" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "按字母排序項目" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "應用程式圖示和資料夾將按字母表順序排列。您所做的任何自訂設定將被捨棄。" + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "加入 Dynamic Box" @@ -404,7 +413,7 @@ msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" msgstr "按名稱 (A-Z)" msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" -msgstr "將解除安裝 %s。" +msgstr "將解除安裝%s。" msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" msgstr "無法重新排列按名稱 (A-Z) 排序的圖示。" @@ -446,8 +455,23 @@ msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" msgstr "未安裝應用程式。" msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" -msgstr "將停用 %s 及所有相關功能。若要重新啟用,請前往設定 > 應用程式管理員。" +msgstr "將停用%s及所有相關功能。若要重新啟用,請前往 [設定] > [應用程式管理員]。" msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "已達資料夾中的應用程式數量上限 (%d)。" +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "變更應用程式網格" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "變更應用程式網格" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "檢視所有頁面" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "樣式工具" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "已達到我的最愛應用程式數量上限 (%d)。" + diff --git a/res/po/zh_TW.po b/res/po/zh_TW.po index 1aed13c..2cec925 100755 --- a/res/po/zh_TW.po +++ b/res/po/zh_TW.po @@ -23,7 +23,7 @@ msgid "IDS_MF_OPT_DELETEFOLDER" msgstr "刪除資料夾" msgid "IDS_MF_POP_ERR_FOLDER_NAME_EMPTY" -msgstr "輸入資料夾名稱。" +msgstr "輸入資料夾名稱" msgid "IDS_PB_SK_CREATE_ABB" msgstr "建立" @@ -74,7 +74,7 @@ msgid "IDS_AT_POP_TO_REARRANGE_PAGES_YOU_NEED_TO_CHANGE_THE_VIEW_TYPE_TO_A_CUSTO msgstr "若要重新安排頁面,需將檢視類型變更為可自訂網格。" msgid "IDS_AT_POP_UNINSTALL_PS_Q" -msgstr "解除安裝 %s 嗎?" +msgstr "解除安裝%s嗎?" msgid "IDS_AT_TAB4_MINI_APPS" msgstr "迷你應用程式" @@ -122,10 +122,10 @@ msgid "IDS_HS_BODY_IN_FAVOURITE_APPLICATIONS_TTS" msgstr "在我最愛的應用程式中" msgid "IDS_HS_BODY_MOVE_INTO_PS_FOLDER_TTS" -msgstr "移至 %s 資料夾。" +msgstr "移至%s資料夾。" msgid "IDS_HS_BODY_MOVING_PS_M_PROGRESS_TTS" -msgstr "正在移動 %s" +msgstr "正在移動%s" msgid "IDS_HS_BODY_NO_CONTENT" msgstr "無內容" @@ -365,7 +365,7 @@ msgid "IDS_HS_OPT_SHOW_DISABLED_APPLICATIONS_ABB" msgstr "顯示停用的應用程式" msgid "IDS_HS_POP_PS_CANNOT_BE_UNINSTALLED_IT_WILL_BE_DISABLED_INSTEAD" -msgstr "%s 無法解除安裝。將改為停用 。" +msgstr "%s無法解除安裝。將改為停用。" msgid "IDS_HS_POP_1_ITEM_WILL_BE_HIDDEN" msgstr "將隱藏 1 個項目。" @@ -385,6 +385,15 @@ msgstr "所有頁面" msgid "IDS_JAVA_POP_BLANK" msgstr "空白" +msgid "IDS_HS_OPT_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "依英文字母排序項目" + +msgid "IDS_HS_HEADER_SORT_ITEMS_ALPHABETICALLY_ABB" +msgstr "依英文字母排序項目" + +msgid "IDS_HS_POP_APP_ICONS_AND_FOLDERS_WILL_BE_SORTED_INTO_ALPHABETICAL_ORDER_ANY_CUSTOMISATIONS_YOU_HAVE_MADE_WILL_BE_DISCARDED" +msgstr "應用程式圖示與資料夾將依字母順序重新排列。任何已執行的自訂設定都將被捨棄。" + msgid "IDS_HS_OPT_ADD_DYNAMIC_BOX" msgstr "新增 Dynamic Box" @@ -404,7 +413,7 @@ msgid "IDS_HS_OPT_BY_NAME_HA_Z_ABB" msgstr "依名稱 (A-Z)" msgid "IDS_HS_POP_PS_WILL_BE_UNINSTALLED" -msgstr "將會移除 %s。" +msgstr "將會移除%s。" msgid "IDS_HS_TPOP_UNABLE_TO_REARRANGE_ICONS_SORTED_BY_NAME_HA_Z" msgstr "無法依名稱 (A-Z) 排序來重新排列圖示。" @@ -446,8 +455,23 @@ msgid "IDS_HS_POP_APPLICATION_NOT_INSTALLED" msgstr "未安裝應用程式。" msgid "IDS_HS_POP_PS_AND_ALL_THE_FEATURES_RELATED_TO_IT_WILL_BE_DISABLED_TO_ENABLE_IT_AGAIN_GO_TO_SETTINGS_APPLICATION_MANAGER" -msgstr "將停用 %s 及所有相關功能。若要重新啟用,請前往設定 > 應用程式管理員。" +msgstr "將停用%s及所有相關功能。若要重新啟用,請前往 [設定] > [應用程式管理員]。" msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED" msgstr "已達資料夾中的應用程式數量上限 (%d)。" +msgid "IDS_HS_OPT_CHANGE_APP_GRID_ABB" +msgstr "變更應用程式網格" + +msgid "IDS_HS_HEADER_CHANGE_APP_GRID_ABB" +msgstr "變更應用程式網格" + +msgid "IDS_HS_OPT_VIEW_ALL_PAGES_ABB" +msgstr "檢視所有頁面" + +msgid "IDS_DS_BUTTON2_STYLER" +msgstr "樣式工具" + +msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_FAVOURITE_APPS_HPD_REACHED" +msgstr "已達我最愛的應用程式數量上限 (%d)。" + diff --git a/src/add_viewer/add_viewer.c b/src/add_viewer/add_viewer.c deleted file mode 100644 index 3975b1b..0000000 --- a/src/add_viewer/add_viewer.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "util.h" - -#include "add_viewer/add_viewer.h" -#include "add_viewer/list_view.h" -#include "add_viewer/widget.h" - -static struct { - Evas_Object *win; - Evas_Object *conformant; - Evas_Object *layout; - Evas_Object *naviframe; - Evas_Object *genlist; - - Elm_Theme *theme; - Elm_Object_Item *navi_item; - -} s_info = { - .win = NULL, - .conformant = NULL, - .layout = NULL, - .naviframe = NULL, - .genlist = NULL, - - .theme = NULL, - .navi_item = NULL, -}; - -static void __add_viewer_window_del_cb(void *data, Evas_Object* obj, void* event_info); -static Elm_Theme *__add_viewer_create_theme(void); -static Evas_Object *__add_viewer_create_conformant(void); -static Evas_Object *__add_viewer_create_layout(); -static Evas_Object *__add_viewer_create_naviframe(); - -Elm_Theme *add_viewer_get_main_theme(void) -{ - return s_info.theme; -} - -Evas_Object *add_viewer_get_layout(void) -{ - return s_info.layout; -} - -void add_viewer_window_create(Evas_Coord w, Evas_Coord h) -{ - int ret = 0; - - ret = widget_init(); - if (ret != 0) { - LOGE("Can not init widget list"); - return; - } - - s_info.win = elm_win_add(NULL, "add_viewer", ELM_WIN_BASIC); - if (!s_info.win) { - LOGE("Failed to create a new window"); - return; - } - - elm_win_alpha_set(s_info.win, EINA_TRUE); - elm_win_autodel_set(s_info.win, EINA_TRUE); - evas_object_smart_callback_add(s_info.win, "delete,request", __add_viewer_window_del_cb, NULL); - - s_info.theme = __add_viewer_create_theme(); - s_info.conformant = __add_viewer_create_conformant(); - s_info.layout = __add_viewer_create_layout(); - s_info.naviframe = __add_viewer_create_naviframe(); - - s_info.navi_item = list_view_create_content(s_info.naviframe, s_info.genlist); - - elm_object_signal_emit(s_info.layout, "display,normal", "container"); - - elm_win_indicator_mode_set(s_info.win, ELM_WIN_INDICATOR_SHOW); - elm_win_indicator_opacity_set(s_info.win, ELM_WIN_INDICATOR_OPAQUE); - elm_win_resize_object_add(s_info.win, s_info.conformant); - elm_win_conformant_set(s_info.win, EINA_TRUE); - evas_object_resize(s_info.win, w, h); - - evas_object_show(s_info.naviframe); - evas_object_show(s_info.layout); - evas_object_show(s_info.conformant); - - - evas_object_show(s_info.win); -} - -void add_viewer_window_delete(void) -{ - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - evas_object_del(s_info.win); - widget_fini(); -} - -static void __add_viewer_window_del_cb(void *data, Evas_Object* obj, void* event_info) -{ - evas_object_del(s_info.win); -} - -static Elm_Theme *__add_viewer_create_theme(void) -{ - Elm_Theme *theme = elm_theme_new(); - if (!theme) { - LOGE("Failed to create theme\n"); - return NULL; } - - elm_theme_ref_set(theme, NULL); - elm_theme_extension_add(theme, util_get_res_file_path(EDJE_DIR"/preview.edj")); - - return theme; -} - -static Evas_Object *__add_viewer_create_conformant(void) -{ - Evas_Object *conformant; - Evas_Object *bg; - - conformant = elm_conformant_add(s_info.win); - if (!conformant) { - LOGE("Failed to create a conformant\n"); - return NULL; - } - - evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - bg = elm_bg_add(conformant); - if (bg) { - elm_object_style_set(bg, "indicator/headerbg"); - elm_object_part_content_set(conformant, "elm.swallow.indicator_bg", bg); - evas_object_show(bg); - } else { - LOGE("Failed to create a BG object\n"); - } - - return conformant; -} - -static Evas_Object *__add_viewer_create_layout() -{ - Evas_Object *layout; - char edj_path[PATH_MAX] = {0, }; - - if (!s_info.conformant) { - return NULL; - } - - layout = elm_layout_add(s_info.conformant); - if (!layout) { - return NULL; - } - - snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/preview.edj")); - if (elm_layout_file_set(layout, edj_path, "conformant,frame") != EINA_TRUE) { - evas_object_del(layout); - return NULL; - } - - elm_object_part_content_set(s_info.conformant, "elm.swallow.content", layout); - - return layout; -} - -static Evas_Object *__add_viewer_create_naviframe() -{ - Evas_Object *naviframe; - - naviframe = elm_naviframe_add(s_info.conformant); - if (!naviframe) { - return NULL; - } - - elm_naviframe_content_preserve_on_pop_set(naviframe, EINA_TRUE); - elm_object_part_content_set(s_info.layout, "content", naviframe); - - return naviframe; -} - diff --git a/src/add_viewer/list_view.c b/src/add_viewer/list_view.c deleted file mode 100644 index ff3aaaa..0000000 --- a/src/add_viewer/list_view.c +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - - -#include "util.h" -#include "conf.h" - -#include "add_viewer/add_viewer.h" -#include "add_viewer/list_view.h" -#include "add_viewer/view.h" -#include "add_viewer/widget.h" - -static Evas_Object *__list_view_create_list(Evas_Object *content); -static void __list_view_genlist_theme_set(Evas_Object *genlist); -static char *__gl_text_get_cb(void *data, Evas_Object *obj, const char *part); -static Evas_Object *__gl_content_get_cb (void *data, Evas_Object *obj, const char *part); -static Evas_Object *__list_view_widget_box_create(Evas_Object *obj, widget_t *widget); -static Evas_Object *__list_view_preview_box_create(Evas_Object *main_box, widget_t *widget, preview_t *preview); -static void __list_view_item_realized_cb(void *data, Evas_Object *obj, void *event_info); -static void __list_view_preview_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); - -Evas_Object *list_view_create_content(Evas_Object *naviframe, Evas_Object *genlist) -{ - Elm_Object_Item *item; - Evas_Object *content; - - content = view_content_create(naviframe, NULL); - if (!content) { - return NULL; - } - - genlist = __list_view_create_list(content); - elm_object_part_content_set(content, "content", genlist); - - item = elm_naviframe_item_push(naviframe, _("IDS_HS_HEADER_ADD_WIDGET"), NULL, NULL, content, NULL); - view_content_show(content); - view_content_show_index(content); - - if (!item) { - LOGD("Failed to push an item\n"); - return NULL; - } - - return content; -} - -static Evas_Object *__list_view_create_list(Evas_Object *content) -{ - Elm_Genlist_Item_Class *itc_widget; - Evas_Object *genlist = NULL; - Elm_Object_Item *widget_gl_item = NULL; - Eina_List *widget_list = NULL, *l = NULL; - widget_t *widget = NULL; - - genlist = elm_genlist_add(content); - if (!genlist) { - LOGE("Failed to create a genlist\n"); - return NULL; - } - - elm_scroller_bounce_set(genlist, EINA_FALSE, EINA_TRUE); - elm_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_NONE); - - __list_view_genlist_theme_set(genlist); - - itc_widget = elm_genlist_item_class_new(); - itc_widget->item_style = "widget,leaf"; - itc_widget->func.text_get = __gl_text_get_cb; - itc_widget->func.content_get = __gl_content_get_cb; - - widget_list = widget_get_widget_list(); - if (!widget_list) { - LOGE("Can not get widget list"); - return NULL; - } - - LOGD("Widget list length: %d", eina_list_count(widget_list)); - EINA_LIST_FOREACH(widget_list, l, widget) { - LOGD("Genlist append"); - widget_gl_item = elm_genlist_item_append(genlist, itc_widget, widget, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); - widget->genlist_item = widget_gl_item; - } - - evas_object_smart_callback_add(genlist, "realized", __list_view_item_realized_cb, NULL); - - elm_genlist_item_class_free(itc_widget); - - return genlist; -} - -static void __list_view_genlist_theme_set(Evas_Object *genlist) -{ - Elm_Theme *main_theme; - - main_theme = add_viewer_get_main_theme(); - if (main_theme) - elm_object_theme_set(genlist, main_theme); -} - -static char *__gl_text_get_cb(void *data, Evas_Object *obj, const char *part) -{ - widget_t *widget = data; - - if (!widget || !part) - return NULL; - - if(!strcmp(part, "elm.text")) - return strdup(widget->label); - - return strdup("widget name not found"); -} - -static Evas_Object *__gl_content_get_cb(void *data, Evas_Object *obj, const char *part) -{ - LOGD("Part: %s", part); - - Evas_Object *main_box = NULL; - Eina_List *widget_list = NULL; - widget_t *widget = data; - - if (!widget || !part) - return NULL; - - if (!strcmp(part, "bg")) { - return NULL; - } - - widget_list = widget_get_widget_list(); - if (!widget_list) { - LOGE("Can not get widget list"); - return NULL; - } - - main_box = __list_view_widget_box_create(obj, widget); - if (!main_box) { - LOGE("Can not create preview box"); - return NULL; - } - - return main_box; -} - -static Evas_Object *__list_view_widget_box_create(Evas_Object *obj, widget_t *widget) -{ - LOGD("Create box for %s", widget->widget_id); - - Evas_Object *main_box = NULL; - Evas_Object *mid_box = NULL; - Evas_Object *small_box = NULL; - Evas_Object *preview_layout = NULL; - Eina_List *l; - Eina_List *children; - preview_t *preview; - int tmp = 0; - int h = 0; - int filled = 0; - int height = 0; - - main_box = elm_box_add(obj); - if (!main_box) { - LOGE("Can not create preview box"); - return NULL; - } - - elm_box_horizontal_set(main_box, EINA_FALSE); - elm_box_homogeneous_set(main_box, EINA_FALSE); - elm_box_padding_set(main_box, 0, 30); - elm_box_align_set(main_box, 0.0, 0.0); - - EINA_LIST_FOREACH(widget->preview_list, l, preview) { - - preview_layout = __list_view_preview_box_create(main_box, widget, preview); - if(!preview_layout) { - LOGE("Can not create preview layout"); - return NULL; - } - - elm_object_part_text_set(preview_layout, "text", widget->label); - - //elm_box_pack_end(main_box, preview_layout); - - evas_object_size_hint_min_get(preview_layout, NULL, &h); - if (h <= 0) { - LOGE("Preview layout height is unknown"); - continue; - } - - evas_object_show(preview_layout); - - switch (preview->type) { - case WIDGET_SIZE_TYPE_4x6: - case WIDGET_SIZE_TYPE_4x5: - case WIDGET_SIZE_TYPE_4x4: - case WIDGET_SIZE_TYPE_4x3: - case WIDGET_SIZE_TYPE_4x2: - case WIDGET_SIZE_TYPE_4x1: - if (!mid_box) { - mid_box = elm_box_add(main_box); - if (!mid_box) { - LOGE("Failed to add mid box\n"); - return NULL; - } - - elm_box_align_set(mid_box, 0.0, 0.0); - elm_box_horizontal_set(mid_box, EINA_TRUE); - elm_box_homogeneous_set(mid_box, EINA_FALSE); - elm_box_padding_set(mid_box, 12, 0); - evas_object_size_hint_align_set(mid_box, 0.0, 0.0); - filled = 0; - } - - if (tmp < h) { - tmp = h; - } - filled++; - evas_object_size_hint_align_set(preview_layout, 0.0, 0.0); - elm_box_pack_end(mid_box, preview_layout); - - if (filled == 2) { - elm_box_pack_end(main_box, mid_box); - evas_object_show(mid_box); - mid_box = NULL; - height += (tmp + 30); - tmp = 0; - } - break; - case WIDGET_SIZE_TYPE_2x2: - case WIDGET_SIZE_TYPE_2x1: - case WIDGET_SIZE_TYPE_1x1: - if (mid_box) { - elm_box_pack_end(main_box, mid_box); - evas_object_show(mid_box); - height += (h + 30); - filled = 0; - tmp = 0; - } - - if (!small_box) { - small_box = elm_box_add(main_box); - if (!small_box) { - LOGD("Failed to add small box\n"); - evas_object_del(preview_layout); - evas_object_del(main_box); - return NULL; - } - - elm_box_align_set(small_box, 0.0, 0.0); - elm_box_horizontal_set(small_box, EINA_TRUE); - elm_box_homogeneous_set(small_box, EINA_FALSE); - elm_box_padding_set(small_box, 12, 0); - evas_object_size_hint_align_set(small_box, 0.0, 0.0); - filled = 0; - } - - if (tmp < h) { - tmp = h; - } - - filled++; - evas_object_size_hint_align_set(preview_layout, 0.0, 0.0); - elm_box_pack_end(small_box, preview_layout); - - if (filled == 3) { - evas_object_show(small_box); - elm_box_pack_end(main_box, small_box); - height += (tmp + 30); - small_box = NULL; - tmp = 0; - } - break; - return NULL; - default: - LOGE("Unsupported size\n"); - break; - return NULL; - } - - } - - if (small_box) { - evas_object_show(small_box); - elm_box_pack_end(main_box, small_box); - height += (tmp + 30); - } else if (mid_box) { - elm_box_pack_end(main_box, mid_box); - evas_object_show(mid_box); - height += (tmp + 30); - } - - children = elm_box_children_get(main_box); - if (eina_list_count(children) == 0) { - evas_object_del(main_box); - LOGE("Preview is not exists"); - main_box = NULL; - } else { - height += 20; - - evas_object_size_hint_min_set(main_box, 0, height); - evas_object_size_hint_max_set(main_box, 0, height); - evas_object_show(main_box); - } - - eina_list_free(children); - - return main_box; -} - -static Evas_Object *__list_view_preview_box_create(Evas_Object *main_box, widget_t *widget, preview_t *preview) -{ - LOGD("Create preview: type->%d path->%s", preview->type, preview->path); - - Evas_Object *preview_layout = NULL; - Evas_Object *preview_img = NULL; - char *size_str = NULL; - int w = 0, h = 0; - int ret = 0; - - if (!preview || !preview->path || !preview->type) { - LOGE("Path to preview image is empty"); - return NULL; - } - - switch (preview->type) { - case WIDGET_SIZE_TYPE_1x1: - size_str = "preview,1x1"; - break; - case WIDGET_SIZE_TYPE_2x1: - size_str = "preview,2x1"; - break; - case WIDGET_SIZE_TYPE_2x2: - size_str = "preview,2x2"; - break; - case WIDGET_SIZE_TYPE_4x1: - size_str = "preview,4x1"; - break; - case WIDGET_SIZE_TYPE_4x2: - size_str = "preview,4x2"; - break; - case WIDGET_SIZE_TYPE_4x3: - size_str = "preview,4x3"; - break; - case WIDGET_SIZE_TYPE_4x4: - size_str = "preview,4x4"; - break; - case WIDGET_SIZE_TYPE_4x5: - size_str = "preview,4x5"; - break; - case WIDGET_SIZE_TYPE_4x6: - size_str = "preview,4x6"; - break; - case WIDGET_SIZE_TYPE_EASY_1x1: - size_str = "easy,preview,1x1"; - break; - case WIDGET_SIZE_TYPE_EASY_3x1: - size_str = "easy,preview,3x1"; - break; - case WIDGET_SIZE_TYPE_EASY_3x3: - size_str = "easy,preview,3x3"; - break; - default: - return NULL; - } - - preview_layout = elm_layout_add(main_box); - if (!preview_layout) { - LOGE("Can not create preview layout"); - return NULL; - } - - LOGD("Widget size_str: %s", size_str); - ret = elm_layout_file_set(preview_layout, util_get_res_file_path(EDJE_DIR"/preview.edj"), size_str); - if (ret != EINA_TRUE) { - LOGE("Can not set preview layout"); - evas_object_del(preview_layout); - return NULL; - } - - preview_img = evas_object_image_filled_add(evas_object_evas_get(preview_layout)); - if (!preview_img) { - LOGE("Can not create image object"); - evas_object_del(preview_layout); - return NULL; - } - - int *preview_type = calloc(1, sizeof(int)); - if (!preview_type) { - LOGE("Can not allocate memory for additional data"); - evas_object_del(preview_img); - evas_object_del(preview_layout); - return NULL; - } - - *preview_type = preview->type; - - evas_object_data_set(preview_layout, "preview_type", preview_type); - evas_object_event_callback_add(preview_layout, EVAS_CALLBACK_MOUSE_UP, __list_view_preview_clicked_cb, widget); - - evas_object_image_file_set(preview_img, preview->path, NULL); - evas_object_image_size_get(preview_img, &w, &h); - evas_object_image_fill_set(preview_img, 0, 0, w, h); - - edje_object_size_min_calc(elm_layout_edje_get(preview_layout), &w, &h); - evas_object_size_hint_min_set(preview_layout, w, h); - - elm_object_part_content_set(preview_layout, "preview", preview_img); - - return preview_layout; -} - -static void __list_view_item_realized_cb(void *data, Evas_Object *obj, void *event_info) -{ - LOGD("item realized_cb"); - - char ch[2] = {0, }; - int ret = 0; - Elm_Object_Item *item = event_info; - widget_t *widget = NULL; - - - widget = (widget_t *)elm_object_item_data_get(item); - - LOGD("item data: %s", widget->widget_id); - ch[0] = widget->widget_id[0]; - - if (strlen(ch) == 0) { - LOGE("Can not get first char of widget name"); - return; - } - - ret = view_index_set_index(ch); - if (ret != 0) - LOGE("Can not set selected index item"); -} - -static void __list_view_preview_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - LOGD("Preview clicked"); - - widget_t *widget = NULL; - int w = 0, h = 0; - int ret = -1; - int *size = NULL; - shortcut_widget_size_e size_type; - - size = evas_object_data_del(obj, "preview_type"); - if (*size == WIDGET_SIZE_TYPE_UNKNOWN) { - LOGE("Can not get widgets size type"); - return; - } - - widget = (widget_t *)data; - if (!widget) { - LOGE("Can not get widget"); - return; - } - - - ret = widget_service_get_size(*size, &w, &h); - if (ret != 0) { - LOGE("Can not get widget size"); - return; - } - - switch (*size) { - case WIDGET_SIZE_TYPE_1x1: - size_type = WIDGET_SIZE_1x1; - break; - case WIDGET_SIZE_TYPE_2x1: - size_type = WIDGET_SIZE_2x1; - break; - case WIDGET_SIZE_TYPE_2x2: - size_type = WIDGET_SIZE_2x2; - break; - case WIDGET_SIZE_TYPE_4x1: - size_type = WIDGET_SIZE_4x1; - break; - case WIDGET_SIZE_TYPE_4x2: - size_type = WIDGET_SIZE_4x2; - break; - case WIDGET_SIZE_TYPE_4x3: - size_type = WIDGET_SIZE_4x3; - break; - case WIDGET_SIZE_TYPE_4x4: - size_type = WIDGET_SIZE_4x4; - break; - case WIDGET_SIZE_TYPE_4x5: - size_type = WIDGET_SIZE_4x5; - break; - case WIDGET_SIZE_TYPE_4x6: - size_type = WIDGET_SIZE_4x6; - break; - case WIDGET_SIZE_TYPE_EASY_1x1: - size_type = WIDGET_SIZE_EASY_1x1; - break; - case WIDGET_SIZE_TYPE_EASY_3x1: - size_type = WIDGET_SIZE_EASY_3x1; - break; - case WIDGET_SIZE_TYPE_EASY_3x3: - size_type = WIDGET_SIZE_EASY_3x3; - break; - default: - LOGE("Invalid size type\n"); - free(size); - return; - } - - ret = shortcut_add_to_home_widget(widget->widget_id, size_type, widget->widget_id, NULL, -1.0f, 1, NULL, NULL); - if (ret != WIDGET_ERROR_NONE) - LOGE("ERROR: %s", get_error_message(ret)); - - free(size); - - add_viewer_window_delete(); -} - diff --git a/src/add_viewer/view.c b/src/add_viewer/view.c deleted file mode 100644 index f5450b3..0000000 --- a/src/add_viewer/view.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "conf.h" -#include "util.h" - -#include "add_viewer/add_viewer.h" -#include "add_viewer/widget.h" -#include "add_viewer/view.h" - -static Evas_Object *__index_create(Evas_Object *layout, void *data); -static void __view_index_cb(void *data, Evas_Object *obj, void *event_info); -static int __view_compare_widget_idx(const void *data1, const void *data2); - -static struct { - Evas_Object *index; -} s_info = { - .index = NULL -}; - -Evas_Object *view_content_create(Evas_Object *frame, void *data) -{ - Evas_Object *layout; - - layout = elm_layout_add(frame); - if (!layout) - return NULL; - - if (elm_layout_file_set(layout, util_get_res_file_path(EDJE_DIR"/preview.edj"), "content,frame") != EINA_TRUE) { - LOGE("Can not set layout file"); - evas_object_del(layout); - return NULL; - } - - s_info.index = __index_create(layout, data); - if (!s_info.index) { - evas_object_del(layout); - return NULL; - } - elm_object_part_content_set(layout, "index", s_info.index); - - return layout; -} - -void view_content_show(Evas_Object *layout) -{ - if (/*model_is_easy_mode()*/0) { - elm_object_signal_emit(layout, "display,easy", "container"); - } else { - elm_object_signal_emit(layout, "display,normal", "container"); - } -} - -void view_content_show_index(Evas_Object *layout) -{ - if (/*!model_is_easy_mode()*/1) { - elm_object_signal_emit(layout, "display,index", "container"); - } -} - -Evas_Object *view_get_index(void) -{ - return s_info.index; -} - -int view_index_set_index(const char *idx) -{ - Elm_Index_Item *item = NULL; - - LOGD("Find item with idx: %s", idx); - - item = elm_index_item_find(s_info.index, idx); - if(!item) - { - LOGE("Can not find index item"); - return 1; - } - elm_index_item_selected_set(item, EINA_TRUE); - - return 0; -} - -static Evas_Object *__index_create(Evas_Object *layout, void *data) -{ - Evas_Object *index; - const char *idx_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - char ch[2] = {0, }; - - index = elm_index_add(layout); - elm_index_autohide_disabled_set(index, EINA_TRUE); - elm_index_omit_enabled_set(index, EINA_TRUE); - elm_index_item_append(index, "#", NULL, NULL); - - int i; - for (i = 0; i < strlen(idx_str); ++i) - { - ch[0] = idx_str[i]; - ch[1] = '\0'; - elm_index_item_append(index, ch, __view_index_cb, &ch[0]); - } - - elm_index_level_go(index, 0); - - return index; -} - -static void __view_index_cb(void *data, Evas_Object *obj, void *event_info) -{ - char *idx_str = (char *)data; - Eina_List *widget_list = NULL; - widget_t *widget = NULL; - - widget_list = widget_get_widget_list(); - if (!widget_list) { - LOGE("Can not get widget list"); - return; - } - - widget = eina_list_search_unsorted(widget_list, __view_compare_widget_idx, idx_str); - if (!widget) { - LOGE("Can not find widget"); - return; - } - - elm_genlist_item_bring_in(widget->genlist_item, ELM_GENLIST_ITEM_SCROLLTO_TOP); - -} - -static int __view_compare_widget_idx(const void *data1, const void *data2) -{ - widget_t *w = (widget_t *)data1; - char *idx_str = (char *)data2; - - char c1 = 0; - char c2 = 0; - - c1 = tolower(idx_str[0]); - c2 = tolower(w->widget_id[0]); - - LOGD("Compare: %c == %c in %s, %s", c1, c2, idx_str, w->widget_id); - - if(c1 < c2) return -1; - else if(c1 > c2) return 1; - else return 0; - -} diff --git a/src/add_viewer/widget.c b/src/add_viewer/widget.c deleted file mode 100755 index 69d8556..0000000 --- a/src/add_viewer/widget.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include -#include - -#include "util.h" - -#include "add_viewer/widget.h" - -static Eina_List *widget_list; - -static int __widget_list_cb(const char *appid, const char *lbid, int is_prime, void *data); -static int __widget_list_widget_append(const char *appid, const char *widget_id, void *data); -static void __widget_list_widget_remove(widget_t *widget); -static void __widget_list_delete(void); -static int __widget_compare_widget_id_cb(const void *data1, const void *data2); - -int widget_init(void) -{ - - int ret = 0; - - ret = widget_service_get_widget_list(__widget_list_cb, NULL); - LOGD("ERROR: %s", get_error_message(ret)); - if (ret < 0 || widget_list == NULL) { - LOGE("Can not create widget list, ret: %d", ret); - return 1; - } - - return 0; -} - -void widget_fini(void) -{ - __widget_list_delete(); -} - -Eina_List *widget_get_widget_list(void) -{ - return widget_list; -} - -Eina_List *widget_get_widget_preview_list(widget_t *widget) -{ - return widget->preview_list; -} - -static int __widget_list_cb(const char *app_id, const char *widget_id, int is_prime, void *data) { - LOGD("Widget list cb, app id = %s, widget id = %s", app_id, widget_id); - return __widget_list_widget_append(app_id, widget_id, data); -} - -static int __widget_compare_widget_id_cb(const void *data1, const void *data2) -{ - int res = 0; - widget_t *w1 = (widget_t *)data1; - widget_t *w2 = (widget_t *)data2; - - res = strcmp(w1->label, w2->label); - - if (res < 0) return -1; - else if (res > 0) return 1; - else return 0; -} - -static void __widget_list_delete(void) -{ - Eina_List *l; - widget_t *widget; - - EINA_LIST_FOREACH(widget_list, l, widget) - __widget_list_widget_remove(widget); - - eina_list_free(widget_list); - widget_list = NULL; -} - -static int __widget_list_widget_append(const char *appid, const char *widget_id, void *data) -{ - LOGD("App id: %s", appid); - LOGD("Widget id: %s", widget_id); - - widget_t *widget = NULL; - preview_t *widget_preview_type = NULL; - - int *type = NULL; - int types_count = 0; - int ret = WIDGET_ERROR_NONE; - -/* - if (widget_service_get_nodisplay(widget_id)) { - LOGE("Widget should not be displayed"); - return WIDGET_ERROR_NONE; - } -*/ - ret = widget_service_get_supported_size_types(widget_id, &types_count, &type); - if (ret != WIDGET_ERROR_NONE || types_count <= 0) { - LOGE("Can not get widgets supported size types"); - return WIDGET_ERROR_FAULT; } - - widget = calloc(1, sizeof(widget_t)); - if (!widget) { - LOGE("Can not allocate memory for list item"); - return WIDGET_ERROR_FAULT; - } - - int i; - for (i = 0; i < types_count; ++i) { - - widget_preview_type = calloc(1, sizeof(preview_t)); - if (!widget_preview_type) { - LOGE("Can not allocate memory for list item preview type"); - __widget_list_delete(); - return WIDGET_ERROR_FAULT; - } - - widget_preview_type->path = widget_service_get_preview_image_path(widget_id, type[i]); - if(!widget_preview_type->path) { - free(widget_preview_type); - continue; - } - - widget_preview_type->type = type[i]; - - widget->size_types |= type[i]; - widget->preview_list = eina_list_append(widget->preview_list, widget_preview_type); - } - - widget->size_types_count = types_count; - widget->app_id = strdup(appid); - widget->widget_id = strdup(widget_id); - widget->label = widget_service_get_name(widget->widget_id, NULL); - if (!widget->label || strlen(widget->label) == 0) - widget->label = strdup(widget_id); - - widget_list = eina_list_sorted_insert(widget_list, __widget_compare_widget_id_cb, widget); - //widget_list = eina_list_append(widget_list, widget); - - free(type); - - return WIDGET_ERROR_NONE; -} - -static void __widget_list_widget_remove(widget_t *widget) -{ - Eina_List *l; - preview_t *preview; - - EINA_LIST_FOREACH(widget->preview_list, l, preview) { - free(preview->path); - free(preview); - } - - eina_list_free(widget->preview_list); - free(widget->app_id); - free(widget->widget_id); - free(widget->label); - free(widget); -} - - diff --git a/src/add_widget_viewer/add_widget_data.c b/src/add_widget_viewer/add_widget_data.c new file mode 100755 index 0000000..eaff0bf --- /dev/null +++ b/src/add_widget_viewer/add_widget_data.c @@ -0,0 +1,162 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "add_widget_viewer/add_widget_data.h" +#include "util.h" + +static struct { + Eina_List *data_list; +} add_widget_data_s = { + .data_list = NULL +}; + +static void __add_widget_data_list_delete(void); +static void __add_widget_data_free(add_widget_data_t *item); +static int __add_widget_data_widget_list_cb(const char *app_id, const char *widget_id, int is_prime, void *data); +static int __add_widget_data_widget_compare_cb(const void *data1, const void *data2); + +bool add_widget_data_init(void) +{ + int ret = 0; + ret = widget_service_get_widget_list(__add_widget_data_widget_list_cb, NULL); + if (ret < 0 || add_widget_data_s.data_list == NULL) { + LOGE("Can not create widget list, ret: %d", ret); + return false; + } + + return true; +} + +void add_widget_data_fini(void) +{ + __add_widget_data_list_delete(); +} + +Eina_List *add_widget_data_get_widget_list(void) +{ + return add_widget_data_s.data_list; +} + +Eina_List *add_widget_data_get_widget_preview_list(add_widget_data_t *widget) +{ + return widget->preview_list; +} + +static int __add_widget_data_widget_list_cb(const char *app_id, const char *widget_id, int is_prime, void *data) +{ + LOGD("App id: %s", app_id); + LOGD("Widget id: %s", widget_id); + + add_widget_data_t *widget = NULL; + add_widget_data_preview_t *widget_preview_type = NULL; + + int *type = NULL; + int types_count = 0; + int ret = WIDGET_ERROR_NONE; + + ret = widget_service_get_supported_size_types(widget_id, &types_count, &type); + if (ret != WIDGET_ERROR_NONE || types_count <= 0) { + LOGE("Can not get widgets supported size types"); + return WIDGET_ERROR_FAULT; + } + + widget = calloc(1, sizeof(add_widget_data_t)); + if (!widget) { + LOGE("Can not allocate memory for list item"); + return WIDGET_ERROR_FAULT; + } + + int i; + for (i = 0; i < types_count; ++i) { + widget_preview_type = calloc(1, sizeof(add_widget_data_preview_t)); + if (!widget_preview_type) { + LOGE("Can not allocate memory for list item preview type"); + __add_widget_data_list_delete(); + return WIDGET_ERROR_FAULT; + } + + widget_preview_type->path = widget_service_get_preview_image_path(widget_id, type[i]); + if (!widget_preview_type->path) { + free(widget_preview_type); + continue; + } + + widget_preview_type->type = type[i]; + + widget->size_types |= type[i]; + widget->preview_list = eina_list_append(widget->preview_list, widget_preview_type); + } + + widget->size_types_count = types_count; + widget->app_id = strdup(app_id); + widget->widget_id = strdup(widget_id); + widget->label = widget_service_get_name(widget->widget_id, NULL); + if (!widget->label || strlen(widget->label) == 0) + widget->label = strdup(widget_id); + + add_widget_data_s.data_list = eina_list_sorted_insert(add_widget_data_s.data_list, + __add_widget_data_widget_compare_cb, widget); + + free(type); + + return WIDGET_ERROR_NONE; +} + +static int __add_widget_data_widget_compare_cb(const void *data1, const void *data2) +{ + int res = 0; + add_widget_data_t *w1 = (add_widget_data_t *)data1; + add_widget_data_t *w2 = (add_widget_data_t *)data2; + + res = strcmp(w1->label, w2->label); + + if (res < 0) return -1; + if (res > 0) return 1; + return 0; +} + +static void __add_widget_data_list_delete(void) +{ + Eina_List *list; + add_widget_data_t *item; + + EINA_LIST_FOREACH(add_widget_data_s.data_list, list, item) + __add_widget_data_free(item); + + eina_list_free(add_widget_data_s.data_list); + add_widget_data_s.data_list = NULL; +} + +static void __add_widget_data_free(add_widget_data_t *item) +{ + Eina_List *list; + add_widget_data_preview_t *preview; + + EINA_LIST_FOREACH(item->preview_list, list, preview) { + free(preview->path); + free(preview); + } + + eina_list_free(item->preview_list); + free(item->app_id); + free(item->widget_id); + free(item->label); + free(item); +} diff --git a/src/add_widget_viewer/add_widget_viewer.c b/src/add_widget_viewer/add_widget_viewer.c new file mode 100755 index 0000000..bb97188 --- /dev/null +++ b/src/add_widget_viewer/add_widget_viewer.c @@ -0,0 +1,576 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "add_widget_viewer/add_widget_viewer.h" +#include "add_widget_viewer/add_widget_data.h" +#include "cluster_data.h" +#include "cluster_view.h" +#include "util.h" +#include "conf.h" +#include "edc_conf.h" + +static struct { + Evas_Object *win; + Evas_Object *conformant; + Evas_Object *layout; + Evas_Object *naviframe; + Evas_Object *genlist; + Elm_Theme *theme; + Elm_Object_Item *navi_item; + Evas_Object *index; +} add_widget_viewer_s = { + .win = NULL, + .conformant = NULL, + .layout = NULL, + .naviframe = NULL, + .genlist = NULL, + .theme = NULL, + .navi_item = NULL, + .index = NULL +}; + +static void __add_widget_viewer_win_del_cb(void *data, Evas_Object* obj, void* event_info); +static Elm_Theme *__add_widget_viewer_create_theme(void); +static Evas_Object *__add_widget_viewer_create_conformant(void); +static Evas_Object *__add_widget_viewer_create_layout(); +static Evas_Object *__add_widget_viewer_create_naviframe(); + +static Evas_Object *__add_widget_viewer_create_content(Evas_Object *naviframe, Evas_Object *genlist); +static Evas_Object *__add_widget_viewer_create_index(Evas_Object *layout); +static void __add_widget_viewer_index_cb(void *data, Evas_Object *obj, void *event_info); +static int __add_widget_viewer_compare_index_cb(const void *data1, const void *data2); +static Evas_Object *__add_widget_viewer_create_list(Evas_Object *content); +static char *__add_widget_viewer_list_text_get_cb(void *data, Evas_Object *obj, const char *part); +static Evas_Object *__add_widget_viewer_list_content_get_cb(void *data, Evas_Object *obj, const char *part); +static Evas_Object *__add_widget_viewer_list_widget_box_create(Evas_Object *obj, add_widget_data_t *widget); +static void __add_widget_viewer_preview_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static Evas_Object *__add_widget_viewer_list_widget_preview_box_create(Evas_Object *main_box, add_widget_data_t *widget, add_widget_data_preview_t *preview); +static void __add_widget_viewer_item_realized_cb(void *data, Evas_Object *obj, void *event_info); + +void add_widget_viewer_win_create(void) +{ + if (!add_widget_data_init()) { + LOGE("Can not create widget list"); + return ; + } + + add_widget_viewer_s.win = elm_win_add(NULL, "add_viewer", ELM_WIN_BASIC); + if (!add_widget_viewer_s.win) { + LOGE("Failed to create a new window"); + return; + } + + elm_win_alpha_set(add_widget_viewer_s.win, EINA_TRUE); + elm_win_autodel_set(add_widget_viewer_s.win, EINA_TRUE); + evas_object_smart_callback_add(add_widget_viewer_s.win, "delete,request", __add_widget_viewer_win_del_cb, NULL); + + add_widget_viewer_s.theme = __add_widget_viewer_create_theme(); + add_widget_viewer_s.conformant = __add_widget_viewer_create_conformant(); + add_widget_viewer_s.layout = __add_widget_viewer_create_layout(); + add_widget_viewer_s.naviframe = __add_widget_viewer_create_naviframe(); + + add_widget_viewer_s.navi_item = __add_widget_viewer_create_content(add_widget_viewer_s.naviframe, add_widget_viewer_s.genlist); + + elm_object_signal_emit(add_widget_viewer_s.layout, "display,normal", "container"); + + elm_win_indicator_mode_set(add_widget_viewer_s.win, ELM_WIN_INDICATOR_SHOW); + elm_win_indicator_opacity_set(add_widget_viewer_s.win, ELM_WIN_INDICATOR_OPAQUE); + elm_win_resize_object_add(add_widget_viewer_s.win, add_widget_viewer_s.conformant); + elm_win_conformant_set(add_widget_viewer_s.win, EINA_TRUE); + evas_object_resize(add_widget_viewer_s.win, WINDOW_W, WINDOW_H); + + evas_object_show(add_widget_viewer_s.naviframe); + evas_object_show(add_widget_viewer_s.layout); + evas_object_show(add_widget_viewer_s.conformant); + + evas_object_show(add_widget_viewer_s.win); +} + +void add_widget_viewer_win_destroy(void) +{ + evas_object_del(add_widget_viewer_s.win); + add_widget_data_fini(); +} + +static void __add_widget_viewer_win_del_cb(void *data, Evas_Object* obj, void* event_info) +{ + evas_object_del(add_widget_viewer_s.win); +} + +static Elm_Theme *__add_widget_viewer_create_theme(void) +{ + Elm_Theme *theme = elm_theme_new(); + if (!theme) { + LOGE("Failed to create theme\n"); + return NULL; + } + + elm_theme_ref_set(theme, NULL); + elm_theme_extension_add(theme, util_get_res_file_path(EDJE_DIR"/add_widget_viewer.edj")); + + return theme; +} + +static Evas_Object *__add_widget_viewer_create_conformant(void) +{ + Evas_Object *conformant; + Evas_Object *bg; + + conformant = elm_conformant_add(add_widget_viewer_s.win); + if (!conformant) { + LOGE("Failed to create a conformant\n"); + return NULL; + } + + evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bg = elm_bg_add(conformant); + if (bg) { + elm_object_style_set(bg, "indicator/headerbg"); + elm_object_part_content_set(conformant, "elm.swallow.indicator_bg", bg); + evas_object_show(bg); + } else { + LOGE("Failed to create a BG object\n"); + } + + return conformant; +} + +static Evas_Object *__add_widget_viewer_create_layout() +{ + Evas_Object *layout; + char edj_path[PATH_MAX_LEN] = {0, }; + + if (!add_widget_viewer_s.conformant) { + return NULL; + } + + layout = elm_layout_add(add_widget_viewer_s.conformant); + if (!layout) { + return NULL; + } + + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/add_widget_viewer.edj")); + if (elm_layout_file_set(layout, edj_path, ADD_WIDGET_VIEWER_CONFORMANT_FRAME) != EINA_TRUE) { + evas_object_del(layout); + return NULL; + } + + elm_object_part_content_set(add_widget_viewer_s.conformant, "elm.swallow.content", layout); + + return layout; +} + +static Evas_Object *__add_widget_viewer_create_naviframe() +{ + Evas_Object *naviframe; + + naviframe = elm_naviframe_add(add_widget_viewer_s.conformant); + if (!naviframe) { + return NULL; + } + + elm_naviframe_content_preserve_on_pop_set(naviframe, EINA_TRUE); + elm_object_part_content_set(add_widget_viewer_s.layout, "content", naviframe); + + return naviframe; +} + +static Evas_Object *__add_widget_viewer_create_content(Evas_Object *naviframe, Evas_Object *genlist) +{ + Elm_Object_Item *item; + Evas_Object *content; + + content = elm_layout_add(naviframe); + if (!content) { + return NULL; + } + + if (elm_layout_file_set(content, util_get_res_file_path(EDJE_DIR"/add_widget_viewer.edj"), ADD_WIDGET_VIEWER_CONTENT_FRAME) != EINA_TRUE) { + LOGE("Can not set layout file"); + evas_object_del(content); + return NULL; + } + add_widget_viewer_s.index = __add_widget_viewer_create_index(content); + if (!add_widget_viewer_s.index) { + evas_object_del(content); + return NULL; + } + elm_object_part_content_set(content, "index", add_widget_viewer_s.index); + + genlist = __add_widget_viewer_create_list(content); + elm_object_part_content_set(content, "content", genlist); + + item = elm_naviframe_item_push(naviframe, _("IDS_HS_HEADER_ADD_WIDGET"), NULL, NULL, content, NULL); + elm_object_signal_emit(content, "display,normal", "container"); + elm_object_signal_emit(content, "display,index", "container"); + + if (!item) { + LOGD("Failed to push an item\n"); + return NULL; + } + + return content; +} + +static Evas_Object *__add_widget_viewer_create_index(Evas_Object *layout) +{ + Evas_Object *index; + const char *idx_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char ch[2] = {0, }; + + index = elm_index_add(layout); + elm_index_autohide_disabled_set(index, EINA_TRUE); + elm_index_omit_enabled_set(index, EINA_TRUE); + elm_index_item_append(index, "#", NULL, NULL); + + int i; + for (i = 0; i < strlen(idx_str); ++i) { + ch[0] = idx_str[i]; + ch[1] = '\0'; + elm_index_item_append(index, ch, __add_widget_viewer_index_cb, &ch[0]); + } + + elm_index_level_go(index, 0); + + return index; +} + +static void __add_widget_viewer_index_cb(void *data, Evas_Object *obj, void *event_info) +{ + char *idx_str = (char *)data; + Eina_List *widget_list = NULL; + add_widget_data_t *widget = NULL; + + widget_list = add_widget_data_get_widget_list(); + if (!widget_list) { + LOGE("Can not get widget list"); + return; + } + + widget = eina_list_search_unsorted(widget_list, __add_widget_viewer_compare_index_cb, idx_str); + if (!widget) { + LOGE("Can not find widget"); + return; + } + + elm_genlist_item_bring_in(widget->genlist_item, ELM_GENLIST_ITEM_SCROLLTO_TOP); + +} + +static int __add_widget_viewer_compare_index_cb(const void *data1, const void *data2) +{ + add_widget_data_t *w = (add_widget_data_t *)data1; + char *idx_str = (char *)data2; + + char c1 = 0; + char c2 = 0; + + c1 = tolower(idx_str[0]); + c2 = tolower(w->widget_id[0]); + + LOGD("Compare: %c == %c in %s, %s", c1, c2, idx_str, w->widget_id); + + if (c1 < c2) return -1; + if (c1 > c2) return 1; + return 0; +} + +static Evas_Object *__add_widget_viewer_create_list(Evas_Object *content) +{ + Elm_Genlist_Item_Class *itc_widget; + Evas_Object *genlist = NULL; + Elm_Object_Item *widget_gl_item = NULL; + Eina_List *widget_list = NULL, *l = NULL; + add_widget_data_t *widget = NULL; + + genlist = elm_genlist_add(content); + if (!genlist) { + LOGE("Failed to create a genlist\n"); + return NULL; + } + + elm_scroller_bounce_set(genlist, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_NONE); + + if (add_widget_viewer_s.theme) + elm_object_theme_set(genlist, add_widget_viewer_s.theme); + + itc_widget = elm_genlist_item_class_new(); + itc_widget->item_style = "widget,leaf"; + itc_widget->func.text_get = __add_widget_viewer_list_text_get_cb; + itc_widget->func.content_get = __add_widget_viewer_list_content_get_cb; + + widget_list = add_widget_data_get_widget_list(); + if (!widget_list) { + LOGE("Can not get widget list"); + return NULL; + } + + LOGD("Widget list length: %d", eina_list_count(widget_list)); + EINA_LIST_FOREACH(widget_list, l, widget) { + LOGD("Genlist append %s", widget->app_id); + widget_gl_item = elm_genlist_item_append(genlist, itc_widget, widget, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + widget->genlist_item = widget_gl_item; + } + + evas_object_smart_callback_add(genlist, "realized", __add_widget_viewer_item_realized_cb, NULL); + + elm_genlist_item_class_free(itc_widget); + + return genlist; +} + +static void __add_widget_viewer_item_realized_cb(void *data, Evas_Object *obj, void *event_info) +{ + LOGD("item realized_cb"); + + char ch[2] = {0, }; + Elm_Object_Item *item = event_info; + Elm_Index_Item *index_item = NULL; + add_widget_data_t *widget = NULL; + + widget = (add_widget_data_t *)elm_object_item_data_get(item); + + LOGD("item data: %s", widget->widget_id); + ch[0] = widget->widget_id[0]; + + if (strlen(ch) == 0) { + LOGE("Can not get first char of widget name"); + return; + } + + index_item = elm_index_item_find(add_widget_viewer_s.index, ch); + if (!index_item) { + LOGE("Can not set selected index item"); + return ; + } + + elm_index_item_selected_set(index_item, EINA_TRUE); +} + +static char *__add_widget_viewer_list_text_get_cb(void *data, Evas_Object *obj, const char *part) +{ + add_widget_data_t *widget = data; + + if (!widget || !part) + return NULL; + + if (!strcmp(part, "elm.text")) + return strdup(widget->label); + + return strdup("widget name not found"); +} + +static Evas_Object *__add_widget_viewer_list_content_get_cb(void *data, Evas_Object *obj, const char *part) +{ + LOGD("Part: %s", part); + + Evas_Object *main_box = NULL; + add_widget_data_t *widget = data; + + if (!widget || !part) + return NULL; + + if (!strcmp(part, SIZE_SETTER)) { + Evas_Object *rect = NULL; + rect = evas_object_rectangle_add(evas_object_evas_get(obj)); + if (!rect) { + LOGE("Can not create preview box"); + return NULL; + } + evas_object_color_set(rect, 255, 255, 255, 0); + evas_object_size_hint_min_set(rect, ALLPAGE_PREVIEW_LIST_ITEM_W, ALLPAGE_PREVIEW_LIST_ITEM_H); + evas_object_size_hint_max_set(rect, ALLPAGE_PREVIEW_LIST_ITEM_W, ALLPAGE_PREVIEW_LIST_ITEM_H); + evas_object_show(rect); + return rect; + } else if (!strcmp(part, "elm.icon")) { + main_box = __add_widget_viewer_list_widget_box_create(obj, widget); + if (!main_box) { + LOGE("Can not create preview box"); + return NULL; + } + } + + return main_box; +} + +static Evas_Object *__add_widget_viewer_list_widget_box_create(Evas_Object *obj, add_widget_data_t *widget) +{ + LOGD("Create box for %s", widget->widget_id); + + Evas_Object *box = NULL; + Evas_Object *preview_layout = NULL; + Eina_List *l; + Eina_List *children; + add_widget_data_preview_t *preview; + + box = elm_box_add(obj); + if (!box) { + LOGE("Can not create preview box"); + return NULL; + } + + elm_box_align_set(box, 0.0, 0.0); + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_homogeneous_set(box, EINA_FALSE); + elm_box_padding_set(box, ALLPAGE_PREVIEW_PADDING_MID, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + EINA_LIST_FOREACH(widget->preview_list, l, preview) { + preview_layout = __add_widget_viewer_list_widget_preview_box_create(box, widget, preview); + if (!preview_layout) { + LOGE("Can not create preview layout"); + continue; + } + evas_object_show(preview_layout); + + switch (preview->type) { + case WIDGET_SIZE_TYPE_4x4: + case WIDGET_SIZE_TYPE_4x2: + evas_object_size_hint_align_set(preview_layout, 0.0, 0.0); + elm_box_pack_end(box, preview_layout); + break; + default: + LOGE("Unsupported size\n"); + break; + return NULL; + } + } + + children = elm_box_children_get(box); + if (eina_list_count(children) == 0) { + evas_object_del(box); + LOGE("Preview is not exists"); + box = NULL; + } else { + evas_object_show(box); + } + + eina_list_free(children); + + return box; +} + +static Evas_Object *__add_widget_viewer_list_widget_preview_box_create(Evas_Object *main_box, add_widget_data_t *widget, add_widget_data_preview_t *preview) +{ + LOGD("Create preview: type->%d path->%s", preview->type, preview->path); + + Evas_Object *preview_layout = NULL; + Evas_Object *preview_img = NULL; + int w = 0, h = 0; + int ret = 0; + + if (!preview || !preview->path || !preview->type) { + LOGE("Path to preview image is empty"); + return NULL; + } + + preview_layout = elm_layout_add(main_box); + if (!preview_layout) { + LOGE("Can not create preview layout"); + return NULL; + } + + ret = elm_layout_file_set(preview_layout, util_get_res_file_path(EDJE_DIR"/add_widget_viewer.edj"), ADD_WIDGET_VIEWER_PREVIEW); + if (ret != EINA_TRUE) { + LOGE("Can not set preview layout"); + evas_object_del(preview_layout); + return NULL; + } + + switch (preview->type) { + case WIDGET_SIZE_TYPE_4x2: + w = ALLPAGE_PREVIEW_4X2_W; + h = ALLPAGE_PREVIEW_4X2_H; + break; + case WIDGET_SIZE_TYPE_4x4: + w = ALLPAGE_PREVIEW_4X4_W; + h = ALLPAGE_PREVIEW_4X4_H; + break; + default: + return NULL; + } + + Evas_Object *rect = NULL; + rect = evas_object_rectangle_add(evas_object_evas_get(preview_layout)); + if (!rect) { + LOGE("Can not create preview layout"); + return NULL; + } + evas_object_color_set(rect, 255, 255, 255, 0); + evas_object_size_hint_min_set(rect, w, h); + evas_object_size_hint_max_set(rect, w, h); + elm_object_part_content_set(preview_layout, SIZE_SETTER, rect); + + int *preview_type = calloc(1, sizeof(int)); + if (!preview_type) { + LOGE("Can not allocate memory for additional data"); + evas_object_del(preview_layout); + return NULL; + } + *preview_type = preview->type; + + preview_img = evas_object_image_filled_add(evas_object_evas_get(preview_layout)); + if (!preview_img) { + LOGE("Can not create image object"); + evas_object_del(preview_layout); + return NULL; + } + + evas_object_data_set(preview_layout, "preview_type", preview_type); + + elm_object_signal_callback_add(preview_layout, SIGNAL_PREVIEW_CLICKED, SIGNAL_SOURCE, __add_widget_viewer_preview_clicked_cb, widget); + + evas_object_image_file_set(preview_img, preview->path, NULL); + evas_object_image_size_get(preview_img, &w, &h); + evas_object_image_fill_set(preview_img, 0, 0, w, h); + + elm_object_part_content_set(preview_layout, ADD_WIDGET_VIEWER_PREVIEW_ICON, preview_img); + + return preview_layout; +} +static void __add_widget_viewer_preview_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + LOGD("Preview clicked"); + + add_widget_data_t *widget = NULL; + int *size = NULL; + + size = evas_object_data_del(obj, "preview_type"); + if (*size == WIDGET_SIZE_TYPE_UNKNOWN) { + LOGE("Can not get widgets size type"); + return; + } + + widget = (add_widget_data_t *)data; + if (!widget) { + LOGE("Can not get widget"); + return; + } + + cluster_data_insert_widget(widget->widget_id, widget->widget_id, *size); + + free(size); + + cluster_view_set_state(VIEW_STATE_NORMAL); +} diff --git a/src/all_apps.c b/src/all_apps.c deleted file mode 100644 index e2ce108..0000000 --- a/src/all_apps.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "homescreen-efl.h" -#include "all_apps.h" -#include "page_scroller.h" -#include "app_grid.h" -#include "dynamic_index.h" - -static struct { - Evas_Object *all_apps; - Evas_Object *parent; - Evas_Coord w; - Evas_Coord h; - - dynamic_index_t *index; - - bool anim_base_positions_actual; - int anim_base_pos_x; - int anim_base_pos_y; - -} s_info = { - .all_apps = NULL, - .parent = NULL, - .w = -1, - .h = -1, - - .index = NULL, - - /*these variables are used during animation transitions:*/ - .anim_base_positions_actual = false, - .anim_base_pos_x = -1, - .anim_base_pos_y = -1 -}; - - -static bool __all_apps_fill(void); - -HAPI void all_apps_detach_from_grid(Elm_Object_Item *grid_item) -{ - LOGI(""); - if (!grid_item) { - LOGE("[INVALID_ARG][grid_item='%p']" , grid_item); - return; - } - - app_grid_unpack_item(grid_item); - elm_object_item_del(grid_item); -} - -HAPI Elm_Object_Item *all_apps_attach_to_grid(Evas_Object *icon, int grid_num) -{ - Evas_Object *grid = NULL; - - if (!icon) { - LOGE("icon == NULL"); - return NULL; - } - - grid = page_scroller_get_page(s_info.all_apps, grid_num); - - if (home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS_CHOOSE) - elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE); - - return app_grid_append_item(grid, icon); -} - -HAPI Evas_Object *all_apps_create(Evas_Object *parent, void *data) -{ - Evas_Object *p_edje = NULL; - - /*Created before!*/ - if (!parent) { - LOGE("[INVALID_ARG][parent='%p'][data='%p']" , parent, data); - return NULL; - } - s_info.parent = parent; - - p_edje = elm_layout_edje_get(parent); - edje_object_part_geometry_get(p_edje, PART_CONTENT , NULL , NULL, &s_info.w, &s_info.h); - - if (s_info.w < 0 || s_info.h < 0) { - LOGE("[FAILED][edje_object_part_geometry_get][w='%d'][h='%d']", s_info.w, s_info.h); - return NULL; - } - - s_info.all_apps = page_scroller_create(s_info.w, s_info.h); - if (!s_info.all_apps) { - LOGE("[FAILED][page_scroller_create]"); - return NULL; - } - - if (!__all_apps_fill()) { - LOGE("[FAILED][__all_apps_fill]"); - page_scroller_destroy(s_info.all_apps); - s_info.all_apps = NULL; - return NULL; - } - - s_info.index = dynamic_index_new(s_info.all_apps); - if (!s_info.index) { - LOGE("[FAILED][dynamic_index_new]"); - page_scroller_destroy(s_info.all_apps); - s_info.all_apps = NULL; - return NULL; - } - - evas_object_size_hint_min_set(s_info.all_apps, home_screen_get_root_width(), home_screen_get_root_height()); - evas_object_resize(s_info.all_apps, home_screen_get_root_width(), home_screen_get_root_height()); - evas_object_move(s_info.all_apps, 0, home_screen_get_root_height()); - - return s_info.all_apps; -} - -HAPI void all_apps_show(void) -{ - if (s_info.index) { - elm_object_part_content_set(s_info.parent, PART_INDEX, s_info.index->box); - evas_object_show(s_info.index->box); - } -} - -HAPI void all_apps_hide(void) -{ - elm_object_part_content_unset(s_info.parent, PART_INDEX); - if (s_info.index) - evas_object_hide(s_info.index->box); -} - -HAPI void all_apps_del(void) -{ - /*app_grids was added into all_apps so it should be removed - when this object will be deleted.*/ - dynamic_index_del(s_info.index); - s_info.index = NULL; - - evas_object_del(s_info.all_apps); - s_info.all_apps = NULL; -} - -HAPI void all_apps_set_view_mode(homescreen_view_t view) -{ - data_model_set_view_mode(view); -} - -HAPI void all_apps_set_scrolling_blocked_state(bool is_blocked) -{ - if (is_blocked) page_scroller_freeze(s_info.all_apps); - else page_scroller_unfreeze(s_info.all_apps); -} - -HAPI bool all_apps_append_page(Tree_node_t *page_item) -{ - Evas_Object *app_grid = app_grid_create(s_info.all_apps, page_item, s_info.w, s_info.h, APP_GRID_TYPE_ALL_APPS); - - if (!app_grid) { - LOGE("[FAILED][app_grid_create]"); - return false; - } - - if (!page_scroller_add_page(s_info.all_apps, app_grid)) { - LOGE("[FAILED][page_scroller_page_add]"); - evas_object_del(app_grid); - return false; - } - - return true; -} - -HAPI void all_apps_remove_empty_pages(void) -{ - Evas_Object *empty_page_layout = NULL, *page_layout = NULL, *gengrid_inside_layout = NULL; - int i = 0; - - do { - i = 0; - empty_page_layout = NULL; - - while ((page_layout = page_scroller_get_page(s_info.all_apps, i++))) { - gengrid_inside_layout = elm_object_part_content_get(page_layout, PART_APP_GRID_CONTENT); - - if (elm_gengrid_items_count(gengrid_inside_layout) == 0) { - empty_page_layout = page_layout; - break; - } - } - page_scroller_remove_page(s_info.all_apps, empty_page_layout); - } while (empty_page_layout); -} - -HAPI void all_apps_update_dynamic_index_count(void) -{ - elm_object_signal_emit(s_info.all_apps, "scroller,count,changed", "layout"); -} - -static bool __all_apps_fill(void) -{ - Tree_node_t *it = NULL; - Tree_node_t *data_model = (Tree_node_t *)data_model_get_all_apps(); - - if (!data_model) { - LOGE("[FAILED][data_model_tree_get"); - return false; - } - - TREE_NODE_FOREACH(data_model, it) - if (!all_apps_append_page(it)) - return false; - - return true; -} \ No newline at end of file diff --git a/src/app_grid.c b/src/app_grid.c deleted file mode 100644 index 74bebbd..0000000 --- a/src/app_grid.c +++ /dev/null @@ -1,1004 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "app_grid.h" -#include "homescreen-efl.h" -#include "app_item.h" -#include "app_icon.h" -#include "page_scroller.h" -#include "all_apps.h" -#include "folder_panel.h" -#include "util.h" -#include "popup.h" -#include "data_model.h" - -typedef enum { - NEXT_PAGE_CB = 0, - PREV_PAGE_CB, - NONE_PAGE_CB -} page_change_action_t; - -typedef enum { - MODE_NORMAL = 0, - MODE_EDIT, - MODE_FOLDER, -} possible_view_modes_t; - -typedef struct { - page_change_action_t action; - Evas_Object *parent; -} change_page_data_t; - -static struct { - Tree_node_t *repositioned_node; - Tree_node_t *opened_folder_node; - Tree_node_t *destination_folder; - Evas_Object *repositioned_icon_layout; - Evas_Object *src_grid; - Evas_Object *repositioned_icon; - Elm_Object_Item *repositioned_item; - int src_idx; - bool is_dnd_on; - Evas_Coord dx; - Evas_Coord dy; - Elm_Gengrid_Item_Class *gic; - Evas_Coord w; - Evas_Coord h; - int f_x; - int f_y; - int f_w; - int f_h; - Ecore_Timer *change_page_timer; - Ecore_Timer *outside_folder_timer; - change_page_data_t cp_data; -} s_info = { - .repositioned_node = NULL, - .opened_folder_node = NULL, - .destination_folder = NULL, - .repositioned_icon_layout = NULL, - .src_grid = NULL, - .repositioned_icon = NULL, - .repositioned_item = NULL, - .src_idx = 1, - .is_dnd_on = false, - .gic = NULL, - .dx = -1, - .dy = -1, - .w = -1, - .h = -1, - .f_x = -1, - .f_y = -1, - .f_w = -1, - .f_h = -1, - .change_page_timer = NULL, - .outside_folder_timer = NULL, - .cp_data = { - action: NONE_PAGE_CB, - parent: NULL - } -}; - -/*================================= PRIVATE FUNCTIONS ============================================*/ -static bool __app_grid_fill(Evas_Object *grid, Tree_node_t *data); -static Evas_Object *__app_grid_create_ly(Evas_Object *parent); -static bool __app_grid_resize(Evas_Object *app_grid, Evas_Coord new_w, Evas_Coord new_h); -static Evas_Object *__app_grid_get_icon_container_ptr(Elm_Object_Item *it); -static Eina_Bool __app_grid_change_page_cb(void *data); -static void __app_grid_check_page_change(Evas_Object *scroller, int x, int y); -static void __app_grid_clear_reposition_structure(void); -static Eina_Bool __app_grid_close_folder_cb(void *data); -static Evas_Object *__app_grid_create_item_container(Evas_Object *parent); - -/*================================= GENGRID CALLBACK FUNCTIONS ===================================*/ -static void __app_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei); -static Evas_Object *__app_grid_get_content(void *data, Evas_Object *obj, const char *part); -static Eina_Bool __app_grid_get_state(void *data, Evas_Object *obj, const char *part); -static void __app_grid_del_content(void *data, Evas_Object *obj); -static char *__app_grid_get_text(void *data, Evas_Object *obj, const char *part); -static void __app_grid_resize_cb(void *data, Evas *e, Evas_Object *obj, void *ei); - -/*================================= MOUSE HANDLERS ===============================================*/ -static Eina_Bool _app_grid_mouse_move_cb(void *data, int type, void *event); -static Eina_Bool __app_grid_mouse_up_cb(void *data, int type, void *event); - -/*================================= DND FUNCTIONS ================================================*/ -static void __app_grid_return_to_origin_pos(void); -static void __app_grid_icon_drop(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y, - Elm_Xdnd_Action action); -static void __app_grid_drag_done(void *data, Evas_Object *obj); -static Evas_Event_Flags __app_grid_icon_move(void *data, void *event_info); -static Evas_Event_Flags __app_grid_icon_move_end(void *data, void *event_info); - -/*================================= PUBLIC FUNCTIONS DEFS ========================================*/ -HAPI Evas_Object *app_grid_create(Evas_Object *parent, Tree_node_t *data, Evas_Coord gengrid_width, - Evas_Coord gengrid_height, app_grid_type_t type) -{ - Evas_Object *gengrid = NULL; - Evas_Object *layout = NULL; - Evas_Object *rect = NULL; - - if (!parent) { - LOGE("[INVALID_PARAM]['parent'='%p']", parent); - return NULL; - } - - rect = evas_object_rectangle_add(evas_object_evas_get(parent)); - if (!rect) { - LOGE("[FAILED][rect=NULL]"); - return NULL; - } - - layout = __app_grid_create_ly(parent); - if (!layout) { - LOGE("[FAILED][__app_grid_create_ly]"); - evas_object_del(rect); - return NULL; - } - - evas_object_color_set(rect, 0, 0, 0, 0); - evas_object_size_hint_min_set(rect, gengrid_width, gengrid_height); - evas_object_size_hint_max_set(rect, gengrid_width, gengrid_height); - elm_object_part_content_set(layout, PART_APP_GRID_SIZE_SETTER, rect); - - gengrid = elm_gengrid_add(layout); - if (!gengrid) { - LOGE("[FAILED][elm_gengrid_add]"); - evas_object_del(layout); - evas_object_del(rect); - return NULL; - } - - evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(gengrid); - - if (!s_info.gic) { - if (!(s_info.gic = elm_gengrid_item_class_new())) { - LOGE("[FAILED][elm_gengrid_item_class_new]"); - evas_object_del(layout); - evas_object_del(rect); - return NULL; - } - - s_info.gic->item_style = "default"; - s_info.gic->func.content_get = __app_grid_get_content; - s_info.gic->func.del = __app_grid_del_content; - s_info.gic->func.text_get = __app_grid_get_text; - s_info.gic->func.state_get = __app_grid_get_state; - - ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _app_grid_mouse_move_cb, parent); - ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, __app_grid_mouse_up_cb, NULL); - } - - elm_object_scale_set(gengrid, 0.5); - - elm_gengrid_select_mode_set(gengrid, ELM_OBJECT_SELECT_MODE_NONE); - elm_gengrid_reorder_mode_set(gengrid, EINA_FALSE); - elm_gengrid_align_set(gengrid, 0.0, 0.0); - - if (!__app_grid_fill(gengrid, data)) { - LOGE("[FAILED][__app_grid_fill]"); - evas_object_del(layout); - evas_object_del(rect); - return NULL; - } - - if (type == APP_GRID_TYPE_ALL_APPS) { - s_info.w = gengrid_width; - s_info.h = gengrid_height; - } else if (type == APP_GRID_TYPE_FOLDER) { - elm_object_signal_emit(layout, SIGNAL_APP_GRID_BG_HIDE, SIGNAL_SOURCE); - } - - elm_object_part_content_set(layout, PART_APP_GRID_CONTENT, gengrid); - evas_object_smart_callback_add(gengrid, "longpressed", __app_grid_item_longpressed_cb, NULL); - - data->data->layout = layout; - evas_object_event_callback_add(gengrid, EVAS_CALLBACK_RESIZE, __app_grid_resize_cb, (void *)type); - - /*It is used only internal.*/ - evas_object_data_set(gengrid, KEY_APP_GRID_DATA, layout); - - elm_scroller_movement_block_set(gengrid, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); - elm_scroller_movement_block_set(gengrid, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); - elm_gengrid_wheel_disabled_set(gengrid, EINA_TRUE); - - return layout; -} - -HAPI Elm_Object_Item *app_grid_append_item(Evas_Object *layout, Evas_Object *icon_to_append) -{ - Elm_Object_Item *result = NULL; - Evas_Object *container = NULL; - - if (!layout || !icon_to_append) { - LOGE("[INVALID_PARAM][layout='%p'][icon_to_append='%p']", layout, icon_to_append); - return NULL; - } - - Evas_Object *grid = elm_object_part_content_get(layout, PART_APP_GRID_CONTENT); - if (!grid) { - LOGE("[FAILED][elm_object_part_content_get]"); - return NULL; - } - - if (!(result = elm_gengrid_item_append(grid, s_info.gic, - (container = app_grid_item_pack(grid, icon_to_append)), NULL, NULL))) { - LOGE("Failed to append item"); - return NULL; - } - - evas_object_show(icon_to_append); - return result; -} - -HAPI Elm_Object_Item *app_grid_insert_item_relative(Evas_Object *layout, Evas_Object *item, - Elm_Object_Item *rel_it) -{ - Evas_Object *app_grid = NULL, *container = NULL; - Elm_Object_Item *result = NULL; - int dst_idx = -1; - - if (!layout || !item) { - LOGE("[INVALID_PARAM][layout='%p'][item='%p']", layout, item); - return NULL; - } - - app_grid = elm_object_part_content_get(layout, PART_APP_GRID_CONTENT); - if (!app_grid) { - LOGE("[FAILED][elm_object_part_content_get]"); - return NULL; - } - - if (rel_it) { - dst_idx = elm_gengrid_item_index_get(rel_it); - - if ((s_info.src_grid == app_grid && s_info.src_idx > dst_idx) - || (s_info.src_grid != app_grid)) { - if (!(result = elm_gengrid_item_insert_before(app_grid, s_info.gic, - (container = app_grid_item_pack(app_grid, item)), rel_it, NULL, NULL))) { - LOGE("[FAILED][elm_gengrid_item_insert_before]"); - evas_object_del(container); - return NULL; - } - } else if (s_info.src_grid == app_grid && s_info.src_idx < dst_idx) { - if (!(result = elm_gengrid_item_insert_after(app_grid, s_info.gic, - (container = app_grid_item_pack(app_grid, item)), rel_it, NULL, NULL))) { - LOGE("[FAILED][elm_gengrid_item_insert_before]"); - return NULL; - } - } - } else { - if (!(result = elm_gengrid_item_append(app_grid, s_info.gic, - (container = app_grid_item_pack(app_grid, item)), NULL, NULL))) { - LOGE("[FAILED][elm_gengrid_item_append]"); - return NULL; - } - } - - evas_object_show(item); - return result; -} - -HAPI Evas_Object *app_grid_item_pack(Evas_Object *p, Evas_Object *c) -{ - Evas_Object *container = NULL; - - if (!p) { /*When c is null it is not a big problem...it creates then empty gengrid item */ - LOGD("[ERR][INVALID_PARAM]['p'='%p']", p); - return NULL; - } - - /*This items will be removed when gengrid items will be deleted. - It was checked in EVAS_CALLBACK_DEL function. */ - container = __app_grid_create_item_container(home_screen_get_win()); - if (!container) { - LOGE("[FAILED][container=NULL]"); - return NULL; - } - - if (c) - elm_object_part_content_set(container, PART_APP_GRID_ITEM, c); - - return container; -} - -HAPI void app_grid_unpack_item(Elm_Object_Item *item) -{ - Evas_Object *container = NULL; - - if (!item) { - LOGE("[INVALID_PARAM][item=NULL]"); - return; - } - - container = elm_object_item_part_content_get(item, GRID_CONTENT); - if (!container) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - return; - } - - elm_object_part_content_unset(container, PART_APP_GRID_ITEM); -} - -HAPI Eina_Bool app_grid_get_item_content(Elm_Object_Item *item, Evas_Object **icon, - Tree_node_t **data) -{ - Evas_Object *ic = NULL; - Evas_Object *container = NULL; - - if (!item) { - LOGE("[INVALID_PARAM][item='%p']", item); - return EINA_FALSE; - } - - container = elm_object_item_part_content_get(item, GRID_CONTENT); - if (!container) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - return EINA_FALSE; - } - - ic = elm_object_part_content_get(container, PART_APP_GRID_ITEM); - if (!ic) { - LOGE("[FAILED][eina_list_data_get]"); - return EINA_FALSE; - } - - if (icon) - *icon = ic; - - if (data) { - *data = evas_object_data_get(ic, KEY_ICON_DATA); - if (!(*data)) { - LOGE("[FAILED][evas_object_data_get]"); - /*eina_list_free(box_content);*/ - return EINA_FALSE; - } - } - return EINA_TRUE; -} - -static Evas_Event_Flags __app_grid_icon_move(void *data, void *event_info) -{ - Elm_Gesture_Momentum_Info *pos_info = event_info; - - if(s_info.repositioned_icon == NULL) - return EVAS_EVENT_FLAG_NONE; - - evas_object_move(s_info.repositioned_icon, pos_info->x2 - s_info.dx, pos_info->y2 - s_info.dy); - - if (folder_panel_is_folder_visible()) { - LOGD("Folder is visible"); - if ((pos_info->y2 <= s_info.f_y || pos_info->y2 >= s_info.f_y + s_info.f_h) && - !s_info.outside_folder_timer) { - - LOGD("Icon is outside folder"); - s_info.outside_folder_timer = ecore_timer_add(1.0, __app_grid_close_folder_cb, NULL); - if (!s_info.outside_folder_timer) { - LOGE("[FAILED][timer=NULL]"); - return EVAS_EVENT_FLAG_ON_HOLD; - } - } else if (pos_info->y2 >= s_info.f_y && pos_info->y2 <= s_info.f_y + s_info.f_h) { - LOGD("Icons position is on folder"); - ecore_timer_del(s_info.outside_folder_timer); - s_info.outside_folder_timer = NULL; - } - } - - return EVAS_EVENT_FLAG_NONE; -} - -static Eina_Bool __app_grid_icon_move_cb_set(void *data) -{ - LOGD("Set icon move cb"); - int ret = 0; - - ret = home_screen_gesture_cb_set(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE, - __app_grid_icon_move, NULL); - ret |= home_screen_gesture_cb_set(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END, - __app_grid_icon_move_end, NULL); - ret |= home_screen_gesture_cb_set(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT, - __app_grid_icon_move_end, NULL); - - if (ret) { - LOGE("Can not set icon move callbacks"); - return EINA_TRUE; - } - - return EINA_FALSE; -} - -static Eina_Bool __app_grid_icon_move_cb_del(void *data) -{ - LOGD("Delete icon move cb"); - int ret = 0; - - ret = home_screen_gesture_cb_unset(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE, - __app_grid_icon_move, NULL); - ret |= home_screen_gesture_cb_unset(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END, - __app_grid_icon_move_end, NULL); - ret |= home_screen_gesture_cb_unset(ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT, - __app_grid_icon_move_end, NULL); - - if (ret) - LOGE("Can not unset callbacks"); - - return ECORE_CALLBACK_CANCEL; -} - -static Evas_Event_Flags __app_grid_icon_move_end(void *data, void *event_info) -{ - Elm_Gesture_Momentum_Info *pos_info = event_info; - - if(s_info.repositioned_icon != NULL) { - - if (pos_info != NULL) { - LOGD("Drag end at: x,y=<%d,%d>", pos_info->x2, pos_info->y2); - - __app_grid_icon_drop(NULL, s_info.src_grid, pos_info->x2, - pos_info->y2, ELM_XDND_ACTION_MOVE); - } - - __app_grid_drag_done(NULL, NULL); - } - - /* quickfix: idler adds delay so cb func might be deleted after it is finished - * removing cb inside its body causes memory errors - */ - ecore_idler_add(__app_grid_icon_move_cb_del, NULL); - - return EVAS_EVENT_FLAG_NONE; -} - -/*=====================GENGRID CALLBACKS IMPLEMENTATION===========================================*/ -static void __app_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei) -{ - Elm_Object_Item *it = (Elm_Object_Item *)ei; - Evas_Coord x, y, w, h, m_x, m_y; - Evas_Object *icon_layout = NULL; - Evas_Object *icon = NULL; - Tree_node_t *icon_node = NULL; - homescreen_view_t view_type = HOMESCREEN_VIEW_UNKNOWN; - - view_type = home_screen_get_view_type(); - - if (view_type != HOMESCREEN_VIEW_ALL_APPS && - view_type != HOMESCREEN_VIEW_ALL_APPS_EDIT) - return; - - if (!it || !app_grid_get_item_content(it, &icon_layout, NULL)) { - LOGE("[FAILED][app_grid_item_content_get]"); - return; - } - - if (!evas_object_data_get(icon_layout, KEY_IS_REPOSITIONABLE)) - return; - - if (!icon_layout) { - LOGE("[FAILED][icon_layout=NULL]"); - return; - } - - if (view_type == HOMESCREEN_VIEW_ALL_APPS) - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_EDIT); - - icon = elm_object_part_content_get(icon_layout, PART_ICON_CONTENT); - if (!icon) { - LOGE("[FAILED][icon=NULL]"); - return; - } - - icon_node = evas_object_data_get(icon_layout, KEY_ICON_DATA); - if (!icon_node) { - LOGE("[FAILED][icon_node=NULL]"); - return; - } - - /*check if the repositioned item is from a folder. - It is necessary for removing item from the folder.*/ - if (icon_node->parent && icon_node->parent->parent && icon_node->parent->parent->data - && icon_node->parent->parent->data->type == APP_ITEM_FOLDER) { - s_info.opened_folder_node = icon_node->parent->parent; - folder_panel_get_folder_geometry(&s_info.f_x, &s_info.f_y, &s_info.f_w, &s_info.f_h); - } - - evas_object_geometry_get(icon, &x, &y, &w, &h); - evas_pointer_output_xy_get(evas_object_evas_get(obj), &m_x, &m_y); - s_info.dx = abs(m_x - x); - s_info.dy = abs(m_y - y); - - /*check if user perform longpress action on icon or on item. - (item is a container for icon..is bigger because it must have place also for icon name)*/ - if ((m_x >= x && m_x <= x+w) && (m_y >= y && m_y <= y + h)) { - s_info.repositioned_icon_layout = icon_layout; - s_info.repositioned_icon = icon; - s_info.repositioned_item = it; - s_info.repositioned_node = icon_node; - s_info.src_grid = obj; - s_info.src_idx = elm_gengrid_item_index_get(s_info.repositioned_item); - s_info.is_dnd_on = true; - - app_grid_unpack_item(it); - - if (__app_grid_icon_move_cb_set(NULL)) { - LOGE("Gesture cb set failed"); - - __app_grid_icon_move_cb_del(NULL); - } - - evas_object_data_set(icon, KEY_REPOSITION_DATA, icon_layout); - /*This is necessary for hide only box content in grid*/ - elm_object_part_content_unset(icon_layout, PART_ICON_CONTENT); - evas_object_hide(icon_layout); - all_apps_set_scrolling_blocked_state(true); - folder_panel_enable_entry(false); - } -} - -static char *__app_grid_get_text(void *data, Evas_Object *obj, const char *part) -{ - return NULL; -} - -static Evas_Object *__app_grid_get_content(void *data, Evas_Object *obj, const char *part) -{ - if (!data) { - LOGE("[INVALID_PARAM][data='%p']", data); - return NULL; - } - - if (!strcmp(GRID_CONTENT, part)) - return (Evas_Object *) data; - - return NULL; -} - -static Eina_Bool __app_grid_get_state(void *data, Evas_Object *obj, const char *part) -{ - return EINA_FALSE; -} - -static void __app_grid_del_content(void *data, Evas_Object *obj) -{ - LOGD("DELETING : ", evas_object_type_get(obj)); - -} - -static void __app_grid_resize_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - int w = -1, h = -1, item_w = -1, item_h = -1; - evas_object_geometry_get(obj, NULL, NULL, &w, &h); - - if ((app_grid_type_t)data == APP_GRID_TYPE_ALL_APPS) { - item_w = w/APP_COLS; - item_h = h/APP_ROWS; - } else if ((app_grid_type_t)data == APP_GRID_TYPE_FOLDER) { - item_w = (int)(w/FOLDER_COL_APPS - FOLDER_ITEM_MARGIN*home_screen_get_root_width()); - item_h = h/FOLDER_ROW_APPS; - } - - elm_gengrid_item_size_set(obj, item_w, item_h); -} - -/*=========================== MOUSE HANDLERS =====================================================*/ -static Eina_Bool __app_grid_mouse_up_cb(void *data, int type, void *event) -{ - LOGD(""); - - if (s_info.is_dnd_on) - __app_grid_icon_move_end(NULL, NULL); - - home_screen_set_indice_state(INDICE_OFF); - return ECORE_CALLBACK_RENEW; -} - -static Eina_Bool _app_grid_mouse_move_cb(void *data, int type, void *event) -{ - if (s_info.is_dnd_on) { - Evas_Object *scroller = (Evas_Object *) data; - Ecore_Event_Mouse_Move *move = event; - __app_grid_check_page_change(scroller, move->x, move->y); - } - - return ECORE_CALLBACK_RENEW; -} - -/*========================= PRIVATE FUNCTIONS ====================================================*/ -static bool __app_grid_fill(Evas_Object *grid, Tree_node_t *data) -{ - Evas_Object *icon = NULL, *box = NULL; - app_item_t *item = NULL; - Tree_node_t *it = NULL; - - if (!data || !grid) { - LOGE("[INVALID_PARAM][grid='%p'][data='%p']", grid, data); - return false; - } - - TREE_NODE_FOREACH(data, it) { - item = it->data; - if (!item) { - LOGE("[FAILED][item=%p", item); - continue; - } - - if (!item->exec || !item->icon || !item->label || !item->appid) { - LOGE("[FAILED][exec='%p'][icon='%p'][label='%p'][appid='%p']", - item->exec, item->label, item->icon, item->appid); - continue; - } - - LOGI("add item: [%s]", item->label); - - if (item->type == APP_ITEM_ICON) { - icon = app_icon_create(it, APP_ICON_TYPE_APP); - } else if (item->type == APP_ITEM_FOLDER) { - folder_panel_create(it); - app_icon_update_folder_icon(it); - icon = item->layout; - } - - if (!icon) { - LOGE("[FAILED][app_icon_create]"); - return false; - } - - if (!(item->grid_item = elm_gengrid_item_append(grid, s_info.gic, - (box = app_grid_item_pack(grid, icon)), NULL, NULL))) { - LOGE("Failed to append an item!"); - evas_object_del(box); - if (!box) {/*app_grid_item_pack had failed so the icon is still allocated:*/ - app_icon_destroy(icon); - } - return false; - } - - item->layout = icon; - } - - return true; -} - -static Evas_Object *__app_grid_create_ly(Evas_Object *parent) -{ - Evas_Object *ly = NULL; - - if (!parent) { - LOGE("[INVALID_PARAM][parent='%p']", parent); - return NULL; - } - - ly = elm_layout_add(parent); - if (!ly) { - LOGE("[FAILED][elm_layout_add]"); - return NULL; - } - - if (!elm_layout_file_set(ly, util_get_res_file_path(EDJE_DIR"/app_grid.edj"), GROUP_APP_GRID)) { - LOGE("[FAILED][elm_layout_file_set][%s]", util_get_res_file_path(EDJE_DIR"/app_grid.edj")); - evas_object_del(ly); - return NULL; - } - - evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(ly); - - return ly; -} - -void app_grid_set_view_mode(Evas_Object *app_grid, homescreen_view_t view) -{ - if (!app_grid) { - LOGE("[INVALID_PARAM]"); - return; - } - - switch (view) { - case HOMESCREEN_VIEW_ALL_APPS: - elm_object_signal_emit(app_grid, SIGNAL_CHOOSE_MODE_OFF, SIGNAL_SOURCE); - elm_object_signal_emit(app_grid, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE); - __app_grid_resize(app_grid, s_info.w, s_info.h); - break; - case HOMESCREEN_VIEW_ALL_APPS_EDIT: - elm_object_signal_emit(app_grid, SIGNAL_CHOOSE_MODE_OFF, SIGNAL_SOURCE); - elm_object_signal_emit(app_grid, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); - __app_grid_resize(app_grid, EDIT_MODE_SCALE*s_info.w, EDIT_MODE_SCALE*s_info.h); - break; - case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: - elm_object_signal_emit(app_grid, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE); - elm_object_signal_emit(app_grid, SIGNAL_CHOOSE_MODE_ON, SIGNAL_SOURCE); - __app_grid_resize(app_grid, CHOOSE_MODE_SCALE*s_info.w, CHOOSE_MODE_SCALE*s_info.h); - break; - default: - LOGE("[FAILED][type='%d']", view); - break; - } -} - -static bool __app_grid_resize(Evas_Object *app_grid, Evas_Coord new_w, Evas_Coord new_h) -{ - Evas_Object *gengrid = NULL; - - Evas_Coord new_item_w = new_w/APP_COLS; - Evas_Coord new_item_h = new_h/APP_ROWS; - - if (!app_grid) { - LOGE("[INVALID_PARAM][app_grid='%p']", app_grid); - return false; - } - - gengrid = elm_object_part_content_get(app_grid, PART_APP_GRID_CONTENT); - if (!gengrid) { - LOGE("[FAILED][elm_object_part_content_get]"); - return false; - } - - if (new_item_w < 0 || new_item_h < 0) { - LOGE("[INVALID_SIZE]"); - return false; - } - - /*elm_gengrid_item_size_set(gengrid, new_item_w, new_item_h);*/ - - return true; -} - -static Eina_Bool __app_grid_change_page_cb(void *data) -{ - LOGI("__app_grid_change_page_cb"); - change_page_data_t *ch_page_data = (change_page_data_t *) data; - Evas_Object *parent = NULL; - - s_info.change_page_timer = NULL; - - if (!ch_page_data) { - LOGE("[INVALID_PARAM][ch_page_data='%p']", ch_page_data); - return ECORE_CALLBACK_CANCEL; - } else if (!ch_page_data->parent) { - LOGE("[INVALID_PARAM][ch_page_data->parent='%p']", ch_page_data->parent); - return ECORE_CALLBACK_CANCEL; - } - - parent = ch_page_data->parent; - - if (ch_page_data->action == NEXT_PAGE_CB) { - LOGI("next_page_signal"); - elm_object_signal_emit(parent, SIGNAL_NEXT_PAGE_CHANGE, SIGNAL_SOURCE); - } - - if (ch_page_data->action == PREV_PAGE_CB) { - LOGI("prev_page_signal"); - elm_object_signal_emit(parent, SIGNAL_PREV_PAGE_CHANGE, SIGNAL_SOURCE); - } - - return ECORE_CALLBACK_CANCEL; -} - -static void __app_grid_check_page_change(Evas_Object *scroller, int x, int y) -{ - if (!scroller) { - LOGE("[INVALID_PARAM][scroller='%p']", scroller); - return; - } - - s_info.cp_data.parent = scroller; - home_screen_set_indice_state(INDICE_OFF); - - if (x < CHANGE_PAGE_RIGHT_AREA * home_screen_get_root_width() && - x > CHANGE_PAGE_LEFT_AREA * home_screen_get_root_width() && - s_info.change_page_timer) { - ecore_timer_del(s_info.change_page_timer); - s_info.change_page_timer = NULL; - return; - } - - if (x >= CHANGE_PAGE_RIGHT_AREA * home_screen_get_root_width()) { - home_screen_set_indice_state(INDICE_NEXT_PAGE_ON); - s_info.cp_data.action = NEXT_PAGE_CB; - } - - if (x <= CHANGE_PAGE_LEFT_AREA * home_screen_get_root_width()) { - home_screen_set_indice_state(INDICE_PREV_PAGE_ON); - s_info.cp_data.action = PREV_PAGE_CB; - } - - if (!s_info.change_page_timer) { - s_info.change_page_timer = ecore_timer_add(CHANGE_PAGE_TIMER, __app_grid_change_page_cb, - (void *) &s_info.cp_data); - } -} - -static Evas_Object *__app_grid_get_icon_container_ptr(Elm_Object_Item *it) -{ - Evas_Object *container = NULL; - - if (!it) { - LOGE("[INVALID_PARAM][it='%p']", it); - return NULL; - } - - container = elm_object_item_part_content_get(it, GRID_CONTENT); - return container; -} - -static void __app_grid_clear_reposition_structure(void) -{ - s_info.destination_folder = NULL; - s_info.repositioned_icon_layout = NULL; - s_info.repositioned_item = NULL; - s_info.repositioned_icon = NULL; - s_info.repositioned_node = NULL; - s_info.opened_folder_node = NULL; - s_info.src_grid = NULL; - s_info.src_idx = -1; - s_info.is_dnd_on = false; - - s_info.f_x = -1; - s_info.f_y = -1; - s_info.f_w = -1; - s_info.f_h = -1; - - if (s_info.outside_folder_timer) { - ecore_timer_del(s_info.outside_folder_timer); - s_info.outside_folder_timer = NULL; - } - - if (s_info.change_page_timer) { - ecore_timer_del(s_info.change_page_timer); - s_info.change_page_timer = NULL; - } -} - -static Eina_Bool __app_grid_close_folder_cb(void *data) -{ - data_model_detach_from_folder(s_info.opened_folder_node, s_info.repositioned_node); - folder_panel_close_folder(); - return EINA_FALSE; -} - -static Evas_Object *__app_grid_create_item_container(Evas_Object *parent) -{ - Evas_Object *container = NULL; - - if (!parent) { - LOGE("[INVALID_PARAM]"); - return NULL; - } - - container = elm_layout_add(parent); - - if (!elm_layout_file_set(container, util_get_res_file_path(EDJE_DIR"/app_grid.edj"), GROUP_APP_GRID_ITEM_CONTAINER)) { - LOGE("[FAILED][elm_layout_file_set][%s]", util_get_res_file_path(EDJE_DIR"/app_grid.edj")); - evas_object_del(container); - return NULL; - } - - evas_object_size_hint_weight_set(container, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(container); - return container; -} - -/*=============================== DND FUNCTIONS ==================================================*/ - -static void __app_grid_return_to_origin_pos(void) -{ - Evas_Object *container = NULL; - - if (!s_info.repositioned_item || !s_info.repositioned_icon_layout) { - LOGE("[FAILED][repositioned_item='%p'][repositioned_icon='%p']", - s_info.repositioned_item, s_info.repositioned_icon_layout); - return; - } - - container = __app_grid_get_icon_container_ptr(s_info.repositioned_item); - if (!container) { - LOGE("[FAILED][__app_grid_get_icon_container_ptr]"); - return; - } - - elm_object_part_content_set(container, PART_APP_GRID_ITEM, s_info.repositioned_icon_layout); - elm_object_part_content_set(s_info.repositioned_icon_layout, - PART_ICON_CONTENT, s_info.repositioned_icon); - evas_object_show(s_info.repositioned_icon_layout); -} - -static void __app_grid_icon_drop(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y, - Elm_Xdnd_Action action) -{ - static Elm_Object_Item *it = NULL; - Evas_Object *icon = NULL; - Evas_Object *old_icon = NULL; - Elm_Object_Item *old_it = it; - Tree_node_t *destination_icon_data = NULL; - - it = elm_gengrid_at_xy_item_get(obj, x, y, NULL, NULL); - - app_grid_get_item_content(old_it, &old_icon, NULL); - app_grid_get_item_content(it, &icon, &destination_icon_data); - - if (!s_info.repositioned_node || !s_info.repositioned_node->data) { - LOGE("[INVALID_DATA]"); - return; - } - - if (it != old_it) { - elm_object_signal_emit(old_icon, SIGNAL_UNHIGHLIGHT_FOLDER, SIGNAL_SOURCE); - /*function not be invoked when s_info.repositioned_node == NULL;*/ - if (s_info.repositioned_node->data->type == APP_ITEM_FOLDER || - folder_panel_get_items_count(destination_icon_data) >= FOLDER_MAX_ITEMS) { - elm_object_signal_emit(icon, SIGNAL_HIGHLIGHT_IMPOSSIBLE_FOLDER, SIGNAL_SOURCE); - } else { - elm_object_signal_emit(icon, SIGNAL_HIGHLIGHT_FOLDER, SIGNAL_SOURCE); - } - } - - if (destination_icon_data && destination_icon_data->data->type == APP_ITEM_FOLDER) { - s_info.destination_folder = destination_icon_data; - } else { - s_info.destination_folder = NULL; - } -} - -static void __app_grid_drag_done(void *data, Evas_Object *obj) -{ - Tree_node_t *folder = s_info.destination_folder; - Tree_node_t *item = s_info.repositioned_node; - Tree_node_t *src_folder = s_info.opened_folder_node; - - char trbuf[PATH_MAX] = {0, }; - - /*Check if folder has empty space*/ - if (item && folder && folder_panel_get_items_count(folder) < FOLDER_MAX_ITEMS - && item->data->type != APP_ITEM_FOLDER) { - home_screen_mvc_drag_item_to_folder_cb(item, folder); - evas_object_hide(s_info.repositioned_icon); - } else if (item && folder && folder_panel_get_items_count(folder) >= FOLDER_MAX_ITEMS) { - popup_data_t *p_data = popup_create_data(); - if (!p_data) { - LOGE("[FAILED][failed to create popup data]"); - return; - } - - snprintf(trbuf, sizeof(trbuf), _("IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED"), - FOLDER_APPS_PAGE); - - p_data->type = POPUP_INFO; - p_data->popup_title_text = NULL; - p_data->popup_content_text = strdup(trbuf); - p_data->popup_confirm_text = NULL; - p_data->popup_cancel_text = NULL; - p_data->orientation = ELM_POPUP_ORIENT_CENTER; - p_data->visible_time = 1.5; - - popup_show(p_data, NULL, NULL, NULL); - - __app_grid_return_to_origin_pos(); - } else if (item && src_folder && !folder_panel_is_folder_visible()) { - home_screen_mvc_drag_item_from_folder_cb(); - elm_object_part_content_set(s_info.repositioned_icon_layout, PART_ICON_CONTENT, - s_info.repositioned_icon); - app_icon_set_view_mode(s_info.repositioned_icon_layout, home_screen_get_view_type(), false); - } else { - __app_grid_return_to_origin_pos(); - } - - if (folder && folder->data->layout) - elm_object_signal_emit(folder->data->layout, SIGNAL_UNHIGHLIGHT_FOLDER, SIGNAL_SOURCE); - - __app_grid_clear_reposition_structure(); - all_apps_set_scrolling_blocked_state(false); - folder_panel_enable_entry(true); -} diff --git a/src/app_icon.c b/src/app_icon.c deleted file mode 100644 index 2c3bb41..0000000 --- a/src/app_icon.c +++ /dev/null @@ -1,724 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - -#include "homescreen-efl.h" -#include "app_icon.h" -#include "all_apps.h" -#include "util.h" -#include "folder_panel.h" -#include "option_menu.h" -#include "folder_panel.h" -#include "popup.h" -#include "app_grid.h" -#include "data_model.h" - -#define MAX_BADGE_COUNT_STR_LEN 32 -#define MAX_BADGE_DISPLAY_COUNT 999 -#define ABOVE_MAX_BADGE_APPENDIX "+" - -static struct { - Evas_Object *icon_layout; - Evas_Object *icon_image; - char *runned_app_id; - bool click_ignore; - -} s_info = { - .icon_layout = NULL, - .icon_image = NULL, - .runned_app_id = NULL, - .click_ignore = false, -}; - -static void __app_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_pressed_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data); -static bool __app_icon_check_removeable_state(Evas_Object *icon); -static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_uncheck_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static Evas_Object *__app_icon_load(Evas_Object *parent, const char *icon_path); -static void __app_icon_uninstall_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_highlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_unhighlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __app_icon_higlight_impossible_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source); - -/*=========================================PUBLIC FUNCTIONS IMPLEMENTATION===========================================*/ -HAPI Evas_Object *app_icon_create(Tree_node_t *tree_data, app_icon_type_t type) -{ - Evas_Object *icon_image = NULL, *icon_layout = NULL, *folder_icon_layout = NULL; - Evas_Object *parent = home_screen_get_win(); - app_item_t *item = NULL; - - if (!parent || !tree_data) { - LOGE("[INVALID_PARAM][parent='%p'][item='%p']", parent, tree_data); - return NULL; - } - - item = tree_data->data; - if (!item) { - LOGE("[FAILED][item='%p']", item); - return NULL; - } - - if (type == APP_ICON_TYPE_APP || type == APP_ICON_TYPE_FOLDER) { - icon_layout = util_create_edje_layout(parent, util_get_res_file_path(EDJE_DIR"/icon.edj"), GROUP_ICON_LY); - if (!icon_layout) { - LOGE("Failed to create icon layout"); - return NULL; - } - - elm_object_signal_callback_add(icon_layout, SIGNAL_CHECKBOX_CHECKED, SIGNAL_SOURCE, - __app_icon_check_cb, tree_data); - elm_object_signal_callback_add(icon_layout, SIGNAL_CHECKBOX_UNCHECKED, SIGNAL_SOURCE, - __app_icon_uncheck_cb, tree_data); - elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE, - __app_icon_uninstall_button_clicked_cb, tree_data); - - elm_object_signal_callback_add(icon_layout, "mouse,down,1", SIGNAL_PRESS_SOURCE, - __app_icon_pressed_cb, (void *)item->type); - - home_screen_mvc_set_ly_scale(icon_layout); - } - - if (type == APP_ICON_TYPE_APP) { - icon_image = __app_icon_load(icon_layout, item->icon); - if (!icon_image) { - LOGE("Failed to create icon layout"); - evas_object_del(icon_layout); - return NULL; - } - - elm_object_part_content_set(icon_layout, PART_ICON_CONTENT, icon_image); - elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, __app_icon_clicked_cb, (void *)item->appid); - - app_icon_set_label(icon_layout, item->label); - - if (item->badge_count > 0) - app_icon_show_badge(icon_layout, item->badge_count); - - evas_object_show(icon_image); - } else if (type == APP_ICON_TYPE_FOLDER) { - folder_icon_layout = elm_layout_add(parent); - if (!folder_icon_layout) { - LOGE("Failed to create icon layout"); - evas_object_del(icon_layout); - return NULL; - } - - if (!elm_layout_file_set(folder_icon_layout, util_get_res_file_path(EDJE_DIR"/folder.edj"), GROUP_FOLDER_ICON_LAYOUT)) { - LOGE("Failed to load edje file for layout"); - evas_object_del(folder_icon_layout); - evas_object_del(icon_layout); - return NULL; - } - - elm_object_part_content_set(icon_layout, PART_ICON_CONTENT, folder_icon_layout); - elm_object_signal_callback_add(icon_layout, SIGNAL_HIGHLIGHT_FOLDER, SIGNAL_SOURCE, __app_icon_highlight_folder_icon_cb, item); - elm_object_signal_callback_add(icon_layout, SIGNAL_HIGHLIGHT_IMPOSSIBLE_FOLDER, SIGNAL_SOURCE, __app_icon_higlight_impossible_folder_icon_cb, item); - elm_object_signal_callback_add(icon_layout, SIGNAL_UNHIGHLIGHT_FOLDER, SIGNAL_SOURCE, __app_icon_unhighlight_folder_icon_cb, item); - app_icon_set_label(icon_layout, item->label); - evas_object_show(folder_icon_layout); - } else { - /*create miniatures*/ - if (item->icon) { - icon_layout = __app_icon_load(parent, item->icon); - if (!icon_layout) { - LOGE("Failed to create icon layout"); - return NULL; - } - } - } - - evas_object_size_hint_align_set(icon_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(icon_layout); - - evas_object_data_set(icon_layout, KEY_ICON_DATA, tree_data); - evas_object_data_set(icon_layout, KEY_IS_REPOSITIONABLE, (void *)true); - - return icon_layout; -} - -HAPI void app_icon_update_folder_icon(Tree_node_t *folder_node) -{ - LOGI(""); - Evas_Object *miniatures_list_item = NULL; - Evas_Object *folder_icon = NULL; - Evas_Object *item = NULL; - Eina_List *it = NULL; - Tree_node_t *it2; - folder_data_t *folder_data = NULL; - app_item_t *tree_item = NULL; - - char part_buf[BUF_SIZE]; - char signal_buf[BUF_SIZE]; - - int miniatures = 0; - int miniatures_iterator = 0; - - if (!folder_node || !folder_node->data || !folder_node->data->layout || !folder_node->data->data) { - LOGE("[INVALID_PARAMS]"); - return; - } - - folder_icon = elm_object_part_content_get(folder_node->data->layout, PART_ICON_CONTENT); - if (!folder_icon) { - LOGE("Failed to get folder icon"); - return; - } - - folder_data = (folder_data_t *)folder_node->data->data; - - if (!folder_data) { - LOGE("Failed to get folder_data"); - return; - } - - EINA_LIST_FOREACH(folder_data->miniatures, it, miniatures_list_item) { - snprintf(part_buf, sizeof(part_buf), "miniature_%d", miniatures_iterator++); - elm_object_part_content_unset(folder_icon, part_buf); - evas_object_del(miniatures_list_item); - } - folder_data->miniatures = eina_list_free(folder_data->miniatures); - folder_data->miniatures = NULL; - - if (!folder_node->first || !(miniatures = folder_node->first->count)) { - elm_object_signal_emit(folder_icon, SIGNAL_EMPTY_BG_SHOW, SIGNAL_SOURCE); - return; - } - - if (miniatures >= 3) { - miniatures = 4; - } - - miniatures_iterator = 0; - TREE_NODE_FOREACH(folder_node->first, it2) - { - tree_item = it2->data; - - if (tree_item) { - if (miniatures_iterator >= FOLDER_ICON_MAX_MINIATURES) - break; - LOGI("label %s", tree_item->label); - item = app_icon_create(it2, APP_ICON_TYPE_MINIATURE); - - if (!item) - return; - - folder_data->miniatures = eina_list_append(folder_data->miniatures, item); - if (!folder_data->miniatures) { - app_icon_destroy(item); - return; - } - - snprintf(part_buf, sizeof(part_buf), "miniature_%d", miniatures_iterator++); - elm_object_part_content_set(folder_icon, part_buf, item); - } - } - - snprintf(signal_buf, sizeof(signal_buf), "set,miniatures,%d", miniatures); - elm_object_signal_emit(folder_icon, signal_buf, SIGNAL_SOURCE); -} - -HAPI void app_icon_highlight_folder_icon(Evas_Object *folder_icon_layout, folder_icon_frame_type_t frame_type) -{ - Evas_Object *icon = NULL; - Tree_node_t *node = NULL; - - if (!folder_icon_layout) { - LOGE("Invalid parameter"); - return; - } - - icon = elm_object_part_content_get(folder_icon_layout, PART_ICON_CONTENT); - if (!icon) { - LOGE("Failed to get icon"); - return; - } - - node = evas_object_data_get(folder_icon_layout, KEY_ICON_DATA); - if (!node) { - LOGE("[FAILED][node=NULL]"); - return; - } - - LOGI("count %d ", node->count); - - if (frame_type == FOLDER_ICON_FRAME_POSSIBLE) { - elm_object_signal_emit(icon, SIGNAL_FRAME_POSSIBLE_SHOW, SIGNAL_SOURCE); - } else if (frame_type == FOLDER_ICON_FRAME_IMPOSSIBLE) { - elm_object_signal_emit(icon, SIGNAL_FRAME_IMPOSSIBLE_SHOW, SIGNAL_SOURCE); - } else { - elm_object_signal_emit(icon, SIGNAL_FRAME_HIDE, SIGNAL_SOURCE); - } -} - -HAPI void app_icon_set_click_ignore(bool ignore) -{ - s_info.click_ignore = ignore; - folder_panel_set_click_ignore_state(ignore); -} - -HAPI bool app_icon_set_view_mode(Evas_Object *icon, homescreen_view_t view, bool in_folder) -{ - Tree_node_t *node = NULL; - - switch (view) { - case HOMESCREEN_VIEW_ALL_APPS: - in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_OFF, SIGNAL_SOURCE) : - elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE); - elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_HIDE, SIGNAL_SOURCE); - elm_object_signal_emit(icon, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE); - app_icon_set_click_ignore(false); - break; - case HOMESCREEN_VIEW_ALL_APPS_EDIT: - in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE) : - elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); - if (__app_icon_check_removeable_state(icon)) - elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_SHOW, SIGNAL_SOURCE); - app_icon_set_click_ignore(true); - break; - case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: - in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE) : - elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); - elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_HIDE, SIGNAL_SOURCE); - - node = evas_object_data_get(icon, KEY_ICON_DATA); - if (node && node->data->type != APP_ITEM_FOLDER) - elm_object_signal_emit(icon, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE); - else - elm_object_signal_emit(icon, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE); - - app_icon_set_click_ignore(true); - break; - case HOMESCREEN_VIEW_HOME: - case HOMESCREEN_VIEW_HOME_EDIT: - case HOMESCREEN_VIEW_HOME_ALL_PAGES: - default: - app_icon_set_click_ignore(true); - break; - } - - return true; -} - -HAPI void app_icon_set_label(Evas_Object *icon_layout, const char* label) -{ - if (!icon_layout || !label) { - LOGE("Invalid parameter"); - return; - } - - elm_object_part_text_set(icon_layout, PART_ICON_NAME, label); -} - -HAPI void app_icon_set_label_black(Evas_Object *icon_layout) -{ - if (home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS_EDIT) { - elm_object_signal_emit(icon_layout, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE); - } else { - elm_object_signal_emit(icon_layout, SIGNAL_BLACK_TEXT, SIGNAL_SOURCE); - } -} - -HAPI void app_icon_set_color(Evas_Object *icon_layout, int r, int g, int b, int a) -{ - if (!icon_layout) { - LOGE("Failed to get folder icon layout"); - return; - } - - evas_object_color_set(icon_layout, r, g, b, a); -} - -HAPI void app_icon_destroy(Evas_Object *icon_layout) -{ - if (!icon_layout) { - LOGE("Invalid parameter : icon_layout is NULL"); - return; - } - - evas_object_del(icon_layout); -} - - -HAPI void app_icon_show_badge(Evas_Object *app_icon_layout, const unsigned int number) -{ - char number_str[MAX_BADGE_COUNT_STR_LEN]; - - if (!app_icon_layout) { - LOGE("Invalid state of the application - icon_layout is NULL"); - return; - } - - if (number == 0) { - app_icon_hide_badge(app_icon_layout); - return; - } - - if (number > MAX_BADGE_DISPLAY_COUNT) { - eina_convert_itoa(MAX_BADGE_DISPLAY_COUNT, number_str); - strncat(number_str, ABOVE_MAX_BADGE_APPENDIX, MAX_BADGE_COUNT_STR_LEN); - } else { - eina_convert_itoa(number, number_str); - } - - elm_layout_text_set(app_icon_layout, "icon_badge_text", number_str); - - elm_object_signal_emit(app_icon_layout, SIGNAL_BADGE_SHOW, SIGNAL_SOURCE); -} - -HAPI void app_icon_hide_badge(Evas_Object *app_icon_layout) -{ - if (!app_icon_layout) { - LOGE("Invalid state of the application - icon_layout is NULL"); - return; - } - - elm_object_signal_emit(app_icon_layout, SIGNAL_BADGE_HIDE, SIGNAL_SOURCE); -} - -HAPI void app_icon_show_label(Evas_Object *app_icon_layout) -{ - Evas_Object *icon = NULL; - - if (app_icon_layout) { - icon = elm_object_part_content_get(app_icon_layout, PART_ICON_CONTENT); - if (icon) - elm_object_signal_emit(icon, SIGNAL_LABEL_SHOW, SIGNAL_SOURCE); - } -} - -HAPI void app_icon_hide_label(Evas_Object *app_icon_layout) -{ - Evas_Object *icon = NULL; - - if (app_icon_layout) { - icon = elm_object_part_content_get(app_icon_layout, PART_ICON_CONTENT); - if (icon) - elm_object_signal_emit(icon, SIGNAL_LABEL_HIDE, SIGNAL_SOURCE); - } -} - -HAPI void app_icon_remove(Evas_Object *icon_layout) -{ - if (!icon_layout) { - LOGE("[INVALID_PARAM]"); - return; - } - - evas_object_data_del(icon_layout, KEY_ICON_DATA); - evas_object_del(icon_layout); -} - - -/*=========================================PRIVATE FUNCTIONS IMPLEMENTATION======================================*/ -static void __app_icon_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data) -{ - LOGD("[__app_icon_launch_request_cb]"); - switch (result) { - case APP_CONTROL_RESULT_CANCELED: - LOGD("[APP_CONTROL_RESULT_CANCELED]"); - s_info.runned_app_id = NULL; - break; - case APP_CONTROL_RESULT_FAILED: - LOGD("[APP_CONTROL_RESULT_FAILED]"); - s_info.runned_app_id = NULL; - break; - case APP_CONTROL_RESULT_SUCCEEDED: - LOGD("[APP_CONTROL_RESULT_SUCCEEDED]"); - break; - default: - LOGD("UNKNOWN ERROR"); - s_info.runned_app_id = NULL; - break; - } -} - -static void __app_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - char *appid = (char *) data; - app_control_h app_control_handle = NULL; - - if (!appid) { - LOGE("Failed to obtain pgk_id of clicked application"); - return; - } - - if (s_info.click_ignore == false) { - if (!s_info.runned_app_id) { - folder_panel_close_folder(); - - if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_create]"); - return; - } - - if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_set_app_id]"); - app_control_destroy(app_control_handle); - return; - } - - if (app_control_send_launch_request(app_control_handle, __app_icon_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_send_launch_request]"); - app_control_destroy(app_control_handle); - return; - } - app_control_destroy(app_control_handle); - } - } - -} - -static void __app_icon_pressed_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - app_item_type_t type = (app_item_type_t)data; - - if (type == APP_ITEM_FOLDER || - home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS) - elm_object_signal_emit(obj, SIGNAL_ICON_PRESS, SIGNAL_PRESS_SOURCE); -} - -static bool __app_icon_check_removeable_state(Evas_Object *icon) -{ - Tree_node_t *item = NULL; - if (!icon) { - LOGE("[INVALID_PARAM][icon='%p']", icon); - return false; - } - - item = evas_object_data_get(icon, KEY_ICON_DATA); - if (!item) { - LOGE("[FAILED][evas_object_data_get]"); - return false; - } - - if (!item->data) { - LOGE("[FAILED][item->data='%p']", item->data); - return false; - } - - return item->data->removable; -} - -static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE; - Tree_node_t *node = (Tree_node_t *)data; - app_item_t *item = node->data; - int count = -1; - char trbuf[PATH_MAX] = {0, }; - - if (item->type == APP_ITEM_ICON) { - item->is_checked = true; - if (node->parent->parent->data->type == APP_ITEM_FOLDER) { - - check_info = folder_panel_set_content_checked(node->parent->parent); - - switch (check_info) { - case FOLDER_PANEL_CHECKED_NONE: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE); - break; - case FOLDER_PANEL_CHECKED_ANY: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE); - break; - case FOLDER_PANEL_CHECKED_ALL: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE); - break; - } - } - } else if (item->type == APP_ITEM_FOLDER) { - data_model_check_all_apps(node, true); - } - option_menu_update_on_item_selected(); - - count = data_model_get_app_check_state(); - if (count > FOLDER_MAX_ITEMS) { - __app_icon_uncheck_cb(data, obj, SIGNAL_CHECKBOX_UNCHECKED, SIGNAL_SOURCE); - elm_object_signal_emit(node->data->layout, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE); - - popup_data_t *p_data = popup_create_data(); - if (!p_data) { - LOGE("[FAILED][failed to create popup data]"); - return; - } - - snprintf(trbuf, sizeof(trbuf), _("IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED"), - FOLDER_APPS_PAGE); - - p_data->type = POPUP_INFO; - p_data->popup_title_text = NULL; - p_data->popup_content_text = strdup(trbuf); - p_data->popup_confirm_text = NULL; - p_data->popup_cancel_text = NULL; - p_data->orientation = ELM_POPUP_ORIENT_CENTER; - p_data->visible_time = 2.0; - - popup_show(p_data, NULL, NULL, NULL); - } -} - -static void __app_icon_uncheck_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE; - - Tree_node_t *node = (Tree_node_t *)data; - app_item_t *item = node->data; - if (item->type == APP_ITEM_ICON) { - item->is_checked = false; - - if (node->parent->parent->data->type == APP_ITEM_FOLDER) { - - check_info = folder_panel_set_content_checked(node->parent->parent); - - switch (check_info) { - case FOLDER_PANEL_CHECKED_NONE: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE); - break; - case FOLDER_PANEL_CHECKED_ANY: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE); - break; - case FOLDER_PANEL_CHECKED_ALL: - elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE); - break; - } - } - } else if (item->type == APP_ITEM_FOLDER) { - data_model_check_all_apps(node, false); - elm_object_signal_emit(item->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE); - } - option_menu_update_on_item_selected(); -} - -Evas_Object *__app_icon_load(Evas_Object *parent, const char *icon_path) -{ - Evas_Object *icon_image = NULL; - - if (!parent || !icon_path) { - LOGE("Invalid parameter"); - return NULL; - } - - icon_image = elm_image_add(parent); - if (!icon_image) { - LOGE("Failed to create an icon."); - return NULL; - } - - if ((strncmp("", icon_path, strlen(icon_path)) && elm_image_file_set(icon_image, icon_path, NULL)) || elm_image_file_set(icon_image, util_get_res_file_path(DEFAULT_APP_ICON), NULL)) - return icon_image; - - evas_object_del(icon_image); - return NULL; -} - -static void __app_icon_uninstall_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - LOGI("__app_icon_uninstall_button_clicked_cb"); - Tree_node_t *app_node = NULL; - char buf[BUF_SIZE] = {0, }; - - app_node = (Tree_node_t *) data; - if (!app_node) { - LOGE("[FAILED][evas_object_data_get]"); - return; - } - - if (!app_node->data || !app_node->data->label) { - LOGE("[INVALID][invalid node data]"); - return; - } - - popup_data_t *p_data = popup_create_data(); - if (!p_data) { - LOGE("[FAILED][failed to create popup data]"); - return; - } - - if ((app_node->data->type == APP_ITEM_FOLDER) && (folder_panel_get_items_count(app_node) > 0)) { - p_data->type = POPUP_TWO_BUTTONS; - p_data->popup_title_text = strdup(_("IDS_HS_HEADER_REMOVE_FOLDER_ABB")); - p_data->popup_content_text = strdup(_("IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED")); - p_data->popup_confirm_text = strdup(_("IDS_ST_BUTTON_REMOVE_ABB2")); - p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL")); - p_data->orientation = ELM_POPUP_ORIENT_CENTER; - popup_show(p_data, app_icon_uninstall, NULL, (void *) obj); - } else if (app_node->data->type == APP_ITEM_ICON) { - snprintf(buf, sizeof(buf), _("IDS_HS_POP_PS_WILL_BE_UNINSTALLED"), app_node->data->label); - p_data->type = POPUP_TWO_BUTTONS; - p_data->popup_title_text = strdup(_("IDS_AT_BODY_UNINSTALL")); - p_data->popup_content_text = strdup(buf); - p_data->popup_confirm_text = strdup(_("IDS_AT_BODY_UNINSTALL")); - p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL")); - p_data->orientation = ELM_POPUP_ORIENT_CENTER; - popup_show(p_data, app_icon_uninstall, NULL, (void *) obj); - } else { - app_icon_uninstall((void *) obj); - popup_data_free(p_data); - } -} - -void app_icon_uninstall(void *data) -{ - Tree_node_t *app_node = NULL; - Evas_Object *icon = NULL; - - icon = (Evas_Object *) data; - if (!icon) { - LOGE("[INVALID_PARAM][data='%p']", data); - return; - } - - LOGI("[%s]", evas_object_type_get(icon)); - - app_node = evas_object_data_get(icon, KEY_ICON_DATA); - if (!app_node || !app_node->data) { - LOGE("[FAILED][evas_object_data_get]"); - return; - } - - all_apps_detach_from_grid(app_node->data->grid_item); - app_node->data->grid_item = NULL; - app_icon_remove(icon); - app_node->data->layout = NULL; - - home_screen_mvc_item_uninstall_cb(app_node); -} - -static void __app_icon_highlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT); - elm_object_signal_emit(icon, SIGNAL_FRAME_POSSIBLE_SHOW, SIGNAL_SOURCE); -} - -static void __app_icon_unhighlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT); - elm_object_signal_emit(icon, SIGNAL_FRAME_HIDE, SIGNAL_SOURCE); -} - -static void __app_icon_higlight_impossible_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT); - elm_object_signal_emit(icon, SIGNAL_FRAME_IMPOSSIBLE_SHOW, SIGNAL_SOURCE); -} -/*===============================================================================================================*/ diff --git a/src/app_item.c b/src/app_item.c deleted file mode 100644 index 4e43188..0000000 --- a/src/app_item.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "homescreen-efl.h" -#include "app_item.h" -#include "app_mgr.h" - -static struct -{ - int unique_id; -} s_app_item_info = { - .unique_id = -1 -}; - -HAPI app_item_t *app_item_create(const app_item_type_t type, const int unique_id, - const char *label, const char *icon, const char *exec, - const char *appid, void *data, bool is_removeable, - int col, int row, int col_span, int row_span, - const char *content_info) -{ - app_item_t *item = (app_item_t *)calloc(1, sizeof(app_item_t)); - - if (!item) { - dlog_print(DLOG_ERROR, LOG_TAG, "[ALLOC_FAILED]"); - return NULL; - } - - item->type = type; - if (unique_id < 0) { - item->unique_id = ++s_app_item_info.unique_id; - } else { - item->unique_id = unique_id; - s_app_item_info.unique_id = s_app_item_info.unique_id > unique_id ? s_app_item_info.unique_id : unique_id; - } - - if (label) - item->label = strdup(label); - if (icon) - item->icon = strdup(icon); - if (exec) - item->exec = strdup(exec); - if (appid) - item->appid = strdup(appid); - if (content_info) - item->content_info = strdup(content_info); - - item->badge_count = 0; - item->data = data; - item->removable = is_removeable; - item->is_checked = false; - item->layout = NULL; - item->grid_item = NULL; - - item->col = col; - item->row = row; - item->col_span = col_span; - item->row_span = row_span; - - - return item; -} - -HAPI void app_item_free(app_item_t *item) -{ - if (!item) - return; - - free((void *)item->label); - free((void *)item->icon); - free((void *)item->exec); - free((void *)item->appid); - free((void *)item->content_info); - - evas_object_data_del(item->layout, KEY_ICON_DATA); - - free(item); -} - -HAPI void app_item_geometry_update(app_item_t *app_item, int x, int y, int w, int h) -{ - if (!app_item) { - LOGE("app_item == NULL"); - return; - } - - app_item->col = x; - app_item->row = y; - app_item->col_span = w; - app_item->row_span = h; -} - -HAPI void app_item_update_content_info(app_item_t *app_item, const char *content_info) -{ - if (!app_item) { - LOGE("app_item == NULL"); - return; - } - - if (app_item->content_info) - free(app_item->content_info); - - if (content_info) { - app_item->content_info = strdup(content_info); - } else { - app_item->content_info = NULL; - } -} - - diff --git a/src/app_mgr.c b/src/app_mgr.c deleted file mode 100644 index 4720064..0000000 --- a/src/app_mgr.c +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "homescreen-efl.h" -#include "app_mgr.h" -#include "util.h" -#include "data_model.h" -#include "app_icon.h" - -static struct -{ - package_manager_h pack_mgr; -} s_app_mgr_info = { - .pack_mgr = NULL, -}; - -static bool __app_info_cb(app_info_h ai, void *ud); -static void __app_mgr_event_cb(const char *type, const char *package, - package_manager_event_type_e event_type, - package_manager_event_state_e event_state, - int progress, - package_manager_error_e error, - void *user_data); - -static app_mgr_item_t *__app_mgr_load_item_info(app_info_h ai_h); - -HAPI void app_mgr_init(void) -{ - package_manager_error_e res_stat = PACKAGE_MANAGER_ERROR_NONE; - package_manager_error_e res_cb = PACKAGE_MANAGER_ERROR_NONE; - - if (s_app_mgr_info.pack_mgr) - return; - - if (PACKAGE_MANAGER_ERROR_NONE == - package_manager_create(&s_app_mgr_info.pack_mgr)) { - LOGD("PACKAGE_EVENT_MGR - handle obtained"); - - res_stat = package_manager_set_event_status( - s_app_mgr_info.pack_mgr, - PACKAGE_MANAGER_STATUS_TYPE_INSTALL | - PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL); - - res_cb = package_manager_set_event_cb( - s_app_mgr_info.pack_mgr, __app_mgr_event_cb, NULL); - - if (res_stat != PACKAGE_MANAGER_ERROR_NONE || - res_cb != PACKAGE_MANAGER_ERROR_NONE) - LOGE("App mgr initialization failed!"); - } else { - s_app_mgr_info.pack_mgr = NULL; - } -} - -HAPI void app_mgr_deinit(void) -{ - if (s_app_mgr_info.pack_mgr) { - LOGD("PACKAGE_EVENT_MGR - freeing handle"); - package_manager_unset_event_cb(s_app_mgr_info.pack_mgr); - package_manager_destroy(s_app_mgr_info.pack_mgr); - } -} - -HAPI Eina_List *app_mgr_get_apps(void) -{ - Eina_List *apps = NULL; - app_manager_foreach_app_info(__app_info_cb, &apps); - return apps; -} - -HAPI void app_mgr_free_apps(Eina_List *apps) -{ - app_mgr_item_t *app_mgr_item; - EINA_LIST_FREE(apps, app_mgr_item) - free(app_mgr_item); -} - -HAPI Eina_Bool app_mgr_uninstall_app(const char *appid) -{ - LOGI(""); - - package_manager_request_h request; - int id = 0; - - if (package_manager_request_create(&request) - != PACKAGE_MANAGER_ERROR_NONE) { - LOGE("Could not create unistall request. App: %s", appid); - return EINA_FALSE; - } - - int ret = package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_DEFAULT); - if (ret != PACKAGE_MANAGER_ERROR_NONE) { - LOGE("Could not set request mode. App: %s", appid); - return EINA_FALSE; - } - - if (package_manager_request_uninstall(request, appid, &id) != - PACKAGE_MANAGER_ERROR_NONE) { - LOGE("Could not uninstall application. App: %s", appid); - return EINA_FALSE; - } - - if (package_manager_request_destroy(request) != - PACKAGE_MANAGER_ERROR_NONE) { - LOGE("Could not destroy unistall request. App: %s", appid); - return EINA_FALSE; - } - - return EINA_TRUE; -} - -HAPI Eina_Bool app_mgr_app_get_badge_count(const char *app_id, - unsigned int *count) -{ - unsigned int to_be_displayed = 0; - int result = BADGE_ERROR_NONE; - - if (!app_id) { - LOGE("app_item is NULL in badge count"); - return EINA_FALSE; - } - - *count = 0; - result = badge_get_display(app_id, &to_be_displayed); - - if (result != BADGE_ERROR_NONE) { - if ((result == BADGE_ERROR_SERVICE_NOT_READY || - result == BADGE_ERROR_NOT_EXIST)) - return true; - - LOGE("badge_get_display error %d", result); - return false; - } - - if (!to_be_displayed) - return EINA_TRUE; - - result = badge_get_count(app_id, count); - - if (result != BADGE_ERROR_NONE) { - *count = 0; - if ((result == BADGE_ERROR_SERVICE_NOT_READY || - result == BADGE_ERROR_NOT_EXIST)) - return true; - - LOGE("badge_get_count error %d", result); - return false; - } - - return EINA_TRUE; -} - -HAPI void app_mgr_register_badge_callback(badge_change_cb callback) -{ - int ret = BADGE_ERROR_NONE; - ret = badge_register_changed_cb(callback, NULL); - - if (ret != BADGE_ERROR_NONE) - LOGE("Could not register badge callback"); -} - -HAPI void app_mgr_unregister_badge_callback(badge_change_cb callback) -{ - int ret = BADGE_ERROR_NONE; - ret = badge_unregister_changed_cb(callback); - - if (ret != BADGE_ERROR_NONE) - LOGE("Could not unregister badge callback"); -} - -HAPI char *app_mgr_get_app_label(const char *app_id) -{ - app_info_h ai_handle; - char *label = NULL; - - if (!app_id) { - LOGE("Invalid parameter"); - return NULL; - } - - if (app_info_create(app_id, &ai_handle) != APP_MANAGER_ERROR_NONE) { - LOGE("Failed to load application id"); - return NULL; - } - - if (app_info_get_label(ai_handle, &label) != APP_MANAGER_ERROR_NONE) { - LOGE("Failed to get label!"); - app_info_destroy(ai_handle); - return NULL; - } - - app_info_destroy(ai_handle); - return label; -} - -static void __app_mgr_event_cb(const char *type, const char *package, - package_manager_event_type_e event_type, - package_manager_event_state_e event_state, int progress, - package_manager_error_e error, void *user_data) -{ - if (PACKAGE_MANAGER_ERROR_NONE != error) { - LOGE("PACKAGE_EVENT_MGR error in cb"); - return; - } - - if (PACKAGE_MANAGER_EVENT_STATE_FAILED == event_state) - progress = 0; - - if (PACKAGE_MANAGER_EVENT_TYPE_INSTALL == event_type && progress == 100) { - LOGD("%s", package); - app_info_h ai_handle = NULL; - app_mgr_item_t *app_mgr_item = NULL; - Tree_node_t *item = NULL; - - app_info_create(package, &ai_handle); - if (!ai_handle) { - LOGE("Failed to get app info handle"); - return; - } - - app_mgr_item = __app_mgr_load_item_info(ai_handle); - if (!app_mgr_item) { - LOGE("Failed to load app mgr item info"); - app_info_destroy(ai_handle); - return; - } - - item = data_model_install_application(app_mgr_item); - if (!item) { - LOGE("Failed to create app item"); - app_info_destroy(ai_handle); - return; - } - - item->data->layout = app_icon_create(item, APP_ICON_TYPE_APP); - app_info_destroy(ai_handle); - home_screen_mvc_update_view(); - - } - - if (PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL == event_type && progress == 100) - { - LOGI("%s", package); - Tree_node_t *it = data_model_search_package(package); - Tree_node_t *parent_folder = NULL; - - if (it != NULL) { - if (it->parent && it->parent->parent - && (it->parent->parent->data->type == APP_ITEM_FOLDER)) - parent_folder = it->parent->parent; - - app_icon_uninstall(it->data->layout); - - if (parent_folder != NULL) - app_icon_update_folder_icon(parent_folder); - } - } -} - -static bool __app_info_cb(app_info_h ai, void *ud) -{ - app_mgr_item_t *app_mgr_item = NULL; - bool nodisplay = false; - Eina_List **list = (Eina_List **)ud; - - if (app_info_is_nodisplay(ai, &nodisplay)) { - LOGE("[FAILED][app_info_is_nodisplay]"); - return false; - } - - #ifndef HOME_SCREEN_EFL_TEST_RUN - if (nodisplay) - return true; - #endif - - app_mgr_item = __app_mgr_load_item_info(ai); - - if (!app_mgr_item) { - LOGE("[Failed to initialie app_mgr_item]"); - return false; - } - - - *list = eina_list_append(*list, app_mgr_item); - return true; -} - -static app_mgr_item_t *__app_mgr_load_item_info(app_info_h ai_h) -{ - package_info_h p_handle = NULL; - package_manager_error_e ret = PACKAGE_MANAGER_ERROR_NONE; - - if (!ai_h) { - LOGE("[INVALID_PARAMS]"); - return NULL; - } - - app_mgr_item_t *item = (app_mgr_item_t *) calloc(1, sizeof(*item)); - if (!item) { - LOGE("Failed to create app_mgr_item"); - return NULL; - } - - if (app_info_get_label(ai_h, &item->label)) { - LOGE("[FAILED][app_info_get_label]"); - free(item); - return NULL; - } - - if (app_info_get_exec(ai_h, &item->exec)) { - LOGE("[FAILED][app_info_get_exec]"); - free(item->label); - free(item); - return NULL; - } - - if (app_info_get_icon(ai_h, &item->icon)) { - LOGE("[FAILED][app_info_get_icon]"); - free(item->label); - free(item->exec); - free(item); - return NULL; - } - - if (app_info_get_app_id(ai_h, &item->appid)) { - LOGE("[FAILED][app_info_get_app_id]"); - free(item->label); - free(item->exec); - free(item->icon); - free(item); - return NULL; - } - - if (app_info_get_package(ai_h, &item->package)) { - LOGE("[FAILED][app_info_get_package]"); - free(item->label); - free(item->exec); - free(item->icon); - free(item->appid); - free(item); - return NULL; - } - - ret = package_manager_get_package_info(item->package, &p_handle); - if (ret != PACKAGE_MANAGER_ERROR_NONE) { - LOGW("Failed to inialize package handle for item : %s", - item->package); - item->removable = false; - return item; - } - - ret = package_info_is_removable_package(p_handle, &item->removable); - - if (ret != PACKAGE_MANAGER_ERROR_NONE) { - LOGE("Failed to get pacakge removeable flag"); - free(item->label); - free(item->exec); - free(item->icon); - free(item->appid); - free(item->package); - free(item); - return NULL; - } - - package_info_destroy(p_handle); - - return item; -} diff --git a/src/apps_data.c b/src/apps_data.c new file mode 100755 index 0000000..dd916e4 --- /dev/null +++ b/src/apps_data.c @@ -0,0 +1,362 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "apps_data.h" +#include "apps_package_manager.h" +#include "apps_db.h" +#include "apps_view.h" +#include "util.h" +#include "conf.h" + +static struct { + Eina_List *data_list; +} apps_data_s = { + .data_list = NULL +}; + +void __apps_data_print(Eina_List *list); +static int __apps_data_sort_cb(const void *a , const void *b); +static void __apps_data_item_free(app_data_t *item); +app_data_t *__apps_data_find_item(int db_id); +static int __apps_data_shortcur_request_cb(const char *pkgname, + const char *name, int type, const char *content_info, const char *icon, + int pid, double period, int allow_duplicate, void *data); + +void apps_data_init(void) +{ + Eina_List *pkg_list = NULL, *db_list = NULL; + Eina_List *pkg_find_list, *db_find_list; + app_data_t *pkg_item = NULL, *db_item = NULL; + apps_package_manager_init(); + apps_package_manger_get_list(&pkg_list); + + if (!apps_db_create()) { + apps_db_get_app_list(&db_list); + } + + EINA_LIST_FOREACH(pkg_list, pkg_find_list, pkg_item) { + EINA_LIST_FOREACH(db_list, db_find_list, db_item) { + if (!strcmp(pkg_item->pkg_str, db_item->pkg_str) && !strcmp(pkg_item->owner, db_item->owner)) { + pkg_item->db_id = db_item->db_id; + pkg_item->parent_db_id = db_item->parent_db_id; + db_item->temp = true; + break; + } + } + apps_data_s.data_list = eina_list_append(apps_data_s.data_list, pkg_item); + } + + EINA_LIST_FOREACH(db_list, db_find_list, db_item) { + if (!db_item->temp) { + apps_db_delete_by_pkg_str(db_item->pkg_str); + __apps_data_item_free(db_item); + } + } + db_list = eina_list_free(db_list); + + apps_db_get_list(&db_list); + EINA_LIST_FOREACH(db_list, db_find_list, db_item) { + if (db_item->is_folder || db_item->type >= APPS_DATA_TYPE_APP_SHORTCUT) { + apps_data_s.data_list = eina_list_append(apps_data_s.data_list, db_item); + } + } + eina_list_free(db_list); + eina_list_free(pkg_list); + + apps_data_sort(); + + EINA_LIST_FOREACH(apps_data_s.data_list, pkg_find_list, pkg_item) { + if (pkg_item->db_id == INIT_VALUE) + apps_db_insert(pkg_item); + else + apps_db_update(pkg_item); + } + __apps_data_print(apps_data_s.data_list); + + int ret = shortcut_set_request_cb(__apps_data_shortcur_request_cb, NULL); + if (ret != SHORTCUT_ERROR_NONE) + LOGE("Failed to add shortcut request cb: 0x%X\n", ret); +} + +void apps_data_sort(void) +{ + int index = 0; + int parent_id = APPS_ROOT; + app_data_t *item = NULL; + Eina_List *find_list; + + if (apps_data_s.data_list) { + apps_data_s.data_list = eina_list_sort(apps_data_s.data_list, eina_list_count(apps_data_s.data_list), __apps_data_sort_cb); + } + EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) { + if (item->parent_db_id == parent_id) { + item->position = index++; + } else { + parent_id = item->parent_db_id; + index = 0; + item->position = index++; + } + } +} + +static int __apps_data_sort_cb(const void *a , const void *b) +{ + int i; + app_data_t *item1 = (app_data_t *)a; + app_data_t *item2 = (app_data_t *)b; + if (item1->parent_db_id < item2->parent_db_id) + return -1; + else if (item1->parent_db_id > item2->parent_db_id) + return 1; + + if (item1->label_str == NULL && item2->label_str == NULL) + return 1; + else if (item1->label_str == NULL) + return -1; + else if (item2->label_str == NULL) + return 1; + + for (i = 0; item1->label_str[i]; i++) { + if (tolower(item1->label_str[i]) != tolower(item2->label_str[i])) { + int ret = tolower(item1->label_str[i]) - tolower(item2->label_str[i]); + return ret; + } + } + + return item2->label_str[i] ? -1 : (item2->db_id - item1->db_id); +} + +Eina_List *apps_data_get_list(void) +{ + return apps_data_s.data_list; +} + +void apps_data_get_folder_item_list(Eina_List **list, app_data_t *folder) +{ + app_data_t *item = NULL; + Eina_List *find_list; + + EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) { + if (item->parent_db_id == folder->db_id) { + *list = eina_list_append(*list , item); + } + } +} + +void apps_data_install(app_data_t *item) +{ + apps_data_s.data_list = eina_list_append(apps_data_s.data_list, item); + apps_db_insert(item); + apps_data_sort(); + apps_view_icon_add(item); + apps_view_reroder(); +} + +void apps_data_uninstall(const char *package) +{ + Eina_List *find_list; + Eina_List *find_result = NULL; + app_data_t *item = NULL; + + EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) { + if (item->pkg_str && (strcmp(item->pkg_str, package) == 0) && + item->owner && (strcmp(item->owner, TEMP_OWNER) == 0)) { + find_result = eina_list_append(find_result, item); + } + } + apps_data_delete_list(find_result); +} + +app_data_t *apps_data_add_folder(void) +{ + app_data_t *new_item = (app_data_t *)malloc(sizeof(app_data_t)); + memset(new_item, 0, sizeof(app_data_t)); + + new_item->db_id = INIT_VALUE; + new_item->parent_db_id = APPS_ROOT; + new_item->owner = strdup(TEMP_OWNER); + new_item->position = INIT_VALUE; + new_item->label_str = strdup(""); + new_item->type = APPS_DATA_TYPE_APP; + + new_item->is_checked = false; + new_item->is_folder = true; + new_item->is_removable = true; + new_item->is_system = false; + + apps_data_s.data_list = eina_list_append(apps_data_s.data_list, new_item); + + apps_db_insert(new_item); + apps_view_icon_add(new_item); + apps_data_sort(); + apps_view_reroder(); + + return new_item; +} + +void apps_data_delete_folder(app_data_t *folder_item) +{ + app_data_t *item = NULL; + Eina_List *find_list; + EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) { + if (item->parent_db_id == folder_item->db_id) { + item->parent_db_id = APPS_ROOT; + apps_db_update(item); + apps_view_icon_add(item); + } + } + apps_data_s.data_list = eina_list_remove(apps_data_s.data_list, folder_item); + apps_db_delete(folder_item); + apps_data_sort(); + apps_view_reroder(); + __apps_data_item_free(folder_item); +} + +void apps_data_update_folder(app_data_t *folder_item) +{ + apps_db_update(folder_item); + apps_data_sort(); + apps_view_reroder(); +} + +static int __apps_data_shortcur_request_cb(const char *package_name, + const char *name, int type, const char *content_info, const char *icon, + int pid, double period, int allow_duplicate, void *data) +{ + LOGD("package_name: %s", package_name); + LOGD("name: %s", name); + LOGD("type: %d", type); + LOGD("content_info: %s", content_info); + LOGD("icon: %s", icon); + LOGD("pid: %d", pid); + LOGD("period: %.2lf", period); + LOGD("allow_duplicate: %d", allow_duplicate); + + app_data_t *new_item = (app_data_t *)malloc(sizeof(app_data_t)); + memset(new_item, 0, sizeof(app_data_t)); + + new_item->db_id = INIT_VALUE; + new_item->parent_db_id = APPS_ROOT; + new_item->owner = strdup(TEMP_OWNER); + new_item->position = INIT_VALUE; + new_item->label_str = strdup(name); + new_item->pkg_str = strdup(package_name); + if (type == LAUNCH_BY_URI) { + new_item->uri = strdup(content_info); + new_item->type = APPS_DATA_TYPE_URI_SHORTCUT; + } else { + new_item->type = APPS_DATA_TYPE_APP_SHORTCUT; + } + new_item->icon_path_str = strdup(icon); + + new_item->is_checked = false; + new_item->is_folder = false; + new_item->is_removable = true; + new_item->is_system = false; + + apps_data_s.data_list = eina_list_append(apps_data_s.data_list, new_item); + + apps_db_insert(new_item); + apps_view_icon_add(new_item); + apps_data_sort(); + apps_view_reroder(); + + return 0; +} + +void apps_data_delete_item(app_data_t *item) +{ + apps_data_s.data_list = eina_list_remove(apps_data_s.data_list, item); + apps_db_delete(item); + apps_data_sort(); + apps_view_reroder(); + apps_view_folder_reroder(); + if (item->parent_db_id != APPS_ROOT) { + app_data_t *parent = __apps_data_find_item(item->parent_db_id); + if (parent) + apps_view_update_folder_icon(parent); + } + __apps_data_item_free(item); +} + +void apps_data_delete_list(Eina_List *list) +{ + app_data_t *item = NULL; + Eina_List *find_list; + EINA_LIST_FOREACH(list, find_list, item) { + apps_data_s.data_list = eina_list_remove(apps_data_s.data_list, item); + apps_db_delete(item); + } + + apps_data_sort(); + apps_view_reroder(); + apps_view_folder_reroder(); + + EINA_LIST_FOREACH(list, find_list, item) { + if (item->parent_db_id != APPS_ROOT) { + app_data_t *parent = __apps_data_find_item(item->parent_db_id); + if (parent) + apps_view_update_folder_icon(parent); + } + + __apps_data_item_free(item); + } +} + +app_data_t *__apps_data_find_item(int db_id) +{ + app_data_t *item = NULL; + Eina_List *find_list; + EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) { + if (item->db_id == db_id) + return item; + } + return NULL; +} + +static void __apps_data_item_free(app_data_t *item) +{ + if (item && item->app_layout) + evas_object_del(item->app_layout); + if (item && item->folder_layout) + evas_object_del(item->folder_layout); + if (item && item->label_str) + free(item->label_str); + if (item && item->icon_path_str) + free(item->icon_path_str); + if (item && item->pkg_str) + free(item->pkg_str); + if (item && item->owner) + free(item->owner); + if (item && item->uri) + free(item->uri); + if (item) + free(item); +} + +void __apps_data_print(Eina_List *list) +{ + app_data_t *item = NULL; + Eina_List *find_list; + LOGD("========================================"); + EINA_LIST_FOREACH(list, find_list, item) { + if (item != NULL) + LOGD("%d [pkg: %s][name:%s][iconPath: %s][icon:%p]", item->position, item->pkg_str, item->label_str, item->icon_path_str, item->app_layout); + } + LOGD("========================================"); +} diff --git a/src/apps_db.c b/src/apps_db.c new file mode 100755 index 0000000..093120f --- /dev/null +++ b/src/apps_db.c @@ -0,0 +1,332 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "apps_db.h" +#include "apps_data.h" +#include "util.h" + + +#define APPS_DB_NAME ".apps-data.db" +#define QUERY_MAXLEN 4096 + +static sqlite3 *apps_db = NULL; + +enum { + COL_APP_ID = 0, + COL_PARENT_ID, + COL_OWNER, + COL_IS_FOLDER, + COL_POSITION, + COL_PACKAGE_STR, + COL_LABEL, + COL_URI, + COL_TYPE, + COL_IS_SYSTEM, + COL_IS_REMOVABLE, + COL_ICON_PATH +}; + +#define CREATE_APPS_DB_TABLE "create table if not exists apps(\ + appId INTEGER PRIMARY KEY AUTOINCREMENT,\ + parentId INTEGER,\ + owner TEXT,\ + isFolder INTEGER,\ + position INTEGER,\ + pkgStr TEXT,\ + label TEXT,\ + uri TEXT,\ + type INTEGER,\ + isSystem INTEGER,\ + isRemovable INTEGER,\ + iconPath TEXT);" + +#define UPDATE_APPS_DB_TABLE "UPDATE apps set \ + parentId=%d,\ + owner='%s',\ + isFolder=%d,\ + position=%d,\ + pkgStr='%s',\ + label='%s',\ + uri='%s',\ + type=%d,\ + isSystem=%d,\ + isRemovable=%d,\ + iconPath='%s' WHERE appId = %d" + +#define INSERT_APPS_DB_TABLE "INSERT into apps (\ + parentId,\ + owner,\ + isFolder,\ + position,\ + pkgStr,\ + label,\ + uri,\ + type,\ + isSystem,\ + isRemovable,\ + iconPath) VALUES(%d,'%s',%d,%d,'%s','%s','%s',%d,%d,%d,'%s')" + +#define SELECT_ITEM "SELECT * FROM apps;" +#define SELECT_APP_ITEM "SELECT * FROM apps WHERE type=0;" + +static bool __apps_db_open(void); + +bool apps_db_create(void) +{ + char *errMsg; + int ret; + const char *db_path = util_get_data_file_path(APPS_DB_NAME); + FILE *fp = fopen(db_path, "r"); + if (fp) { + fclose(fp); + LOGE("Apps DB[%s] exist", db_path); + return false; + } + + ret = sqlite3_open(db_path, &apps_db); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%d] : path [%s]", ret, db_path); + return false; + } + + ret = sqlite3_exec(apps_db, "PRAGMA journal_mode = PERSIST", + NULL, NULL, &errMsg); + if (ret != SQLITE_OK) { + LOGE("SQL error(%d) : %s", ret, errMsg); + sqlite3_free(errMsg); + return false; + } + + ret = sqlite3_exec(apps_db, CREATE_APPS_DB_TABLE, NULL, NULL, &errMsg); + if (ret != SQLITE_OK) { + LOGE("SQL error(%d) : %s", ret, errMsg); + sqlite3_free(errMsg); + return false; + } + LOGD("Create DB[%s] : [%s] OK ", db_path, CREATE_APPS_DB_TABLE); + return true; +} + +bool apps_db_close() +{ + if (apps_db) { + sqlite3_exec(apps_db, "COMMIT TRANSACTION", NULL, NULL, NULL); + sqlite3_close(apps_db); + apps_db = NULL; + } + return true; +} + +bool apps_db_get_list(Eina_List **apps) +{ + sqlite3_stmt *stmt; + + if (!__apps_db_open()) + return false; + + int ret = sqlite3_prepare_v2(apps_db, SELECT_ITEM, strlen(SELECT_ITEM), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", SELECT_ITEM, sqlite3_errmsg(apps_db)); + return false; + } + + const char *str = NULL; + while (sqlite3_step(stmt) == SQLITE_ROW) { + app_data_t *item = (app_data_t *)malloc(sizeof(app_data_t)); + memset(item, 0, sizeof(app_data_t)); + + item->db_id = sqlite3_column_int(stmt, COL_APP_ID); + item->parent_db_id = sqlite3_column_int(stmt, COL_PARENT_ID); + str = (const char *) sqlite3_column_text(stmt, COL_OWNER); + item->owner = (!str || !strlen(str)) ? NULL : strdup(str); + item->is_folder = sqlite3_column_int(stmt, COL_IS_FOLDER); + item->position = sqlite3_column_int(stmt, COL_POSITION); + str = (const char *) sqlite3_column_text(stmt, COL_PACKAGE_STR); + item->pkg_str = (!str || !strlen(str)) ? NULL : strdup(str); + str = (const char *) sqlite3_column_text(stmt, COL_LABEL); + item->label_str = (!str || !strlen(str)) ? NULL : strdup(str); + str = (const char *) sqlite3_column_text(stmt, COL_URI); + item->uri = (!str || !strlen(str)) ? NULL : strdup(str); + item->type = sqlite3_column_int(stmt, COL_TYPE); + item->is_system = sqlite3_column_int(stmt, COL_IS_SYSTEM); + item->is_removable = sqlite3_column_int(stmt, COL_IS_REMOVABLE); + str = (const char *)sqlite3_column_text(stmt, COL_ICON_PATH); + item->icon_path_str = (!str || !strlen(str)) ? NULL : strdup(str); + *apps = eina_list_append(*apps, item); + } + sqlite3_finalize(stmt); + return true; +} + +bool apps_db_get_app_list(Eina_List **apps) +{ + sqlite3_stmt *stmt; + + if (!__apps_db_open()) + return false; + + int ret = sqlite3_prepare_v2(apps_db, SELECT_APP_ITEM, strlen(SELECT_APP_ITEM), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", SELECT_APP_ITEM, sqlite3_errmsg(apps_db)); + return false; + } + + const char *str = NULL; + while (sqlite3_step(stmt) == SQLITE_ROW) { + app_data_t *item = (app_data_t *)malloc(sizeof(app_data_t)); + memset(item, 0, sizeof(app_data_t)); + + item->db_id = sqlite3_column_int(stmt, COL_APP_ID); + item->parent_db_id = sqlite3_column_int(stmt, COL_PARENT_ID); + str = (const char *) sqlite3_column_text(stmt, COL_OWNER); + item->owner = (!str || !strlen(str)) ? NULL : strdup(str); + item->is_folder = sqlite3_column_int(stmt, COL_IS_FOLDER); + item->position = sqlite3_column_int(stmt, COL_POSITION); + str = (const char *) sqlite3_column_text(stmt, COL_PACKAGE_STR); + item->pkg_str = (!str || !strlen(str)) ? NULL : strdup(str); + str = (const char *) sqlite3_column_text(stmt, COL_LABEL); + item->label_str = (!str || !strlen(str)) ? NULL : strdup(str); + str = (const char *) sqlite3_column_text(stmt, COL_URI); + item->uri = (!str || !strlen(str)) ? NULL : strdup(str); + item->type = sqlite3_column_int(stmt, COL_TYPE); + item->is_system = sqlite3_column_int(stmt, COL_IS_SYSTEM); + item->is_removable = sqlite3_column_int(stmt, COL_IS_REMOVABLE); + str = (const char *)sqlite3_column_text(stmt, COL_ICON_PATH); + item->icon_path_str = (!str || !strlen(str)) ? NULL : strdup(str); + *apps = eina_list_append(*apps, item); + } + sqlite3_finalize(stmt); + return true; +} + +bool apps_db_update(app_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__apps_db_open()) + return false; + snprintf(query, QUERY_MAXLEN, UPDATE_APPS_DB_TABLE, + item->parent_db_id, + item->owner, + item->is_folder, + item->position, + item->pkg_str, + item->label_str, + item->uri, + item->type, + item->is_system, + item->is_removable, + item->icon_path_str, + item->db_id); + int ret = sqlite3_prepare(apps_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(apps_db)); + return false; + } + sqlite3_step(stmt); + sqlite3_finalize(stmt); + apps_db_close(); + return true; +} + +bool apps_db_insert(app_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__apps_db_open()) + return false; + + snprintf(query, QUERY_MAXLEN, INSERT_APPS_DB_TABLE, + item->parent_db_id, + item->owner, + item->is_folder, + item->position, + item->pkg_str, + item->label_str, + item->uri, + item->type, + item->is_system, + item->is_removable, + item->icon_path_str); + + int ret = sqlite3_prepare(apps_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(apps_db)); + return false; + } + sqlite3_step(stmt); + sqlite3_finalize(stmt); + item->db_id = (int)sqlite3_last_insert_rowid(apps_db); + + apps_db_close(); + return true; +} + +bool apps_db_delete(app_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__apps_db_open()) + return false; + snprintf(query, QUERY_MAXLEN, "DELETE FROM apps WHERE appId=%d", item->db_id); + int ret = sqlite3_prepare(apps_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(apps_db)); + return false; + } + + sqlite3_step(stmt); + sqlite3_finalize(stmt); + + apps_db_close(); + return true; +} + +bool apps_db_delete_by_pkg_str(const char* pkg) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__apps_db_open()) + return false; + snprintf(query, QUERY_MAXLEN, "DELETE FROM apps WHERE pkgStr='%s'", pkg); + int ret = sqlite3_prepare(apps_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(apps_db)); + return false; + } + + sqlite3_step(stmt); + sqlite3_finalize(stmt); + + apps_db_close(); + return true; +} + +bool __apps_db_open() +{ + if (!apps_db) { + int ret; + ret = sqlite3_open(util_get_data_file_path(APPS_DB_NAME), &apps_db); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%d] : path [%s]", ret, util_get_data_file_path(APPS_DB_NAME)); + return false; + } + } + return true; +} diff --git a/src/apps_package_manager.c b/src/apps_package_manager.c new file mode 100755 index 0000000..60e3bed --- /dev/null +++ b/src/apps_package_manager.c @@ -0,0 +1,205 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "apps_package_manager.h" +#include "apps_data.h" +#include "util.h" +#include "conf.h" + +static package_manager_h pkg_mgr = NULL; + +static void __apps_package_manager_event_cb(const char *type, const char *package, + package_manager_event_type_e event_type, package_manager_event_state_e event_state, int progress, + package_manager_error_e error, void *user_data); +static bool __apps_data_pkg_get_apps_info(app_info_h app_handle, app_data_t **item); +static bool __apps_package_manager_get_item(app_info_h app_handle, void *data); +static void __apps_package_manager_install(const char *package); +static void __apps_package_manager_uninstall(const char *package); + +void apps_package_manager_init() +{ + int ret; + if (pkg_mgr != NULL) + return; + + ret = package_manager_create(&pkg_mgr); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("package_manager_create : failed[%d]", ret); + } + + ret = package_manager_set_event_status(pkg_mgr, PACKAGE_MANAGER_STATUS_TYPE_INSTALL|PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("package_manager_set_event_status : failed[%d]", ret); + } + + ret = package_manager_set_event_cb(pkg_mgr, __apps_package_manager_event_cb, NULL); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("package_manager_set_event_cb : failed[%d]", ret); + } +} + +static void __apps_package_manager_event_cb(const char *type, const char *package, + package_manager_event_type_e event_type, package_manager_event_state_e event_state, int progress, + package_manager_error_e error, void *user_data) +{ + if (event_state == PACKAGE_MANAGER_EVENT_STATE_STARTED) { + LOGI("pkg:%s type:%d state:PACKAGE_MANAGER_EVENT_STATE_STARTED", package, event_type); + } else if (event_state == PACKAGE_MANAGER_EVENT_STATE_PROCESSING) { + LOGI("pkg:%s type:%d PACKAGE_MANAGER_EVENT_STATE_PROCESSING", package, event_type); + } else if (event_state == PACKAGE_MANAGER_EVENT_STATE_COMPLETED) { + LOGI("pkg:%s type:%d PACKAGE_MANAGER_EVENT_STATE_COMPLETED", package, event_type); + if (event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL) { + __apps_package_manager_install(package); + } else if (event_type == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) { + __apps_package_manager_uninstall(package); + } else { //PACKAGE_MANAGER_EVENT_TYPE_UPDATE + LOGD("UPDATE - %s", package); + } + } else { + LOGE("pkg:%s type:%d state:PACKAGE_MANAGER_EVENT_STATE_COMPLETED: FAILED", package, event_type); + } +} + +Eina_Bool apps_package_manger_get_list(Eina_List **list) +{ + int ret; + ret = app_manager_foreach_app_info(__apps_package_manager_get_item, list); + if (ret != PACKAGE_MANAGER_ERROR_NONE) + LOGE("package_manager_foreach_package_info failed[%d]", ret); + return true; +} + +static bool __apps_package_manager_get_item(app_info_h app_handle, void *data) +{ + Eina_List **list = (Eina_List **)data; + app_data_t *item = NULL; + if (__apps_data_pkg_get_apps_info(app_handle, &item)) { + *list = eina_list_append(*list, item); + } + return true; +} + +static bool __apps_data_pkg_get_apps_info(app_info_h app_handle, app_data_t **item) +{ + char *pkg = NULL; + bool nodisplay = false; + int ret; + package_info_h p_handle = NULL; + + app_data_t *new_item = (app_data_t *)malloc(sizeof(app_data_t)); + memset(new_item, 0, sizeof(app_data_t)); + *item = new_item; + + app_info_is_nodisplay(app_handle, &nodisplay); + if (nodisplay) + goto ERROR; + + new_item->db_id = INIT_VALUE; + new_item->parent_db_id = APPS_ROOT; + new_item->owner = strdup(TEMP_OWNER); + new_item->is_folder = false; + new_item->position = INIT_VALUE; + new_item->uri = NULL; + new_item->type = APPS_DATA_TYPE_APP; + + ret = app_info_get_app_id(app_handle, &new_item->pkg_str); + if (APP_MANAGER_ERROR_NONE != ret) { + LOGE("app_info_get_app_id return [%d] %s", ret, new_item->pkg_str); + goto ERROR; + } + + ret = app_info_get_label(app_handle, &new_item->label_str); + if (APP_MANAGER_ERROR_NONE != ret) { + LOGE("app_info_get_label return [%d] %s", ret, new_item->label_str); + goto ERROR; + } + + ret = app_info_get_icon(app_handle, &new_item->icon_path_str); + if (APP_MANAGER_ERROR_NONE != ret) { + LOGE("app_info_get_icon return [%d]", ret); + goto ERROR; + } + + ret = app_info_get_package(app_handle, &pkg); + if (APP_MANAGER_ERROR_NONE != ret) { + LOGE("app_info_get_icon return [%d]", ret); + goto ERROR; + } + + LOGD("%s", pkg); + + ret = package_manager_get_package_info(pkg, &p_handle); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("Failed to inialize package handle for item : %s", + pkg); + goto ERROR; + } + + ret = package_info_is_removable_package(p_handle, &new_item->is_removable); + if (PACKAGE_MANAGER_ERROR_NONE != ret) { + LOGE("package_info_is_removable_package return [%d]", ret); + goto ERROR; + } + + ret = package_info_is_system_package(p_handle, &new_item->is_system); + if (PACKAGE_MANAGER_ERROR_NONE != ret) { + LOGE("package_info_is_system_package return [%d]", ret); + goto ERROR; + } + + if (!new_item->icon_path_str || !ecore_file_can_read(new_item->icon_path_str)) { + if (new_item->icon_path_str) free(new_item->icon_path_str); + + new_item->icon_path_str = malloc(MAX_FILE_PATH_LEN); + sprintf(new_item->icon_path_str, "%s", util_get_res_file_path(IMAGE_DIR"/default_app_icon.png")); + } + if (pkg) + free(pkg); + return true; + +ERROR: + if (pkg) + free(pkg); + if (new_item && new_item->label_str) + free(new_item->label_str); + if (new_item && new_item->icon_path_str) + free(new_item->icon_path_str); + if (new_item && new_item->pkg_str) + free(new_item->pkg_str); + if (new_item && new_item->owner) + free(new_item->owner); + if (new_item) free(new_item); + return false; + +} + +static void __apps_package_manager_install(const char *package) +{ + app_info_h app_info = NULL; + app_data_t *item = NULL; + + app_manager_get_app_info(package, &app_info); + if (__apps_data_pkg_get_apps_info(app_info, &item)) { + apps_data_install(item); + } + app_info_destroy(app_info); + +} + +static void __apps_package_manager_uninstall(const char *package) +{ + apps_data_uninstall(package); +} diff --git a/src/apps_view.c b/src/apps_view.c new file mode 100755 index 0000000..90a4d07 --- /dev/null +++ b/src/apps_view.c @@ -0,0 +1,1129 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "apps_view.h" +#include "conf.h" +#include "edc_conf.h" +#include "util.h" +#include "page_indicator.h" +#include "homescreen-efl.h" +#include "apps_data.h" +#include "apps_db.h" +#include "menu.h" + +#define FOLDER_STR_LEN 256 +#define MAX_BADGE_COUNT_STR_LEN 5 +#define MAX_BADGE_DISPLAY_COUNT 999 + +static struct { + Evas_Object *scroller; + Evas_Object *bg; + Evas_Object *box; + Evas_Object *chooser_btn; + Evas_Object *folder_popup_ly; + Evas_Object *folder_title_entry; + int width; + int height; + page_indicator_t *indicator; + Eina_List *page_list; + int page_count; + int current_page; + view_state_t view_state; + view_state_t pre_view_state; + Eina_List *selected_items; + app_data_t *dest_folder; + app_data_t *opened_folder; + int selected_item_count; + Ecore_Animator *animator; +} apps_view_s = { + .scroller = NULL, + .bg = NULL, + .box = NULL, + .chooser_btn = NULL, + .folder_popup_ly = NULL, + .folder_title_entry = NULL, + .width = 0, + .height = 0, + .indicator = NULL, + .page_list = NULL, + .page_count = 0, + .current_page = 0, + .view_state = VIEW_STATE_NORMAL, + .pre_view_state = VIEW_STATE_UNKNOWN, + .selected_items = NULL, + .selected_item_count = 0, + .dest_folder = NULL, + .opened_folder = NULL, + .animator = NULL +}; + +static int apps_menu_list[2] = { + MENU_APPS_EDIT, + MENU_APPS_CREATE_FOLDER +}; + +static Eina_Hash *apps_menu_table = NULL; + +static void __apps_view_create_base_gui(Evas_Object *win); +static Evas_Object * __apps_view_add_page(void); +static void __apps_view_remove_page(void); +static void __apps_view_fill_apps(void); +static void __apps_view_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_icon_uninstall_btn_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_icon_check_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_create_chooser(void); +static void __apps_view_chooser_left_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_chooser_right_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_update_chooser_text(int item_count); +static void __apps_view_create_menu(void); +static void __apps_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info); +static void __apps_view_menu_create_folder_cb(void *data, Evas_Object *obj, void *event_info); +static void __apps_view_open_folder_popup(app_data_t *item); +static void __apps_view_close_folder_popup(app_data_t *item); +static void __apps_view_close_folder_popup_done(void); +static Eina_Bool __apps_view_show_folder_anim(void *data, double pos); +static Eina_Bool __apps_view_hide_folder_anim(void *data, double pos); +static void __apps_view_hide_folder_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_badge_update_cb(unsigned int action, const char *app_id, unsigned int count, void *user_data); +static void __apps_view_badge_update_icon(app_data_t *item); +static void __apps_view_badge_update_count(app_data_t *item); +static void __apps_view_plus_icon_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __apps_view_create_toast_popup(char *str); +static void __apps_view_toast_popup_timeout_cb(void *data, Evas_Object *obj, void *event_info); +static void __apps_view_toast_popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info); + +Evas_Object *apps_view_create(Evas_Object *win) +{ + int ret = BADGE_ERROR_NONE; + elm_win_screen_size_get(win, NULL, NULL, &apps_view_s.width, &apps_view_s.height); + + apps_data_init(); + __apps_view_create_base_gui(win); + __apps_view_fill_apps(); + __apps_view_create_chooser(); + __apps_view_create_menu(); + + ret = badge_register_changed_cb(__apps_view_badge_update_cb, NULL); + + if (!apps_view_s.scroller) { + LOGE("[FAILED][apps_view_s.scroller==NULL]"); + return NULL; + } + return apps_view_s.scroller; +} + +void apps_view_app_terminate(void) +{ + eina_hash_free(apps_menu_table); +} + +void apps_view_show(void) +{ + page_indicator_show(apps_view_s.indicator); +} + +void apps_view_hide(void) +{ + page_indicator_hide(apps_view_s.indicator); +} + +void apps_view_show_anim(double pos) +{ + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.bg); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + Edje_Message_Float_Set *msg = malloc(sizeof(*msg) + 3 * sizeof(double)); + msg->count = 3; + msg->val[0] = ((APPS_VIEW_ANIMATION_DELTA * (1-pos)) / apps_view_s.height); + msg->val[1] = 1+((APPS_VIEW_ANIMATION_DELTA * (1-pos)) / apps_view_s.height); + msg->val[2] = pos*APPS_VIEW_BG_OPACITY; + + edje_object_message_send(edje, EDJE_MESSAGE_FLOAT_SET, 1, msg); + edje_object_signal_emit(edje, SIGNAL_APPS_VIEW_ANIM, SIGNAL_SOURCE); + + evas_object_color_set(apps_view_s.box, 255, 255, 255, pos*255); + evas_object_move(apps_view_s.scroller, 0, APPS_VIEW_PADDING_TOP + (APPS_VIEW_ANIMATION_DELTA * (1-pos))); + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(apps_view_s.box, 255, 255, 255, 255); + evas_object_move(apps_view_s.scroller, 0, APPS_VIEW_PADDING_TOP); + edje_object_signal_emit(edje, SIGNAL_APPS_VIEW_SHOW, SIGNAL_SOURCE); + } +} + +void apps_view_hide_anim(double pos) +{ + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.bg); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + Edje_Message_Float_Set *msg = malloc(sizeof(*msg) + 3 * sizeof(double)); + msg->count = 3; + msg->val[0] = ((APPS_VIEW_ANIMATION_DELTA * pos) / apps_view_s.height); + msg->val[1] = 1+((APPS_VIEW_ANIMATION_DELTA * pos) / apps_view_s.height); + msg->val[2] = (1-pos)*APPS_VIEW_BG_OPACITY; + + edje_object_message_send(edje, EDJE_MESSAGE_FLOAT_SET, 1, msg); + edje_object_signal_emit(edje, SIGNAL_APPS_VIEW_ANIM, SIGNAL_SOURCE); + + evas_object_color_set(apps_view_s.box, 255, 255, 255, (1-pos)*255); + evas_object_move(apps_view_s.scroller, 0, APPS_VIEW_PADDING_TOP + (APPS_VIEW_ANIMATION_DELTA * pos)); + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(apps_view_s.box, 255, 255, 255, 0); + evas_object_move(apps_view_s.scroller, 0, apps_view_s.height); + edje_object_signal_emit(edje, SIGNAL_APPS_VIEW_HIDE, SIGNAL_SOURCE); + } +} + +void apps_view_reroder(void) +{ + Eina_List *data_list = apps_data_get_list(); + app_data_t *item = NULL; + Eina_List *find_list; + int item_count = 0; + + apps_view_unset_all(); + + EINA_LIST_FOREACH(data_list, find_list, item) { + if (apps_view_icon_set(item)) + item_count++; + } + //Delete empty page + while (((item_count-1) / (APPS_VIEW_COL*APPS_VIEW_ROW) +1) < eina_list_count(apps_view_s.page_list)) { + __apps_view_remove_page(); + } +} + +void apps_view_folder_reroder(void) +{ + Eina_List *data_list = apps_data_get_list(); + app_data_t *item = NULL; + Eina_List *find_list; + int item_count = 0; + if (!apps_view_s.opened_folder) + return; + + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->parent_db_id == apps_view_s.opened_folder->db_id) { + apps_view_icon_set(item); + item_count++; + } + } + + if (item_count < APPS_FOLDER_MAX_ITEM) { + Edje_Message_Float_Set *msg = malloc(sizeof(*msg) + 2 * sizeof(double)); + msg->count = 2; + msg->val[0] = item_count / APPS_FOLDER_COL; + msg->val[1] = item_count % APPS_FOLDER_COL; + + if (apps_view_get_state() != VIEW_STATE_CHOOSER) { + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.folder_popup_ly); + edje_object_message_send(edje, EDJE_MESSAGE_FLOAT_SET, 1, msg); + edje_object_signal_emit(edje, SIGNAL_APPS_FOLDER_SET_PLUS_ICON, SIGNAL_SOURCE); + elm_object_signal_callback_add(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_CLICKED_PLUS_ICON, SIGNAL_SOURCE, + __apps_view_plus_icon_clicked, (void *)apps_view_s.opened_folder); + } else { + elm_object_signal_emit(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_HIDE_PLUS_ICON, SIGNAL_SOURCE); + } + free(msg); + } else { + elm_object_signal_emit(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_HIDE_PLUS_ICON, SIGNAL_SOURCE); + elm_object_signal_callback_del(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_CLICKED_PLUS_ICON, SIGNAL_SOURCE, + __apps_view_plus_icon_clicked); + } +} + +Evas_Object* apps_view_create_icon(app_data_t *item) +{ + Evas_Object *icon_layout; + Evas_Object *rect = NULL; + Evas_Object *icon_image = NULL; + + icon_layout = elm_layout_add(apps_view_s.box); + elm_layout_file_set(icon_layout, util_get_res_file_path(EDJE_DIR"/app_icon.edj"), GROUP_APP_ICON_LY); + evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + rect = evas_object_rectangle_add(evas_object_evas_get(icon_layout)); + if (!rect) { + LOGE("[FAILED][rect=NULL]"); + return NULL; + } + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_size_hint_min_set(rect, APPS_VIEW_W / APPS_VIEW_COL, APPS_VIEW_H / APPS_VIEW_ROW); + evas_object_size_hint_max_set(rect, APPS_VIEW_W / APPS_VIEW_COL, APPS_VIEW_H / APPS_VIEW_ROW); + elm_object_part_content_set(icon_layout, SIZE_SETTER, rect); + + item->app_layout = icon_layout; + + //icon image + if (item->is_folder) { + LOGD("Create Folder ICON"); + Evas_Object *folder_layout; + Evas_Object *size_setter; + + folder_layout = elm_layout_add(icon_layout); + elm_layout_file_set(folder_layout, util_get_res_file_path(EDJE_DIR"/apps_folder_icon.edj"), GROUP_FOLDER_ICON_LY); + evas_object_size_hint_weight_set(folder_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + size_setter = evas_object_rectangle_add(evas_object_evas_get(folder_layout)); + if (!rect) { + LOGE("[FAILED][rect=NULL]"); + return NULL; + } + evas_object_color_set(size_setter, 0, 0, 0, 0); + evas_object_size_hint_min_set(size_setter, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + evas_object_size_hint_max_set(size_setter, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + elm_object_part_content_set(folder_layout, SIZE_SETTER, size_setter); + item->folder_layout = folder_layout; + + apps_view_update_folder_icon(item); + elm_object_part_content_set(icon_layout, APPS_ICON_CONTENT, folder_layout); + + if (apps_view_s.view_state == VIEW_STATE_EDIT) { + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->app_layout, SIGNAL_UNINSTALL_BUTTON_SHOW_ANI, SIGNAL_SOURCE); + } else if (apps_view_s.view_state == VIEW_STATE_CHOOSER) { + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + } + } else { + if (ecore_file_can_read(item->icon_path_str)) { + LOGD("Create Image: %s", item->icon_path_str); + icon_image = elm_image_add(icon_layout); + elm_image_file_set(icon_image, item->icon_path_str, NULL); + evas_object_size_hint_min_set(icon_image, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + evas_object_size_hint_max_set(icon_image, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + elm_object_part_content_set(icon_layout, APPS_ICON_CONTENT, icon_image); + } else { + LOGE("Can not read : %s", item->icon_path_str); + + const char *default_icon = util_get_res_file_path(IMAGE_DIR"/default_app_icon.png"); + icon_image = elm_image_add(icon_layout); + elm_image_file_set(icon_image, default_icon, NULL); + evas_object_size_hint_min_set(icon_image, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + evas_object_size_hint_max_set(icon_image, APPS_VIEW_ICON_IMAGE, APPS_VIEW_ICON_IMAGE); + elm_object_part_content_set(icon_layout, APPS_ICON_CONTENT, icon_image); + } + + if (item->parent_db_id != APPS_ROOT) + elm_object_signal_emit(item->app_layout, SIGNAL_SET_BLACK_TEXT, SIGNAL_SOURCE); + + if (apps_view_s.view_state == VIEW_STATE_EDIT) { + if (item->parent_db_id == APPS_ROOT) + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); + + if (item->is_removable) + elm_object_signal_emit(item->app_layout, SIGNAL_UNINSTALL_BUTTON_SHOW, SIGNAL_SOURCE); + } else if (apps_view_s.view_state == VIEW_STATE_CHOOSER) { + if (item->parent_db_id == APPS_ROOT) + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); + + elm_object_signal_emit(item->app_layout, SIGNAL_CHOOSER_MODE_ON, SIGNAL_SOURCE); + } + __apps_view_badge_update_icon(item); + } + elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, __apps_view_icon_clicked_cb, (void *)item); + elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE, __apps_view_icon_uninstall_btn_clicked_cb, (void *)item); + elm_object_signal_callback_add(icon_layout, SIGNAL_CHANGED_CHECK_BOX, SIGNAL_SOURCE, __apps_view_icon_check_changed_cb, (void *)item); + + /* + elm_object_signal_callback_add(icon_layout, SIGNAL_DEFAULT_TOUCH_DOWN , APPS_ICON_CONTENT_TOUCH, _all_apps_icon_touch_down_cb, (void *)item); + elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, _all_apps_icon_clicked_cb, (void *)item); + elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE, _all_apps_icon_uninstall_button_clicked_cb, (void *)item); + elm_object_signal_callback_add(icon_layout, SIGNAL_CHANGED_CHECK_BOX, SIGNAL_SOURCE, _all_apps_icon_checkbox_changed, (void *)item); +*/ + //icon label + elm_object_part_text_set(icon_layout, APPS_ICON_NAME, item->label_str); + + evas_object_show(icon_image); + evas_object_show(icon_layout); + + LOGD("icon [%s] create", item->pkg_str); + + return icon_layout; +} + +void apps_view_unset_all(void) +{ + int i, j; + char icon_container[FOLDER_STR_LEN]; + Eina_List *find_list = NULL; + Evas_Object * page; + + EINA_LIST_FOREACH(apps_view_s.page_list, find_list, page) { + for (i = 0; i < APPS_VIEW_ROW; i++) + for (j = 0; j < APPS_VIEW_COL; j++) { + sprintf(icon_container, "icon_%d_%d", i, j); + elm_object_part_content_unset(page, icon_container); + } + } +} + +bool apps_view_icon_set(app_data_t *item) +{ + Evas_Object *page = NULL; + int page_index; + int col, row; + char icon_container[FOLDER_STR_LEN]; + + if (item == NULL) + return false; + + LOGD("%s %d %d", item->pkg_str, item->parent_db_id, item->position); + if (item->parent_db_id == APPS_ROOT) { + page_index = item->position / (APPS_VIEW_COL*APPS_VIEW_ROW); + col = (item->position / APPS_VIEW_COL)%APPS_VIEW_ROW; + row = item->position % APPS_VIEW_COL; + + if (eina_list_count(apps_view_s.page_list) < page_index+1) { + page = __apps_view_add_page(); + } else + page = eina_list_nth(apps_view_s.page_list, page_index); + + sprintf(icon_container, "icon_%d_%d", col, row); + if (elm_object_part_content_get(page, icon_container) != NULL) { + LOGE("unset %p", elm_object_part_content_get(page, icon_container)); + elm_object_part_content_unset(page, icon_container); + } + elm_object_part_content_set(page, icon_container, item->app_layout); + LOGD("[%s] -> [%s], [%p] page : %d", item->pkg_str, icon_container, item->app_layout, page_index); + return true; + } else if (apps_view_s.opened_folder && item->parent_db_id == apps_view_s.opened_folder->db_id) { + col = (item->position / APPS_FOLDER_COL)%APPS_FOLDER_ROW; + row = item->position % APPS_FOLDER_COL; + + sprintf(icon_container, "icon_%d_%d", col, row); + if (elm_object_part_content_get(apps_view_s.folder_popup_ly, icon_container) != NULL) { + LOGE("unset %p", elm_object_part_content_get(apps_view_s.folder_popup_ly, icon_container)); + elm_object_part_content_unset(apps_view_s.folder_popup_ly, icon_container); + } + elm_object_part_content_set(apps_view_s.folder_popup_ly, icon_container, item->app_layout); + LOGD("[%s] -> [%s], [%p]", item->pkg_str, icon_container, item->app_layout); + } + + return false; +} + +static void __apps_view_create_base_gui(Evas_Object *win) +{ + char edj_path[PATH_MAX] = {0, }; + apps_view_s.bg = elm_layout_add(win); + if (!apps_view_s.bg) { + LOGE("[FAILED][apps_view_s.bg==NULL]"); + return; + } + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/apps_view_bg.edj")); + elm_layout_file_set(apps_view_s.bg, edj_path, GROUP_APPS_BG_LY); + evas_object_size_hint_weight_set(apps_view_s.bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, apps_view_s.bg); + evas_object_show(apps_view_s.bg); + + Evas_Object *rect = evas_object_rectangle_add(homescreen_efl_get_win()); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_size_hint_min_set(rect, apps_view_s.width, apps_view_s.height); + evas_object_size_hint_max_set(rect, apps_view_s.width, apps_view_s.height); + evas_object_resize(rect, apps_view_s.width, apps_view_s.height); + elm_object_part_content_set(apps_view_s.bg, SIZE_SETTER, rect); + evas_object_show(rect); + + apps_view_s.scroller = elm_scroller_add(win); + if (!apps_view_s.scroller) { + LOGE("[FAILED][apps_view_s.scroller==NULL]"); + return; + } + elm_scroller_content_min_limit(apps_view_s.scroller, EINA_FALSE, EINA_FALSE); + elm_scroller_bounce_set(apps_view_s.scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(apps_view_s.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_scroll_limit_set(apps_view_s.scroller, 1, 1); + evas_object_size_hint_weight_set(apps_view_s.scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_scroller_loop_set(apps_view_s.scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_page_size_set(apps_view_s.scroller, APPS_VIEW_W, APPS_VIEW_H); + evas_object_resize(apps_view_s.scroller, APPS_VIEW_W , APPS_VIEW_H); + + apps_view_s.box = elm_box_add(apps_view_s.scroller); + elm_box_horizontal_set(apps_view_s.box, EINA_TRUE); + elm_box_align_set(apps_view_s.box, 0.5, 0.5); + evas_object_show(apps_view_s.box); + + elm_object_content_set(apps_view_s.scroller, apps_view_s.box); + + apps_view_s.indicator = page_indictor_create(apps_view_s.scroller); + page_indicator_scroller_resize(apps_view_s.indicator, apps_view_s.width, apps_view_s.height); + page_indicator_hide(apps_view_s.indicator); + + __apps_view_add_page(); + page_indicator_set_current_page(apps_view_s.indicator, 0); +} + +static Evas_Object *__apps_view_add_page(void) +{ + char edj_path[PATH_MAX] = {0, }; + Evas_Object *page_ly = elm_layout_add(apps_view_s.box); + + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/apps_view.edj")); + elm_layout_file_set(page_ly, edj_path, GROUP_APPS_LY); + evas_object_size_hint_weight_set(page_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(page_ly, APPS_VIEW_W, APPS_VIEW_H); + + Evas_Object *rect = evas_object_rectangle_add(homescreen_efl_get_win()); + evas_object_color_set(rect, 255, 255, 255, 0); + evas_object_size_hint_min_set(rect, APPS_VIEW_W, APPS_VIEW_H); + evas_object_size_hint_max_set(rect, APPS_VIEW_W, APPS_VIEW_H); + evas_object_resize(rect, APPS_VIEW_W, APPS_VIEW_H); + evas_object_show(rect); + elm_object_part_content_set(page_ly, SIZE_SETTER, rect); + + elm_box_pack_end(apps_view_s.box, page_ly); + evas_object_show(page_ly); + + apps_view_s.page_list = eina_list_append(apps_view_s.page_list, page_ly); + apps_view_s.page_count += 1; + page_indicator_set_page_count(apps_view_s.indicator, apps_view_s.page_count); + return page_ly; +} + +static void __apps_view_remove_page(void) +{ + if (apps_view_s.page_count == 0) { + apps_view_s.page_count = 1; + return ; + } + + Evas_Object *item = eina_list_nth(apps_view_s.page_list, apps_view_s.page_count-1); + apps_view_s.page_list = eina_list_remove(apps_view_s.page_list, item); + apps_view_s.page_count -= 1; + if (apps_view_s.current_page >= apps_view_s.page_count) { + apps_view_s.current_page = apps_view_s.page_count - 1; + } + + elm_scroller_page_bring_in(apps_view_s.scroller, apps_view_s.current_page, 0); + elm_box_unpack(apps_view_s.box, item); + page_indicator_set_page_count(apps_view_s.indicator, apps_view_s.page_count); + evas_object_del(item); +} + +static void __apps_view_fill_apps(void) +{ + Eina_List *list = apps_data_get_list(); + app_data_t *item = NULL; + Eina_List *find_list; + + EINA_LIST_FOREACH(list, find_list, item) { + if (item != NULL && item->parent_db_id == APPS_ROOT) { + item->app_layout = apps_view_create_icon(item); + } + } + apps_view_reroder(); +} + +static void __apps_view_folder_fill_apps(void) +{ + Eina_List *list = apps_data_get_list(); + app_data_t *item = NULL; + Eina_List *find_list; + + EINA_LIST_FOREACH(list, find_list, item) { + if (item != NULL && item->parent_db_id == apps_view_s.opened_folder->db_id) { + item->app_layout = apps_view_create_icon(item); + } + } + apps_view_folder_reroder(); +} + +static void __apps_view_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + app_data_t *item = (app_data_t *)data; + app_control_h app_control_handle = NULL; + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + + if (item->is_folder) { + LOGD("%d(%s) folder clicked", item->db_id, item->label_str); + __apps_view_open_folder_popup(item); + } else if (apps_view_s.view_state == VIEW_STATE_NORMAL) { + LOGD("%s(%s) applciation clicked", item->pkg_str, item->owner); + if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_create]"); + return; + } + /*if (app_control_set_operation(app_control_handle, APP_CONTROL_OPERATION_VIEW) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_set_operation]"); + app_control_destroy(app_control_handle); + return; + }*/ + if (item->type == APPS_DATA_TYPE_URI_SHORTCUT && item->uri && strlen(item->uri) && + app_control_set_uri(app_control_handle, item->uri) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_set_uri]"); + app_control_destroy(app_control_handle); + return; + } + if (app_control_set_app_id(app_control_handle, item->pkg_str) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_set_app_id]"); + app_control_destroy(app_control_handle); + return; + } + if (app_control_send_launch_request(app_control_handle, NULL, NULL) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_send_launch_request]"); + app_control_destroy(app_control_handle); + return; + } + app_control_destroy(app_control_handle); + } +} + +static void __apps_view_icon_uninstall_btn_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + app_data_t *item = (app_data_t *)data; + package_manager_request_h request; + int id = 0; + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + if (!item) { + LOGE("item is NULL"); + } + + LOGD("Uninstall :: %s", item->pkg_str); + if (item->is_folder) { + apps_data_delete_folder(item); + } else if (item->type >= APPS_DATA_TYPE_APP_SHORTCUT) { + LOGD("Delete shortcut"); + apps_data_delete_item(item); + } else { + if (package_manager_request_create(&request) != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("Could not create unistall request. App: %s", item->pkg_str); + return; + } + int ret = package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_DEFAULT); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("Could not set request mode. App: %s", item->pkg_str); + return; + } + if (package_manager_request_uninstall(request, item->pkg_str, &id) != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("Could not uninstall application. App: %s", item->pkg_str); + return; + } + if (package_manager_request_destroy(request) != PACKAGE_MANAGER_ERROR_NONE) { + LOGE("Could not destroy unistall request. App: %s", item->pkg_str); + return; + } + } +} +static void __apps_view_icon_check_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + app_data_t *item = (app_data_t *)data; + + if (apps_view_s.view_state != VIEW_STATE_CHOOSER) + return; + + if (item->is_checked) { + LOGD("%s - uncheck", item->label_str); + elm_object_signal_emit(item->app_layout, SIGNAL_UNCHECK_CHECK_BOX, SIGNAL_SOURCE); + apps_view_s.selected_items = eina_list_remove(apps_view_s.selected_items, item); + item->is_checked = !item->is_checked; + } else { + int item_count = eina_list_count(apps_view_s.selected_items); + if (apps_view_s.selected_item_count + item_count >= APPS_FOLDER_MAX_ITEM) { + LOGD("checked item : %d > HOME_FOLDER_MAX_ITEM(9)", item_count); + char str[1024]; + sprintf(str, _("IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED"), APPS_FOLDER_MAX_ITEM); + __apps_view_create_toast_popup(str); + } else { + LOGD("%s - check", item->label_str); + elm_object_signal_emit(item->app_layout, SIGNAL_CHECK_CHECK_BOX, SIGNAL_SOURCE); + apps_view_s.selected_items = eina_list_append(apps_view_s.selected_items, item); + item->is_checked = !item->is_checked; + } + } + __apps_view_update_chooser_text(eina_list_count(apps_view_s.selected_items)); +} + +void apps_view_hw_menu_key(void) +{ + if (apps_view_s.view_state == VIEW_STATE_NORMAL) + menu_change_state_on_hw_menu_key(apps_menu_table); +} + +bool apps_view_hw_home_key(void) +{ + if (apps_view_s.opened_folder != NULL) { + __apps_view_close_folder_popup(apps_view_s.opened_folder); + } + + apps_view_set_state(VIEW_STATE_NORMAL); + + return false; +} + +bool apps_view_hw_back_key(void) +{ + LOGD("%d", apps_view_s.pre_view_state); + if (apps_view_s.opened_folder != NULL) { + __apps_view_close_folder_popup(apps_view_s.opened_folder); + return true; + } + + if (apps_view_s.view_state == VIEW_STATE_NORMAL) + return false; + + if (apps_view_s.view_state == VIEW_STATE_CHOOSER) { + apps_view_set_state(apps_view_s.pre_view_state); + } else if (apps_view_s.view_state == VIEW_STATE_EDIT) { + apps_view_set_state(VIEW_STATE_NORMAL); + } + + return true; +} + +view_state_t apps_view_get_state(void) +{ + return apps_view_s.view_state; +} + +void apps_view_set_state(view_state_t state) +{ + if (state == VIEW_STATE_EDIT) { + homescreen_efl_btn_hide(HOMESCREEN_VIEW_APPS); + + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.bg); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + edje_object_signal_emit(edje, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + + Eina_List *find_list = NULL; + Evas_Object *page_ly; + EINA_LIST_FOREACH(apps_view_s.page_list, find_list, page_ly) { + elm_object_signal_emit(page_ly, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + } + + Eina_List *data_list = apps_data_get_list(); + app_data_t *item = NULL; + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->app_layout) { + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + if (item->is_removable) + elm_object_signal_emit(item->app_layout, SIGNAL_UNINSTALL_BUTTON_SHOW_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->app_layout, SIGNAL_CHOOSER_MODE_OFF, SIGNAL_SOURCE); + } + } + } else if (state == VIEW_STATE_CHOOSER) { + homescreen_efl_btn_hide(HOMESCREEN_VIEW_APPS); + elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_HIDE); + + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.bg); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + edje_object_signal_emit(edje, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + + Eina_List *find_list = NULL; + Evas_Object *page_ly; + EINA_LIST_FOREACH(apps_view_s.page_list, find_list, page_ly) { + elm_object_signal_emit(page_ly, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + } + + Eina_List *data_list = apps_data_get_list(); + app_data_t *item = NULL; + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->app_layout) { + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_ON_ANI, SIGNAL_SOURCE); + if (!item->is_folder) + elm_object_signal_emit(item->app_layout, SIGNAL_CHOOSER_MODE_ON, SIGNAL_SOURCE); + } + } + elm_object_signal_emit(apps_view_s.chooser_btn, SIGNAL_CHOOSER_BUTTON_SHOW, SIGNAL_SOURCE); + } else if (state == VIEW_STATE_NORMAL) { + homescreen_efl_btn_show(HOMESCREEN_VIEW_APPS); + elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_SHOW); + + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(apps_view_s.bg); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + edje_object_signal_emit(edje, SIGNAL_EDIT_MODE_OFF_ANI, SIGNAL_SOURCE); + + Eina_List *find_list = NULL; + Evas_Object *page_ly; + EINA_LIST_FOREACH(apps_view_s.page_list, find_list, page_ly) { + elm_object_signal_emit(page_ly, SIGNAL_EDIT_MODE_OFF_ANI, SIGNAL_SOURCE); + } + Eina_List *data_list = apps_data_get_list(); + app_data_t *item = NULL; + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->app_layout) { + elm_object_signal_emit(item->app_layout, SIGNAL_EDIT_MODE_OFF_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->app_layout, SIGNAL_UNINSTALL_BUTTON_HIDE_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->app_layout, SIGNAL_CHOOSER_MODE_OFF, SIGNAL_SOURCE); + } + item->is_checked = false; + } + if (apps_view_s.dest_folder) + elm_object_signal_emit(apps_view_s.dest_folder->app_layout, SIGNAL_ICON_ENABLE, SIGNAL_SOURCE); + apps_view_s.selected_items = eina_list_free(apps_view_s.selected_items); + apps_view_s.dest_folder = NULL; + apps_view_s.selected_item_count = 0; + elm_object_signal_emit(apps_view_s.chooser_btn, SIGNAL_CHOOSER_BUTTON_HIDE, SIGNAL_SOURCE); + } + + apps_view_s.pre_view_state = apps_view_s.view_state; + apps_view_s.view_state = state; +} + +void apps_view_update_folder_icon(app_data_t* item) +{ + Eina_List *folder_list = NULL; + Eina_List *find_list; + app_data_t *temp_item; + char folder_item_count_string[FOLDER_STR_LEN]; + Evas_Object *icon_image = NULL; + + int item_count = 0; + int i; + apps_data_get_folder_item_list(&folder_list, item); + item_count = eina_list_count(folder_list); + LOGD("item_count %d", item_count); + + for (i = 0, find_list = folder_list, temp_item = eina_list_data_get(find_list); + i < 4 && find_list; + i++, find_list = eina_list_next(find_list), temp_item = eina_list_data_get(find_list)) { + LOGD("%s", temp_item->label_str); + sprintf(folder_item_count_string, "icon_%d", i); + LOGD("%s", folder_item_count_string); + icon_image = elm_image_add(item->folder_layout); + elm_image_file_set(icon_image, temp_item->icon_path_str, NULL); + evas_object_size_hint_weight_set(icon_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(item->folder_layout, folder_item_count_string, icon_image); + evas_object_show(icon_image); + } + sprintf(folder_item_count_string, "set_item_count_%d", item_count > 4 ? 4 : item_count); + LOGD("%s", folder_item_count_string); + elm_object_signal_emit(item->folder_layout, folder_item_count_string, SIGNAL_SOURCE); + evas_object_show(item->folder_layout); + eina_list_free(folder_list); +} + +static void __apps_view_create_menu(void) +{ + apps_menu_table = eina_hash_int32_new(NULL); + eina_hash_add(apps_menu_table, &apps_menu_list[0], __apps_view_menu_edit_cb); + eina_hash_add(apps_menu_table, &apps_menu_list[1], __apps_view_menu_create_folder_cb); +} + +static void __apps_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + menu_hide(); + + apps_view_set_state(VIEW_STATE_EDIT); +} + +static void __apps_view_menu_create_folder_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + menu_hide(); + + apps_view_s.dest_folder = apps_data_add_folder(); + //apps_view_set_state(VIEW_STATE_CHOOSER); + __apps_view_open_folder_popup(apps_view_s.dest_folder); +} + +void apps_view_icon_add(app_data_t *item) +{ + if (item->parent_db_id == APPS_ROOT) + apps_view_create_icon(item); + else + LOGE("Parent is NOT APPS_ROOT"); +} + +static void __apps_view_open_folder_popup(app_data_t *item) +{ + char edj_path[PATH_MAX] = {0, }; + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/apps_folder_popup.edj")); + + apps_view_s.opened_folder = item; + + apps_view_s.folder_popup_ly = elm_layout_add(homescreen_efl_get_win()); + elm_layout_file_set(apps_view_s.folder_popup_ly , edj_path, GROUP_APPS_FOLDER_POPUP_LY); + evas_object_size_hint_weight_set(apps_view_s.folder_popup_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(apps_view_s.folder_popup_ly, apps_view_s.width, apps_view_s.height); + + evas_object_show(apps_view_s.folder_popup_ly); + + Evas_Object *entry = elm_entry_add(apps_view_s.folder_popup_ly); + apps_view_s.folder_title_entry = entry; + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_entry_single_line_set(entry, EINA_FALSE); + elm_entry_scrollable_set(entry, EINA_TRUE); + evas_object_show(entry); + + elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_entry_text_style_user_push(entry, "DEFAULT='font=Samsung Condensed:style=Regular align=center color=#4DE7FFFF font_size=40 wrap=none'"); + elm_entry_entry_set(entry, apps_view_s.opened_folder->label_str); + elm_object_part_content_set(apps_view_s.folder_popup_ly, APPS_FOLDER_TITLE, entry); + + __apps_view_folder_fill_apps(); + + evas_object_color_set(apps_view_s.folder_popup_ly, 255, 255, 255, 0); + apps_view_s.animator = ecore_animator_timeline_add(HOME_FOLDR_ANIMATION_TIME, __apps_view_show_folder_anim, NULL); + elm_object_signal_callback_add(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_HIDE, SIGNAL_SOURCE, + __apps_view_hide_folder_cb, NULL); +} + +static Eina_Bool __apps_view_show_folder_anim(void *data, double pos) +{ + evas_object_color_set(apps_view_s.folder_popup_ly, 255, 255, 255, pos*255); + + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(apps_view_s.folder_popup_ly, 255, 255, 255, 255); + apps_view_s.animator = NULL; + return ECORE_CALLBACK_DONE; + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __apps_view_hide_folder_anim(void *data, double pos) +{ + evas_object_color_set(apps_view_s.folder_popup_ly, 255, 255, 255, (1-pos)*255); + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(apps_view_s.folder_popup_ly, 255, 255, 255, 0); + __apps_view_close_folder_popup_done(); + apps_view_s.animator = NULL; + return ECORE_CALLBACK_DONE; + } + + return ECORE_CALLBACK_RENEW; +} + +static void __apps_view_close_folder_popup(app_data_t *item) +{ + apps_view_s.animator = ecore_animator_timeline_add(HOME_FOLDR_ANIMATION_TIME, __apps_view_hide_folder_anim, NULL); +} + +static void __apps_view_close_folder_popup_done(void) +{ + const char *folder_text = elm_object_text_get(apps_view_s.folder_title_entry); + if (!apps_view_s.opened_folder->label_str || strcmp(apps_view_s.opened_folder->label_str, folder_text)) { + if (apps_view_s.opened_folder->label_str) + free(apps_view_s.opened_folder->label_str); + apps_view_s.opened_folder->label_str = strdup(folder_text); + elm_object_part_text_set(apps_view_s.opened_folder->app_layout, APPS_ICON_NAME, apps_view_s.opened_folder->label_str); + apps_data_update_folder(apps_view_s.opened_folder); + } + + Eina_List *list = apps_data_get_list(); + app_data_t *item = NULL; + Eina_List *find_list; + EINA_LIST_FOREACH(list, find_list, item) { + if (item != NULL && item->parent_db_id == apps_view_s.opened_folder->db_id && item->app_layout) { + evas_object_del(item->app_layout); + } + } + evas_object_del(apps_view_s.folder_popup_ly); + apps_view_s.folder_title_entry = NULL; + apps_view_s.folder_popup_ly = NULL; + apps_view_s.opened_folder = NULL; +} +static void __apps_view_hide_folder_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + if (apps_view_s.opened_folder) + __apps_view_close_folder_popup(apps_view_s.opened_folder); +} + +static void __apps_view_create_chooser(void) +{ + char edj_path[PATH_MAX] = {0, }; + + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/apps_chooser_btn.edj")); + + apps_view_s.chooser_btn = elm_layout_add(homescreen_efl_get_win()); + elm_layout_file_set(apps_view_s.chooser_btn, edj_path, GROUP_APPS_CHOOSER_BTN_LY); + evas_object_size_hint_weight_set(apps_view_s.chooser_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(homescreen_efl_get_win(), apps_view_s.chooser_btn); + + evas_object_show(apps_view_s.chooser_btn); + + elm_object_signal_callback_add(apps_view_s.chooser_btn, SIGNAL_CHOOSER_LEFT_BTN_CLICKED, SIGNAL_SOURCE, __apps_view_chooser_left_btn_clicked, NULL); + elm_object_signal_callback_add(apps_view_s.chooser_btn, SIGNAL_CHOOSER_RIGHT_BTN_CLICKED, SIGNAL_SOURCE, __apps_view_chooser_right_btn_clicked, NULL); + __apps_view_update_chooser_text(apps_view_s.selected_item_count); +} + +static void __apps_view_chooser_left_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + LOGD("Cancel button clicked"); + apps_view_set_state(apps_view_s.pre_view_state); +} + +static void __apps_view_chooser_right_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + LOGD("Done button clicked"); + Eina_List *find_list; + app_data_t *item = NULL; + EINA_LIST_FOREACH(apps_view_s.selected_items, find_list, item) { + LOGD("%s-> move to folder {%d}", item->label_str, apps_view_s.dest_folder->db_id); + item->parent_db_id = apps_view_s.dest_folder->db_id; + apps_db_update(item); + if (item->app_layout) { + evas_object_del(item->app_layout); + item->app_layout = NULL; + } + } + apps_data_sort(); + apps_view_reroder(); + + Eina_List *list = apps_data_get_list(); + EINA_LIST_FOREACH(list, find_list, item) { + if (item->is_folder) + apps_view_update_folder_icon(item); + } + //apps_view_update_folder_icon(apps_view_s.dest_folder); + apps_view_set_state(VIEW_STATE_NORMAL); +} + +static void __apps_view_update_chooser_text(int item_count) +{ + char text[FOLDER_STR_LEN]; + if (apps_view_s.selected_item_count + item_count > 0) { + sprintf(text, _("IDS_MEMO_HEADER_PD_SELECTED_ABB2"), apps_view_s.selected_item_count + item_count); + } else + sprintf(text, ""); + elm_object_part_text_set(apps_view_s.chooser_btn, APPS_CHOOSER_MIDDLE_LABEL, text); + elm_object_part_text_set(apps_view_s.chooser_btn, APPS_CHOOSER_LEFT_LABEL, _("IDS_COM_SK_CANCEL")); + elm_object_part_text_set(apps_view_s.chooser_btn, APPS_CHOOSER_RIGHT_LABEL, _("IDS_COM_SK_DONE")); +} + +static void __apps_view_badge_update_cb(unsigned int action, const char *app_id, unsigned int count, void *user_data) +{ + LOGD("%s updated", app_id); + Eina_List *data_list = apps_data_get_list(); + Eina_List *find_list = NULL; + app_data_t *item = NULL; + if (app_id == NULL) { + LOGD("app id is NULL"); + EINA_LIST_FOREACH(data_list, find_list, item) { + __apps_view_badge_update_count(item); + } + return; + } + EINA_LIST_FOREACH(data_list, find_list, item) { + if (strcmp(app_id, item->pkg_str) == 0) { + __apps_view_badge_update_count(item); + } + } +} + +static void __apps_view_badge_update_count(app_data_t *item) +{ + unsigned int to_be_displayed = 0; + int result = BADGE_ERROR_NONE; + + if (!item->pkg_str) { + LOGE("app_item is NULL in badge count"); + return; + } + + result = badge_get_display(item->pkg_str, &to_be_displayed); + if (result != BADGE_ERROR_NONE) { + LOGE("badge_get_display error %d", result); + item->badge_count = 0; + return; + } + if (!to_be_displayed) { + item->badge_count = 0; + return; + } + + result = badge_get_count(item->pkg_str, &item->badge_count); + if (result != BADGE_ERROR_NONE) { + LOGE("badge_get_count error %d", result); + item->badge_count = 0; + return; + } + __apps_view_badge_update_icon(item); +} + +static void __apps_view_badge_update_icon(app_data_t *item) +{ + char number_str[FOLDER_STR_LEN]; + if (item->badge_count == 0) { + elm_object_signal_emit(item->app_layout, SIGNAL_BADGE_HIDE, SIGNAL_SOURCE); + return; + } + + if (item->badge_count > MAX_BADGE_DISPLAY_COUNT) { + sprintf(number_str, "%d+", MAX_BADGE_DISPLAY_COUNT); + } else { + sprintf(number_str, "%d", item->badge_count); + } + elm_layout_text_set(item->app_layout, APPS_ICON_BADGE_TEXT, number_str); + elm_object_signal_emit(item->app_layout, SIGNAL_BADGE_SHOW, SIGNAL_SOURCE); +} + +static void __apps_view_plus_icon_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + app_data_t *item = (app_data_t *)data; + Eina_List *folder_list = NULL; + apps_view_set_state(VIEW_STATE_CHOOSER); + __apps_view_close_folder_popup_done(); + apps_view_s.dest_folder = item; + elm_object_signal_emit(item->app_layout, SIGNAL_ICON_DISABLE, SIGNAL_SOURCE); + + apps_data_get_folder_item_list(&folder_list, item); + apps_view_s.selected_item_count = eina_list_count(folder_list); + __apps_view_update_chooser_text(0); + + eina_list_free(folder_list); +} + +static void __apps_view_create_toast_popup(char *str) +{ + Evas_Object *popup; + + popup = elm_popup_add(homescreen_efl_get_win()); + elm_object_style_set(popup, "toast"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, str); + elm_popup_timeout_set(popup, 2.0); + eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL); + evas_object_smart_callback_add(popup, "block,clicked", __apps_view_toast_popup_block_clicked_cb, NULL); + evas_object_smart_callback_add(popup, "timeout", __apps_view_toast_popup_timeout_cb, NULL); + + evas_object_show(popup); + +} + +static void __apps_view_toast_popup_timeout_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_del(obj); +} +static void __apps_view_toast_popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_del(obj); +} diff --git a/src/cluster_data.c b/src/cluster_data.c new file mode 100755 index 0000000..6b01aef --- /dev/null +++ b/src/cluster_data.c @@ -0,0 +1,155 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +#include "cluster_data.h" +#include "cluster_db.h" +#include "cluster_view.h" +#include "util.h" +#include "conf.h" + +#define CLUSTER_DATA_PAGE_COUNT "cluster_page_count" + +static struct { + Eina_List *data_list; +} cluster_data_s = { + .data_list = NULL +}; + +static void __cluster_data_item_free(widget_data_t *item); +static void __cluster_data_insert_default_data(void); + +void cluster_data_init(void) +{ + if (cluster_db_create()) { + __cluster_data_insert_default_data(); + cluster_data_set_page_count(2); + } + cluster_db_get_list(&cluster_data_s.data_list); +} + +Eina_List *cluster_data_get_widget_list(void) +{ + return cluster_data_s.data_list; +} + +int cluster_data_get_page_count() +{ + int result = -1; + if (preference_get_int(CLUSTER_DATA_PAGE_COUNT, &result) != PREFERENCE_ERROR_NONE) { + LOGE("preference_get_int : Error"); + result = -1; + } + return result; +} + +void cluster_data_set_page_count(int count) +{ + if (preference_set_int(CLUSTER_DATA_PAGE_COUNT, count) != PREFERENCE_ERROR_NONE) { + LOGE("preference_set_int(CLUSTER_DATA_PAGE_COUNT, %d): Error", count); + } +} + +void cluster_data_insert_widget(const char* pkg_name, const char* content_info, int type) +{ + widget_data_t *new_item = (widget_data_t *)malloc(sizeof(widget_data_t)); + memset(new_item, 0, sizeof(widget_data_t)); + + new_item->page_idx = INIT_VALUE; + new_item->pos_y = INIT_VALUE; + new_item->pos_x = INIT_VALUE; + new_item->pkg_name = strdup(pkg_name); + new_item->content_info = content_info == NULL ? NULL : strdup(content_info); + new_item->type = type; + new_item->period = 0.0; + new_item->allow_duplicate = 1; + + if (!cluster_view_add_widget(new_item, true)) { + __cluster_data_item_free(new_item); + return ; + } + cluster_data_insert(new_item); +} + +void cluster_data_insert(widget_data_t *item) +{ + LOGD("%s - inserted to paged[%d]", item->pkg_name, item->page_idx); + cluster_db_insert(item); + cluster_data_s.data_list = eina_list_append(cluster_data_s.data_list, item); +} + +void cluster_data_delete(widget_data_t *item) +{ + LOGD("%s - delete", item->pkg_name); + cluster_db_delete(item); + cluster_data_s.data_list = eina_list_remove(cluster_data_s.data_list, item); + cluster_view_delete_widget(item); + __cluster_data_item_free(item); +} + +void cluster_data_update(widget_data_t *item) +{ + cluster_db_update(item); +} + +static void __cluster_data_insert_default_data(void) +{ + /* org.tizen.gallery.widget + * org.tizen.calendar.widget + * org.tizen.music-player.widget + * org.tizen.contacts-widget + */ + widget_data_t *new_item = (widget_data_t *)malloc(sizeof(widget_data_t)); + memset(new_item, 0, sizeof(widget_data_t)); + new_item->page_idx = 0; + new_item->pos_y = 0; + new_item->pos_x = 0; + new_item->pkg_name = strdup("org.tizen.gallery.widget"); + new_item->content_info = NULL; + new_item->type = WIDGET_SIZE_TYPE_4x4; + new_item->period = 0.0; + new_item->allow_duplicate = 1; + + cluster_db_insert(new_item); +/* + new_item = (widget_data_t *)malloc(sizeof(widget_data_t)); + memset(new_item, 0, sizeof(widget_data_t)); + + new_item->page_idx = 1; + new_item->pos_y = 0; + new_item->pos_x = 0; + new_item->pkg_name = strdup("org.tizen.gallery.widget"); + new_item->content_info = NULL; + new_item->type = WIDGET_SIZE_TYPE_4x4; + new_item->period = 0.0; + new_item->allow_duplicate = 1; + + cluster_data_insert(new_item); + */ +} + +static void __cluster_data_item_free(widget_data_t *item) +{ + if (item && item->widget_layout) + evas_object_del(item->widget_layout); + if (item && item->pkg_name) + free(item->pkg_name); + if (item && item->content_info) + free(item->content_info); + if (item) + free(item); + +} diff --git a/src/cluster_db.c b/src/cluster_db.c new file mode 100755 index 0000000..db22d5c --- /dev/null +++ b/src/cluster_db.c @@ -0,0 +1,243 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "cluster_db.h" +#include "cluster_data.h" +#include "util.h" + +#define CLUSTER_DB_NAME ".cluster-data.db" +#define QUERY_MAXLEN 4096 + +static sqlite3 *cluster_db = NULL; + +enum { + COL_WIDGET_ID = 0, + COL_PAGE_INDEX, + COL_POS_Y, + COL_POS_X, + COL_PKG_NAME, + COL_CONTENT_INFO, + COL_TYPE, + COL_PERIOD, + COL_ALLOW_DUPLICATE +}; + +#define CREATE_CLUSTER_DB_TABLE "CREATE TABLE IF NOT EXISTS clusters (\ + widgetId INTEGER PRIMARY KEY AUTOINCREMENT,\ + pageIndex INTEGER default 0,\ + y INTEGER default 0,\ + x INTEGER default 0,\ + pkgName TEXT,\ + content TEXT,\ + type INTEGER default 0,\ + period REAL default 0.0,\ + allow INTEGER default 1);" + +#define UPDATE_CLUSTER_DB_TABLE "UPDATE clusters set \ + pageIndex=%d,\ + y=%d,\ + x=%d,\ + pkgName='%s',\ + content='%s',\ + type=%d,\ + period=%lf,\ + allow=%d WHERE widgetId=%d" + +#define INSERT_CLUSTER_DB_TABLE "INSERT into clusters (\ + pageIndex,\ + y,\ + x,\ + pkgName,\ + content,\ + type,\ + period,\ + allow) VALUES(%d,%d, %d,'%s','%s',%d, '%lf',%d)" + +#define SELECT_ITEM "SELECT * FROM clusters;" + +static bool __cluster_db_open(void); + +bool cluster_db_create(void) +{ + char *errMsg; + int ret; + const char *db_path = util_get_data_file_path(CLUSTER_DB_NAME); + FILE *fp = fopen(db_path, "r"); + if (fp) { + fclose(fp); + LOGE("cluster DB[%s] exist", db_path); + return false; + } + + ret = sqlite3_open(db_path, &cluster_db); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%d] : path [%s]", ret, db_path); + return false; + } + + ret = sqlite3_exec(cluster_db, "PRAGMA journal_mode = PERSIST", NULL, NULL, &errMsg); + if (ret != SQLITE_OK) { + LOGE("SQL error(%d) : %s", ret, errMsg); + sqlite3_free(errMsg); + return false; + } + + ret = sqlite3_exec(cluster_db, CREATE_CLUSTER_DB_TABLE, NULL, NULL, &errMsg); + if (ret != SQLITE_OK) { + LOGE("SQL error(%d) : %s", ret, errMsg); + sqlite3_free(errMsg); + return false; + } + LOGD("Create DB[%s] : [%s] OK ", db_path, CREATE_CLUSTER_DB_TABLE); + return true; +} + +bool cluster_db_close() +{ + if (cluster_db) { + sqlite3_exec(cluster_db, "COMMIT TRANSACTION", NULL, NULL, NULL); + sqlite3_close(cluster_db); + cluster_db = NULL; + } + return true; +} + +bool cluster_db_get_list(Eina_List **cluster_list) +{ + sqlite3_stmt *stmt; + if (!__cluster_db_open()) + return false; + int ret = sqlite3_prepare_v2(cluster_db, SELECT_ITEM, strlen(SELECT_ITEM), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", SELECT_ITEM, sqlite3_errmsg(cluster_db)); + return false; + } + + const char *str; + while (sqlite3_step(stmt) == SQLITE_ROW) { + widget_data_t *item = (widget_data_t *)malloc(sizeof(widget_data_t)); + memset(item, 0, sizeof(widget_data_t)); + + item->widget_id = sqlite3_column_int(stmt, COL_WIDGET_ID); + item->page_idx = sqlite3_column_int(stmt, COL_PAGE_INDEX); + item->pos_y = sqlite3_column_int(stmt, COL_POS_Y); + item->pos_x = sqlite3_column_int(stmt, COL_POS_X); + str = (const char *) sqlite3_column_text(stmt, COL_PKG_NAME); + item->pkg_name = (!str || !strlen(str)) ? NULL : strdup(str); + str = (const char *) sqlite3_column_text(stmt, COL_CONTENT_INFO); + item->content_info = (!str || !strlen(str)) ? NULL : strdup(str); + item->type = sqlite3_column_int(stmt, COL_TYPE); + item->period = sqlite3_column_double(stmt, COL_PERIOD); + item->allow_duplicate = sqlite3_column_int(stmt, COL_ALLOW_DUPLICATE); + *cluster_list = eina_list_append(*cluster_list, item); + } + sqlite3_finalize(stmt); + return true; +} + +bool cluster_db_update(widget_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__cluster_db_open()) + return false; + + snprintf(query, QUERY_MAXLEN, UPDATE_CLUSTER_DB_TABLE, + item->page_idx, + item->pos_y, + item->pos_x, + item->pkg_name, + item->content_info, + item->type, + item->period, + item->allow_duplicate, + item->widget_id); + int ret = sqlite3_prepare(cluster_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(cluster_db)); + return false; + } + sqlite3_step(stmt); + sqlite3_finalize(stmt); + cluster_db_close(); + return true; +} + +bool cluster_db_insert(widget_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__cluster_db_open()) + return false; + snprintf(query, QUERY_MAXLEN, INSERT_CLUSTER_DB_TABLE, + item->page_idx, + item->pos_y, + item->pos_x, + item->pkg_name, + item->content_info, + item->type, + item->period, + item->allow_duplicate); + int ret = sqlite3_prepare(cluster_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(cluster_db)); + return false; + } + sqlite3_step(stmt); + sqlite3_finalize(stmt); + item->widget_id = (int)sqlite3_last_insert_rowid(cluster_db); + + cluster_db_close(); + return true; +} + + +bool cluster_db_delete(widget_data_t *item) +{ + char query[QUERY_MAXLEN]; + sqlite3_stmt *stmt; + if (!__cluster_db_open()) + return false; + + snprintf(query, QUERY_MAXLEN, "DELETE FROM clusters WHERE widgetId=%d", item->widget_id); + int ret = sqlite3_prepare(cluster_db, query, QUERY_MAXLEN , &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%s,%s]", query, sqlite3_errmsg(cluster_db)); + return false; + } + + sqlite3_step(stmt); + sqlite3_finalize(stmt); + + cluster_db_close(); + return true; +} + +bool __cluster_db_open() +{ + if (!cluster_db) { + int ret; + ret = sqlite3_open(util_get_data_file_path(CLUSTER_DB_NAME), &cluster_db); + if (ret != SQLITE_OK) { + LOGE("sqlite error : [%d] : path [%s]", ret, util_get_data_file_path(CLUSTER_DB_NAME)); + return false; + } + } + return true; +} diff --git a/src/cluster_page.c b/src/cluster_page.c new file mode 100755 index 0000000..f216dae --- /dev/null +++ b/src/cluster_page.c @@ -0,0 +1,274 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cluster_page.h" +#include "conf.h" +#include "edc_conf.h" +#include "util.h" + +void __cluster_page_set(cluster_page_t *page, widget_data_t *item); +void __cluster_page_print_space(cluster_page_t *page); +void __cluster_page_get_widget_size(widget_size_type_e type, int *w, int *h); + +cluster_page_t *cluster_page_new(Evas_Object* parent) +{ + cluster_page_t *page_t = (cluster_page_t *)malloc(sizeof(cluster_page_t)); + memset(page_t, 0, sizeof(cluster_page_t)); + + page_t->page_layout = elm_layout_add(parent); + elm_layout_file_set(page_t->page_layout, util_get_res_file_path(EDJE_DIR"/cluster_page.edj"), GROUP_CLUSTER_PAGE_LY); + evas_object_size_hint_align_set(page_t->page_layout, 0, 0); + evas_object_size_hint_weight_set(page_t->page_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(page_t->page_layout, CLUSTER_W, CLUSTER_H); + evas_object_show(page_t->page_layout); + + Evas_Object *page_bg = evas_object_rectangle_add(evas_object_evas_get(page_t->page_layout)); + evas_object_size_hint_min_set(page_bg, CLUSTER_W, CLUSTER_H); + evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(page_bg, 0, 0, 0, 0); + evas_object_show(page_bg); + elm_object_part_content_set(page_t->page_layout, SIZE_SETTER, page_bg); + + Evas_Object *grid = elm_grid_add(page_t->page_layout); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_size_set(grid, CLUSTER_COL, CLUSTER_ROW); + evas_object_show(grid); + elm_layout_content_set(page_t->page_layout, CLUSTER_BOX, grid); + page_t->grid = grid; + return page_t; +} + +void cluster_page_delete(cluster_page_t *page) +{ + evas_object_del(page->page_layout); + eina_list_free(page->widget_list); + free(page); +} + +bool cluster_page_set_widget(cluster_page_t *page, widget_data_t *item) +{ + if (item == NULL) { + LOGE("widget data is NULL"); + return false; + } + + int x, y; + if (cluster_page_check_empty_space(page, item->type, item->pos_x, item->pos_y, &x, &y)) { + item->page_idx = page->page_index; + item->pos_x = x; + item->pos_y = y; + __cluster_page_set(page, item); + return true; + } + return false; +} + +bool cluster_page_unset(cluster_page_t *page, widget_data_t *item) +{ + int w, h; + int i, j; + __cluster_page_get_widget_size(item->type, &w, &h); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + page->space[item->pos_y + i][item->pos_x + j] = 0; + } + } + + elm_grid_unpack(page->grid, item->widget_layout); + page->widget_list = eina_list_remove(page->widget_list, item); + return true; +} + +bool cluster_page_check_empty_space(cluster_page_t *page, widget_size_type_e type, + int pos_x, int pos_y, int *empty_x, int *empty_y) +{ + LOGD("%d %d", pos_x, pos_y); + int w, h; + int from_x, to_x, from_y, to_y; + int x, y, i, j; + __cluster_page_get_widget_size(type, &w, &h); + + if (pos_x == INIT_VALUE || pos_y == INIT_VALUE) { + from_x = from_y = 0; + to_x = to_y = 3; + } else if (pos_x < 0 || pos_y < 0 || pos_x >= CLUSTER_COL || pos_y >= CLUSTER_ROW) { + return false; + } else { + from_x = to_x = pos_x; + from_y = to_y = pos_y; + } + LOGD("from %d %d", from_x, from_y); + + for (y = from_y; y <= to_y; y++) { + for (x = from_x; x <= to_x; x++) { + bool find = true; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + if (y + i >= 4 || x + j >= 4 || page->space[y + i][x + j] == 1) { + find = false; + break; + } + if (!find) + break; + } + } + if (find) { + if (empty_x) + *empty_x = x; + if (empty_y) + *empty_y = y; + LOGD("empty"); + return true; + } + } + } + + if (empty_x) + *empty_x = INIT_VALUE; + if (empty_y) + *empty_y = INIT_VALUE; + LOGD("NOT empty"); + return false; +} + +void __cluster_page_set(cluster_page_t *page, widget_data_t *item) +{ + int w, h; + int i, j; + __cluster_page_get_widget_size(item->type, &w, &h); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + page->space[item->pos_y + i][item->pos_x + j] = 1; + } + } + + elm_grid_pack(page->grid, item->widget_layout, item->pos_x, item->pos_y, w, h); + cluster_data_update(item); + page->widget_list = eina_list_append(page->widget_list, item); +} + +Evas_Object *cluster_page_thumbnail(cluster_page_t *page_t) +{ + Evas_Object *image = NULL; + if (!page_t || !page_t->page_layout) { + LOGE("Invalid page"); + return NULL; + } + + image = evas_object_image_filled_add(evas_object_evas_get(page_t->page_layout)); + if (!image) { + LOGE("Could not create image proxy object"); + return NULL; + } + + if (!evas_object_image_source_set(image, page_t->page_layout)) { + evas_object_del(image); + LOGE("Could not set proxy image source"); + return NULL; + } + + evas_object_image_fill_set(image, 0, 0, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + evas_object_show(image); + + return image; +} +void cluster_page_drag_cancel(cluster_page_t *page) +{ + if (page->highlight) { + evas_object_del(page->highlight); + page->highlight = NULL; + } +} + +void cluster_page_drag_widget(cluster_page_t *page, widget_size_type_e type, int pos_x, int pos_y) +{ + if (!page->highlight) { + int w = 0, h = 0; + LOGD("Create Highlight"); + page->highlight_pos_x = INIT_VALUE; + page->highlight_pos_y = INIT_VALUE; + page->highlight = evas_object_rectangle_add(evas_object_evas_get(page->page_layout)); + edje_object_part_geometry_get(elm_layout_edje_get(page->page_layout), CLUSTER_BG, NULL, NULL, &w, &h); + evas_object_size_hint_min_set(page->highlight, w /CLUSTER_COL, h / CLUSTER_ROW); + evas_object_size_hint_align_set(page->highlight, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(page->highlight, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(page->highlight, 255 , 255, 255, 100); + } + if (cluster_page_check_empty_space(page, type, pos_x, pos_y, NULL, NULL)) { + if (pos_x != page->highlight_pos_x || pos_y != page->highlight_pos_y) { + int w, h; + page->highlight_pos_x = pos_x; + page->highlight_pos_y = pos_y; + elm_grid_unpack(page->grid, page->highlight); + __cluster_page_get_widget_size(type, &w, &h); + elm_grid_pack(page->grid, page->highlight, pos_x, pos_y, w, h); + evas_object_show(page->highlight); + } + } else { + page->highlight_pos_x = INIT_VALUE; + page->highlight_pos_y = INIT_VALUE; + elm_grid_unpack(page->grid, page->highlight); + evas_object_hide(page->highlight); + } +} + +bool cluster_page_drop_widget(cluster_page_t *page, widget_data_t *widget) +{ + if (!page->highlight || page->highlight_pos_x == INIT_VALUE || page->highlight_pos_y == INIT_VALUE) + return false; + + elm_grid_unpack(page->grid, page->highlight); + evas_object_del(page->highlight); + page->highlight = NULL; + + widget->page_idx = page->page_index; + widget->pos_x = page->highlight_pos_x; + widget->pos_y = page->highlight_pos_y; + __cluster_page_set(page, widget); + return true; +} + +void __cluster_page_print_space(cluster_page_t *page) +{ + LOGD("========================================="); + int i; + for (i = 0; i < 4; i++) { + LOGD("%d %d %d %d", page->space[i][0], page->space[i][1], page->space[i][2], page->space[i][3]); + } + LOGD("========================================="); +} + +void __cluster_page_get_widget_size(widget_size_type_e type, int *w, int *h) +{ + switch (type) { + case WIDGET_SIZE_TYPE_4x2: + *w = 4; + *h = 2; + break; + case WIDGET_SIZE_TYPE_4x4: + *w = 4; + *h = 4; + break; + default: + *w = *h = 0; + LOGE("NOT support type : %d", type); + break; + } +} diff --git a/src/cluster_view.c b/src/cluster_view.c new file mode 100755 index 0000000..d8c70da --- /dev/null +++ b/src/cluster_view.c @@ -0,0 +1,1227 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "homescreen-efl.h" +#include "cluster_view.h" +#include "conf.h" +#include "edc_conf.h" +#include "util.h" +#include "page_indicator.h" +#include "widget_viewer.h" +#include "menu.h" +#include "popup.h" +#include "cluster_page.h" +#include "cluster_data.h" +#include "add_widget_viewer/add_widget_viewer.h" +#include "mouse.h" + +static struct { + Evas_Object *win; + Evas_Object *scroller; + Evas_Object *box; + Evas_Object *allpage; + Evas_Object *allpage_add_page; + Evas_Object *allpage_grid; + page_indicator_t *indicator; + int page_count; + int current_page; + view_state_t view_state; + Eina_List *page_list; + cluster_page_t *picked_page; + widget_data_t *picked_widget; + Ecore_Timer *edit_mode_scroll_timer; + bool is_srolling; +} cluster_view_s = { + .scroller = NULL, + .box = NULL, + .allpage = NULL, + .allpage_add_page = NULL, + .allpage_grid = NULL, + .indicator = NULL, + .page_count = 0, + .current_page = INIT_VALUE, + .view_state = VIEW_STATE_NORMAL, + .page_list = NULL, + .picked_page = NULL, + .picked_widget = NULL, + .edit_mode_scroll_timer = NULL, + .is_srolling = false, +}; + +static int cluster_menu_list[4] = { + MENU_CLUSTER_EDIT, + MENU_CLUSTER_ADD_WIDGET, + MENU_CLUSTER_CHANGE_WALLPAPER, + MENU_CLUSTER_ALL_PAGES +}; + +static mouse_info_t cluster_mouse_info = { + .pressed = false, + .long_pressed = false, + .down_x = 0, + .down_y = 0, + .move_x = 0, + .move_y = 0, + .up_x = 0, + .up_y = 0, + .long_press_timer = NULL, + .offset_x = 0, + .offset_y = 0, +}; + +static Eina_Hash *cluster_menu_table = NULL; + +Evas_Object *__cluster_view_create_base_gui(Evas_Object *win); +static void __cluster_view_create_cluster(void); +static void __cluster_view_create_menu(void); +static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info); +static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info); +static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info); +static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info); +static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data); +static void __cluster_view_scroll_to_home(void); +static void __cluster_view_scroll_to_page(int page_idx, bool animation); +static void __cluster_view_add_widget_content(widget_data_t *item); +static void __cluster_view_create_all_page(void); +static void __cluster_view_destroy_all_page(void); +static cluster_page_t * __cluster_view_page_new(void); +static void __cluster_view_page_delete(cluster_page_t *page); +static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info); + +static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data); +static void __cluster_view_allpage_drag_page(void *data); +static void __cluster_view_allpage_pick_up_page(void *data); +static void __cluster_view_allpage_drop_page(void *data); + +static void __clsuter_view_edit_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_edit_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Eina_Bool __cluster_view_edit_long_press_time_cb(void *data); + +static void __cluster_view_edit_pick_up_widget(void *data); +static void __cluster_view_edit_drag_widget(void *data); +static void __cluster_view_edit_drop_widget(void *data); + + +static Eina_Bool __cluster_view_scroll_timer_cb(void *data); + +static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info); +static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h); +static int __cluster_view_allpage_get_page_index(int x, int y); +static void __cluster_view_allpage_reposition(void); +static int __cluster_view_page_sort_cb(const void *a , const void *b); + +Evas_Object *cluster_view_create(Evas_Object *win) +{ + cluster_view_s.win = win; + + widget_viewer_init(win); + cluster_data_init(); + + Evas_Object *base_layout = __cluster_view_create_base_gui(win); + + if (base_layout == NULL) { + LOGE("[FAILED][base_layout == NULL]"); + return NULL; + } + + cluster_view_s.indicator = page_indictor_create(cluster_view_s.scroller); + page_indicator_scroller_resize(cluster_view_s.indicator, CLUSTER_VIEW_W , CLUSTER_VIEW_H); + + __cluster_view_create_cluster(); + __cluster_view_create_menu(); + + return base_layout; +} + +void cluster_view_app_terminate(void) +{ + eina_hash_free(cluster_menu_table); + widget_viewer_fini(); +} + +void cluster_view_show(void) +{ + page_indicator_show(cluster_view_s.indicator); +} + +void cluster_view_hide(void) +{ + page_indicator_hide(cluster_view_s.indicator); +} + +void cluster_view_show_anim(double pos) +{ + evas_object_color_set(cluster_view_s.box, 255, 255, 255, pos*255); + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(cluster_view_s.box, 255, 255, 255, 255); + } +} + +void cluster_view_hide_anim(double pos) +{ + evas_object_color_set(cluster_view_s.box, 255, 255, 255, (1-pos)*255); + if (pos >= (1.0 - (1e-10))) { + evas_object_color_set(cluster_view_s.box, 255, 255, 255, 0); + } +} + +Evas_Object *__cluster_view_create_base_gui(Evas_Object *win) +{ + cluster_view_s.scroller = elm_scroller_add(win); + if (cluster_view_s.scroller == NULL) { + return NULL; + } + elm_scroller_content_min_limit(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE); + elm_scroller_bounce_set(cluster_view_s.scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(cluster_view_s.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_scroll_limit_set(cluster_view_s.scroller, 1, 0); + evas_object_size_hint_weight_set(cluster_view_s.scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(cluster_view_s.scroller, CLUSTER_VIEW_W, CLUSTER_VIEW_H); + + elm_scroller_loop_set(cluster_view_s.scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_page_size_set(cluster_view_s.scroller, CLUSTER_W , CLUSTER_H); + + evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL); + + cluster_view_s.box = elm_box_add(cluster_view_s.scroller); + elm_box_horizontal_set(cluster_view_s.box, EINA_TRUE); + evas_object_size_hint_weight_set(cluster_view_s.box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cluster_view_s.box, 0, 0); + evas_object_show(cluster_view_s.box); + + elm_object_content_set(cluster_view_s.scroller, cluster_view_s.box); + + return cluster_view_s.scroller; +} + +static void __cluster_view_create_cluster(void) +{ + Eina_List *widget_list = cluster_data_get_widget_list(); + int page_count = cluster_data_get_page_count(); + cluster_view_s.current_page = CLUSTER_HOME_PAGE; + + while (page_count--) { + __cluster_view_page_new(); + } + + Eina_List *find_list; + widget_data_t *item = NULL; + EINA_LIST_FOREACH(widget_list, find_list, item) { + __cluster_view_add_widget_content(item); + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx); + if (page == NULL) { + LOGE("page is NULL"); + } else { + if (!cluster_page_set_widget(page, item)) { + LOGE("failed cluster_page_set_widget page %d", item->page_idx); + } + } + } + + page_indicator_set_current_page(cluster_view_s.indicator, cluster_view_s.current_page); +} + +static void __cluster_view_create_menu(void) +{ + cluster_menu_table = eina_hash_int32_new(NULL); + eina_hash_add(cluster_menu_table, &cluster_menu_list[0], __cluster_view_menu_edit_cb); + eina_hash_add(cluster_menu_table, &cluster_menu_list[1], __cluster_view_menu_add_widget_cb); + eina_hash_add(cluster_menu_table, &cluster_menu_list[2], __cluster_view_menu_change_wallpaper_cb); + eina_hash_add(cluster_menu_table, &cluster_menu_list[3], __cluster_view_menu_all_pages_cb); +} + +static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + menu_hide(); + + cluster_view_set_state(VIEW_STATE_EDIT); +} + +static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + menu_hide(); + + cluster_view_set_state(VIEW_STATE_ADD_VIEWER); +} + +static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + + const char *appid = "org.tizen.wallpaper-ui-service"; + app_control_h app_control_handle = NULL; + + if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_create]"); + return; + } + + app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl"); + app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup"); + app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen"); + + if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_set_app_id]"); + app_control_destroy(app_control_handle); + return; + } + + if (app_control_send_launch_request(app_control_handle, __cluster_view_app_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) { + LOGE("[FAILED][app_control_send_launch_request]"); + app_control_destroy(app_control_handle); + return; + } + + app_control_destroy(app_control_handle); + + menu_hide(); +} + +static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info) +{ + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + menu_hide(); + + cluster_view_set_state(VIEW_STATE_ALL_PAGE); +} + +void cluster_view_hw_menu_key(void) +{ + if (cluster_view_s.view_state == VIEW_STATE_NORMAL) + menu_change_state_on_hw_menu_key(cluster_menu_table); +} + +bool cluster_view_hw_home_key(void) +{ + if (cluster_view_s.view_state == VIEW_STATE_NORMAL) { + __cluster_view_scroll_to_home(); + } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } + + return true; +} + +bool cluster_view_hw_back_key(void) +{ + if (cluster_view_s.view_state == VIEW_STATE_NORMAL) { + return true; + } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) { + cluster_view_set_state(VIEW_STATE_NORMAL); + } + + return true; +} + +view_state_t cluster_view_get_state(void) +{ + return cluster_view_s.view_state; +} + +void cluster_view_set_state(view_state_t state) +{ + if (state == VIEW_STATE_EDIT) { + homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME); + + Eina_List *data_list = cluster_data_get_widget_list(); + Eina_List *find_list = NULL; + + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item->page_layout) { + elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE); + } + } + + widget_data_t *item = NULL; + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->widget_layout) { + elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE); + + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_edit_down_cb, item); + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_edit_move_cb, item); + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_edit_up_cb, item); + } + } + } else if (state == VIEW_STATE_NORMAL) { + if (cluster_view_s.view_state == VIEW_STATE_EDIT) { + homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME); + + Eina_List *data_list = cluster_data_get_widget_list(); + Eina_List *find_list = NULL; + + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item->page_layout) { + elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE); + } + } + + widget_data_t *item = NULL; + EINA_LIST_FOREACH(data_list, find_list, item) { + if (item->widget_layout) { + elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_NORMAL_STATE, SIGNAL_SOURCE); + + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_edit_down_cb); + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_edit_move_cb); + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_edit_up_cb); + } + } + } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) { + add_widget_viewer_win_destroy(); + } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) { + elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_SHOW); + homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME); + page_indicator_show(cluster_view_s.indicator); + evas_object_show(cluster_view_s.scroller); + __cluster_view_destroy_all_page(); + + Eina_List *find_list = NULL; + + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item->page_layout) { + elm_box_pack_end(cluster_view_s.box, page_item->page_layout); + } + } + + if (cluster_view_s.current_page >= cluster_view_s.page_count) { + cluster_view_s.current_page = CLUSTER_HOME_PAGE; + } + __cluster_view_scroll_to_page(cluster_view_s.current_page, false); + } + } else if (state == VIEW_STATE_ADD_VIEWER) { + add_widget_viewer_win_create(); + } else if (state == VIEW_STATE_ALL_PAGE) { + elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_HIDE); + homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME); + page_indicator_hide(cluster_view_s.indicator); + + __cluster_view_create_all_page(); + } + + cluster_view_s.view_state = state; +} + +bool cluster_view_add_widget(widget_data_t *item, bool scroll) +{ + if (!item->widget_layout) + __cluster_view_add_widget_content(item); + + int page_idx = INIT_VALUE; + bool set_on = false; + + if (item->page_idx >= 0) { + page_idx = item->page_idx; + } else { + page_idx = cluster_view_s.current_page; + } + + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, page_idx); + set_on = cluster_page_set_widget(page, item); + + if (!set_on && !cluster_page_set_widget(page, item)) { + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + bool set_on = false; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item == NULL) { + LOGE("page is NULL"); + } else { + if (cluster_page_set_widget(page_item, item)) { + page_idx = page_item->page_index; + set_on = true; + break; + } + } + } + + if (!set_on) { + if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) { + LOGE("cluster page is max."); + + Evas_Smart_Cb func[3] = { NULL, NULL, NULL }; + void *data[3] = { NULL, NULL, NULL }; + popup_show(POPUP_CLUSTER_PAGE_FULL, 1, func, data); + return false; + } else { + cluster_page_t *page_t = __cluster_view_page_new(); + if (!page_t || !cluster_page_set_widget(page_t, item)) { + LOGE("Cannot add widget"); + return false; + } + page_idx = page_t->page_index; + } + } + } + + if (scroll) { + cluster_view_s.current_page = page_idx; + __cluster_view_scroll_to_page(cluster_view_s.current_page, true); + } + + return true; +} + +void cluster_view_delete_widget(widget_data_t *item) +{ + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx); + if (page) + cluster_page_unset(page, item); + else + LOGE("Page is NULL"); + evas_object_del(item->widget_layout); + item->widget_layout = NULL; +} + +static void __cluster_view_scroll_to_home(void) +{ + __cluster_view_scroll_to_page(CLUSTER_HOME_PAGE, true); +} + +static void __cluster_view_scroll_to_page(int page_idx, bool animation) +{ + if (animation) { + cluster_view_s.is_srolling = true; + elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0); + } else { + page_indicator_set_current_page(cluster_view_s.indicator, page_idx); + elm_scroller_page_show(cluster_view_s.scroller, page_idx, 0); + } +} + +static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data) +{ + switch (result) { + case APP_CONTROL_RESULT_CANCELED: + LOGE("[APP_CONTROL_RESULT_CANCELED]"); + break; + case APP_CONTROL_RESULT_FAILED: + LOGE("[APP_CONTROL_RESULT_FAILED]"); + break; + case APP_CONTROL_RESULT_SUCCEEDED: + LOGD("[APP_CONTROL_RESULT_SUCCEEDED]"); + break; + default: + LOGE("UNKNOWN ERROR"); + break; + } +} + +static void __cluster_view_add_widget_content(widget_data_t *item) +{ + int w, h; + LOGD("Create Widget: pkg[%s], type[%d]", item->pkg_name, item->type); + item->widget_layout = widget_viewer_add_widget(cluster_view_s.win, item, &w, &h); + LOGD("widget size : %d %d", w, h); +} + +static void __cluster_view_create_all_page(void) +{ + cluster_view_s.allpage = elm_layout_add(homescreen_efl_get_win()); + elm_layout_file_set(cluster_view_s.allpage, util_get_res_file_path(EDJE_DIR"/cluster_allpage.edj"), GROUP_CLUSTER_ALLPAGE_LY); + + evas_object_size_hint_align_set(cluster_view_s.allpage, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(cluster_view_s.allpage, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_move(cluster_view_s.allpage, 0, 0); + evas_object_show(cluster_view_s.allpage); + + Evas_Object *page_bg = evas_object_rectangle_add(evas_object_evas_get(cluster_view_s.allpage)); + evas_object_size_hint_min_set(page_bg, WINDOW_W, WINDOW_H); + evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(page_bg, 0, 0, 0, 50); + evas_object_show(page_bg); + elm_object_part_content_set(cluster_view_s.allpage, SIZE_SETTER, page_bg); + + Evas_Object *grid = elm_grid_add(cluster_view_s.allpage); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_size_set(grid, WINDOW_W, WINDOW_H); + evas_object_show(grid); + elm_layout_content_set(cluster_view_s.allpage, CLUSTER_ALLPAGE_GRID, grid); + cluster_view_s.allpage_grid = grid; + + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + elm_box_unpack_all(cluster_view_s.box); + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + //HIDE page + evas_object_move(page_item->page_layout, -720, 0); + //make thumbnail ly + if (page_item->page_layout) { + page_item->thumbnail_ly = elm_layout_add(page_item->page_layout); + elm_layout_file_set(page_item->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY); + + evas_object_size_hint_align_set(page_item->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(page_item->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(page_item->thumbnail_ly); + + Evas_Object *thumbnail = cluster_page_thumbnail(page_item); + elm_object_part_content_set(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail); + elm_object_signal_callback_add(page_item->thumbnail_ly, + SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE, + __cluster_view_allpage_delete_clicked, page_item); + + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_item); + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_item); + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_item); + } + } + + __cluster_view_allpage_reposition(); + + if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) { + int x = 0, y = 0; + cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage_grid); + 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); + + evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(cluster_view_s.allpage_add_page); + + elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE); + elm_object_signal_callback_add(cluster_view_s.allpage_add_page, + SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE, + __cluster_view_allpage_add_clicked, NULL); + + __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y); + elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + } +} + +static void __cluster_view_allpage_reposition(void) +{ + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + int x = 0, y = 0; + __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y); + elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + if (cluster_view_s.page_count > 1) + elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE); + else { + elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE); + } + } +} + +static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h) +{ + int row, col; + int start_y = 0; + if (cluster_view_s.page_count < 2) { + start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2; + } else if (cluster_view_s.page_count < 4) { + start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2; + } else { + start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2; + } + row = page_idx / 2; + col = page_idx % 2; + + *w = CLUSTER_ALL_PAGE_PADDING_SIDE + (col * (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W)); + *h = start_y + (row * (CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H)); +} + +static int __cluster_view_allpage_get_page_index(int x, int y) +{ + double row, col; + int int_row, int_col; + int start_y = 0; + int index = 0; + if (cluster_view_s.page_count < 2) { + start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2; + } else if (cluster_view_s.page_count < 4) { + start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2; + } else { + start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2; + } + col = (double)(x - CLUSTER_ALL_PAGE_PADDING_SIDE) / (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W); + int_col = (int)(col + 0.5); + row = (double)(y - start_y)/(CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H); + int_row = (int)(row + 0.5); + + if (((int_col - ALLPAGE_MOVE_GAP) < col && (int_col + ALLPAGE_MOVE_GAP) > col) && + ((int_row - ALLPAGE_MOVE_GAP) < row && (int_row + ALLPAGE_MOVE_GAP) > row)) { + index = int_row * 2 + int_col; + return index; + } + return INIT_VALUE; +} + +static void __cluster_view_destroy_all_page(void) +{ + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item) { + Evas_Object *image = elm_object_part_content_get(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE); + evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb); + evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb); + evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb); + + evas_object_del(page_item->thumbnail_ly); + page_item->thumbnail_ly = NULL; + } + } + if (cluster_view_s.allpage_add_page) + evas_object_del(cluster_view_s.allpage_add_page); + if (cluster_view_s.allpage) + evas_object_del(cluster_view_s.allpage); + + cluster_view_s.allpage_add_page = NULL; + cluster_view_s.allpage = NULL; +} + +static cluster_page_t *__cluster_view_page_new(void) +{ + if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) { + LOGE("cluster page is max."); + return NULL; + } + + cluster_page_t *page_t = cluster_page_new(cluster_view_s.box); + cluster_view_s.page_list = eina_list_append(cluster_view_s.page_list, page_t); + elm_box_pack_end(cluster_view_s.box, page_t->page_layout); + cluster_view_s.page_count = eina_list_count(cluster_view_s.page_list); + page_t->page_index = cluster_view_s.page_count - 1; + cluster_data_set_page_count(cluster_view_s.page_count); + + page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count); + + return page_t; +} + +static void __cluster_view_page_delete(cluster_page_t *page) +{ + elm_grid_unpack(cluster_view_s.allpage_grid, page->thumbnail_ly); + + cluster_view_s.page_list = eina_list_remove(cluster_view_s.page_list, page); + elm_box_unpack(cluster_view_s.box, page->page_layout); + + Eina_List *find_list = NULL; + widget_data_t *widget = NULL; + EINA_LIST_FOREACH(page->widget_list, find_list, widget) { + cluster_data_delete(widget); + } + cluster_page_delete(page); + + cluster_view_s.page_count--; + + cluster_data_set_page_count(cluster_view_s.page_count); + page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count); +} + +static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + cluster_page_t *page_item = (cluster_page_t *)data; + if (eina_list_count(page_item->widget_list) > 0) { + Evas_Smart_Cb func[3] = { __cluster_view_allpage_delete_page_cb, NULL, NULL }; + void *data[3] = { page_item, NULL, NULL }; + popup_show(POPUP_CLUSTER_DELETE_PAGE, 2, func, data); + } else { + __cluster_view_allpage_delete_page_cb(page_item, NULL, NULL); + } +} + +static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + cluster_page_t *page_t = __cluster_view_page_new(); + if (!page_t) { + LOGE("cluster page is max."); + return ; + } + + elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page); + + page_t->thumbnail_ly = elm_layout_add(page_t->page_layout); + elm_layout_file_set(page_t->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY); + + evas_object_size_hint_align_set(page_t->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(page_t->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(page_t->thumbnail_ly); + + Evas_Object *thumbnail = cluster_page_thumbnail(page_t); + elm_object_part_content_set(page_t->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail); + elm_object_signal_emit(page_t->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE); + elm_object_signal_callback_add(page_t->thumbnail_ly, + SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE, + __cluster_view_allpage_delete_clicked, page_t); + + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_t); + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_t); + evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_t); + + __cluster_view_allpage_reposition(); + + if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) { + int x = 0, y = 0; + __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y); + elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + } else { + evas_object_del(cluster_view_s.allpage_add_page); + cluster_view_s.allpage_add_page = NULL; + } +} + +static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info) +{ + cluster_page_t *page = (cluster_page_t *)data; + + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item->page_index > page->page_index) { + page_item->page_index -= 1; + } + } + + __cluster_view_page_delete(page); + __cluster_view_allpage_reposition(); + + if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) { + if (cluster_view_s.allpage_add_page == NULL) { + cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage); + 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); + + evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(cluster_view_s.allpage_add_page); + + elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE); + elm_object_signal_callback_add(cluster_view_s.allpage_add_page, + SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE, + __cluster_view_allpage_add_clicked, NULL); + } + int x = 0, y = 0; + __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y); + elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + } + popup_hide(); +} + +static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down* ev = event_info; + LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y); + + cluster_mouse_info.pressed = true; + cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x; + cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME, + __cluster_view_thumbnail_long_press_time_cb, data); +} + +static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + cluster_page_t *page_t = (cluster_page_t *)data; + Evas_Event_Mouse_Up* ev = event_info; + LOGD("UP: (%d,%d)", ev->output.x, ev->output.y); + + if (!cluster_mouse_info.pressed) + return ; + + cluster_mouse_info.pressed = false; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.up_x = ev->output.x; + cluster_mouse_info.up_y = ev->output.y; + + if (!cluster_mouse_info.long_pressed) { + int distance = (cluster_mouse_info.down_x - cluster_mouse_info.up_x) * (cluster_mouse_info.down_x - cluster_mouse_info.up_x); + distance += (cluster_mouse_info.down_y - cluster_mouse_info.up_y) * (cluster_mouse_info.down_y - cluster_mouse_info.up_y); + + if (distance <= MOUSE_MOVE_MIN_DISTANCE) { + cluster_view_s.current_page = page_t->page_index; + cluster_view_set_state(VIEW_STATE_NORMAL); + } + + return ; + } + + cluster_mouse_info.long_pressed = false; + + if (cluster_view_s.picked_page) { + __cluster_view_allpage_drop_page(data); + } +} + +static int __cluster_view_page_sort_cb(const void *a , const void *b) +{ + cluster_page_t *item1 = (cluster_page_t *)a; + cluster_page_t *item2 = (cluster_page_t *)b; + + return item1->page_index - item2->page_index; +} + +static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move* ev = event_info; + + if (!cluster_mouse_info.pressed) + return ; + + cluster_mouse_info.move_x = ev->cur.output.x; + cluster_mouse_info.move_y = ev->cur.output.y; + + if (!cluster_mouse_info.long_pressed) { + int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x); + distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y); + + if (distance > MOUSE_MOVE_MIN_DISTANCE) { + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + return ; + } + } + + if (cluster_view_s.picked_page) { + __cluster_view_allpage_drag_page(data); + } +} + +static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data) +{ + if (!cluster_mouse_info.pressed) + return ECORE_CALLBACK_CANCEL; + + cluster_mouse_info.long_pressed = true; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + __cluster_view_allpage_pick_up_page(data); + + return ECORE_CALLBACK_CANCEL; +} + +static void __cluster_view_allpage_drag_page(void *data) +{ + if (cluster_view_s.picked_page) { + int move_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x; + int move_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y; + int new_index = INIT_VALUE; + evas_object_move(cluster_view_s.picked_page->thumbnail_ly, move_x, move_y); + new_index = __cluster_view_allpage_get_page_index(move_x, move_y); + + int move = 0; + int start, end; + if (new_index != cluster_view_s.picked_page->page_index && new_index != INIT_VALUE) { + if (cluster_view_s.picked_page->page_index < new_index) { + move = -1; + start = cluster_view_s.picked_page->page_index; + end = new_index; + } else if (cluster_view_s.picked_page->page_index > new_index) { + move = +1; + end = cluster_view_s.picked_page->page_index; + start = new_index; + } + + Eina_List *find_list = NULL; + cluster_page_t *page_item = NULL; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item == cluster_view_s.picked_page) { + page_item->page_index = new_index; + } else if (page_item->page_index >= start && page_item->page_index <= end) { + page_item->page_index += move; + } + elm_grid_unpack(cluster_view_s.allpage_grid, page_item->thumbnail_ly); + } + + int x, y; + EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { + if (page_item != cluster_view_s.picked_page) { + __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y); + elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H); + } + } + } + } +} + +static void __cluster_view_allpage_pick_up_page(void *data) +{ + cluster_view_s.picked_page = (cluster_page_t *)data; + elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly); + + elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE); + elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_SHOW, SIGNAL_SOURCE); + + int x, y; + __cluster_view_allpage_get_page_pos(cluster_view_s.picked_page->page_index, &x, &y); + cluster_mouse_info.offset_x = cluster_mouse_info.down_x - x; + cluster_mouse_info.offset_y = cluster_mouse_info.down_y - y; +} + +static void __cluster_view_allpage_drop_page(void *data) +{ + if (cluster_view_s.picked_page) { + elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE); + elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_HIDE, SIGNAL_SOURCE); + + int x, y; + __cluster_view_allpage_get_page_pos(cluster_view_s.picked_page->page_index, &x, &y); + 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); + cluster_view_s.picked_page = NULL; + } + cluster_view_s.page_list = eina_list_sort(cluster_view_s.page_list, + eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb); +} + +static void __clsuter_view_edit_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down* ev = event_info; + LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y); + + cluster_mouse_info.pressed = true; + cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x; + cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME, + __cluster_view_edit_long_press_time_cb, data); +} + +static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up* ev = event_info; + LOGD("UP: (%d,%d)", ev->output.x, ev->output.y); + + if (!cluster_mouse_info.pressed) + return ; + + cluster_mouse_info.pressed = false; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.up_x = ev->output.x; + cluster_mouse_info.up_y = ev->output.y; + + if (!cluster_mouse_info.long_pressed) + return ; + + cluster_mouse_info.long_pressed = false; + + elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK); + + if (cluster_view_s.picked_widget) { + __cluster_view_edit_drop_widget(data); + + cluster_view_s.picked_widget = NULL; + } +} + +static void __clsuter_view_edit_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move* ev = event_info; + //LOGD("MOVE: (%d,%d)", ev->cur.output.x, ev->cur.output.y); + + if (!cluster_mouse_info.pressed) + return ; + + cluster_mouse_info.move_x = ev->cur.output.x; + cluster_mouse_info.move_y = ev->cur.output.y; + + if (!cluster_mouse_info.long_pressed) { + int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x); + distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y); + + if (distance > MOUSE_MOVE_MIN_DISTANCE) { + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + return ; + } + } + + if (cluster_view_s.picked_widget) { + __cluster_view_edit_drag_widget(data); + } +} + +static Eina_Bool __cluster_view_edit_long_press_time_cb(void *data) +{ + if (!cluster_mouse_info.pressed) + return ECORE_CALLBACK_CANCEL; + + cluster_mouse_info.long_pressed = true; + + elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); + + __cluster_view_edit_pick_up_widget(data); + + return ECORE_CALLBACK_CANCEL; +} + +static void __cluster_view_edit_pick_up_widget(void *data) +{ + int cx = -1, cy = -1; + int gx = -1, gy = -1; + Evas *e = NULL; + cluster_view_s.picked_widget = (widget_data_t *)data; + + Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout; + elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE); + + e = evas_object_evas_get(widget_layout); + + evas_pointer_canvas_xy_get(e, &cx, &cy); + evas_object_geometry_get(widget_layout, &gx, &gy, NULL, NULL); + + cluster_mouse_info.offset_x = cx - gx; + cluster_mouse_info.offset_y = cy - gy; + + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx); + elm_grid_unpack(page->grid, widget_layout); + + evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x, + cluster_mouse_info.move_y - cluster_mouse_info.offset_y); + + cluster_page_unset(page, cluster_view_s.picked_widget); +} + +static void __cluster_view_edit_drag_widget(void *data) +{ + int page_x, page_y; + int bg_x, bg_y, bg_w, bg_h; + int widget_x, widget_y; + cluster_view_s.picked_widget = (widget_data_t *)data; + + if (!cluster_view_s.picked_widget) + return ; + + Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout; + evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x, + cluster_mouse_info.move_y - cluster_mouse_info.offset_y); + + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page); + evas_object_geometry_get(page->page_layout, &page_x, &page_y, NULL, NULL); + edje_object_part_geometry_get(elm_layout_edje_get(page->page_layout), CLUSTER_BG, &bg_x, &bg_y, &bg_w, &bg_h); + evas_object_geometry_get(widget_layout, &widget_x, &widget_y, NULL, NULL); + + if (cluster_mouse_info.move_x > CLUSTER_EDIT_RIGHT_SCROLL_REGION) { + LOGD("Move to next page"); + if (!cluster_view_s.edit_mode_scroll_timer) + cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL); + + } else if (cluster_mouse_info.move_x < CLUSTER_EDIT_LEFT_SCROLL_REGION) { + LOGD("Move to prev page"); + if (!cluster_view_s.edit_mode_scroll_timer) + cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL); + } else { + widget_x -= (page_x + bg_x); + widget_y -= (page_y + bg_y); + if (cluster_view_s.edit_mode_scroll_timer) { + ecore_timer_del(cluster_view_s.edit_mode_scroll_timer); + cluster_view_s.edit_mode_scroll_timer = NULL; + } + + if (!cluster_view_s.is_srolling) { + cluster_page_drag_widget(page, cluster_view_s.picked_widget->type, widget_x / (bg_w / CLUSTER_COL), widget_y / (bg_h / CLUSTER_ROW)); + } + } +} + +static void __cluster_view_edit_drop_widget(void *data) +{ + Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout; + elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE); + + if (cluster_view_s.edit_mode_scroll_timer) { + ecore_timer_del(cluster_view_s.edit_mode_scroll_timer); + cluster_view_s.edit_mode_scroll_timer = NULL; + } + + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page); + + if (!cluster_page_drop_widget(page, cluster_view_s.picked_widget)) { + cluster_view_add_widget(cluster_view_s.picked_widget, false); + } +} + +static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info) +{ + cluster_view_s.is_srolling = false; + elm_scroller_current_page_get(obj, &cluster_view_s.current_page, NULL); + cluster_view_s.current_page = cluster_view_s.current_page % cluster_view_s.page_count; + LOGD("current page %d", cluster_view_s.current_page); +} + +static Eina_Bool __cluster_view_scroll_timer_cb(void *data) +{ + cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page); + + int next_page_idx = 0; + if (cluster_mouse_info.move_x > CLUSTER_EDIT_RIGHT_SCROLL_REGION) { + next_page_idx = current_page->page_index + 1; + } else if (cluster_mouse_info.move_x < CLUSTER_EDIT_LEFT_SCROLL_REGION) { + next_page_idx = current_page->page_index - 1; + } else { + return ECORE_CALLBACK_CANCEL; + } + cluster_page_drag_cancel(current_page); + __cluster_view_scroll_to_page(next_page_idx, true); + return ECORE_CALLBACK_RENEW; +} + diff --git a/src/layout.c b/src/conf.c old mode 100644 new mode 100755 similarity index 51% rename from src/layout.c rename to src/conf.c index e3c9f6c..f399498 --- a/src/layout.c +++ b/src/conf.c @@ -14,28 +14,38 @@ * limitations under the License. */ -#include - -#include "homescreen-efl.h" -#include "layout.h" #include "conf.h" #include "util.h" +static int window_w = 720; +static int window_h = 1280; +static double resolution_scale_h = 1.0; +static double resolution_scale_w = 1.0; -HAPI void layout_main_caption_set_menu_texts(const char *label_text, - const char *left_text, const char *right_text) +int __conf_get_window_h(void) { - Evas_Object *layout = home_screen_get_layout(); + return window_h; +} - if (!layout) - return; +int __conf_get_window_w(void) +{ + return window_w; +} - if (label_text) - elm_layout_text_set(layout, PART_CAPTION_MENU_CENTER_LABEL_NAME, label_text); +double __conf_get_resolution_scale_h() +{ + return resolution_scale_h; +} - if (left_text) - elm_layout_text_set(layout, PART_CAPTION_MENU_LEFT_LABEL, left_text); +double __conf_get_resolution_scale_w() +{ + return resolution_scale_w; +} - if (right_text) - elm_layout_text_set(layout, PART_CAPTION_MENU_RIGHT_LABEL, right_text); +void conf_set_resolution_scale(int win_width, int win_height) +{ + window_h = win_height; + window_w = win_width; + resolution_scale_w = (double)win_width / 720; + resolution_scale_h = (double)win_height / 1280; } diff --git a/src/data_model.c b/src/data_model.c deleted file mode 100644 index 190149c..0000000 --- a/src/data_model.c +++ /dev/null @@ -1,965 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "homescreen-efl.h" -#include "data_model.h" -#include "db/db.h" -#include "app_icon.h" -#include "app_item.h" -#include "app_grid.h" -#include "folder_panel.h" -#include "all_apps.h" -#include "livebox/livebox_widget.h" -#include "popup.h" - -static struct { - Tree_node_t *data; - Tree_node_t *all_apps; - Tree_node_t *home; -} s_info = { - .data = NULL, - .all_apps = NULL, - .home = NULL, -}; - -typedef struct { - Tree_node_t *data; - char *search; -} search_package_t; - -static bool __data_model_get_empty_page(Tree_node_t *nothing, Tree_node_t *page, void *data); -static void __data_model_load_item(Tree_node_t *parent, Tree_node_t **item, db_item_t* db_item, Eina_List* apps_db); -static void __data_model_free_subtree(Tree_node_t *root_node); -static bool __data_model_append_item(Tree_node_t *parent, Tree_node_t *node, int container_limit); -static void __data_model_convert_db_list_to_tree(Tree_node_t *parent, int id, Eina_List *list); -static bool __data_model_update_tree_cb(Tree_node_t *parent, Tree_node_t *node, void *data); -static bool __data_model_check_cb(Tree_node_t *parent, Tree_node_t *node, void *data); -static bool __data_model_check_count_cb(Tree_node_t *parent, Tree_node_t *node, void *data); -static bool __data_model_set_set_cb(Tree_node_t *parent, Tree_node_t *node, void *data); -static void __data_model_remove_empty(Tree_node_t *node); -static int __data_model_set_lexical_compare_function(const void *data1, const void *data2); -static Eina_Inarray *__data_model_sort_children(const Tree_node_t *const root, - unsigned int size_hint, - Eina_Compare_Cb sort_compare_function); -static void __add_default_widget(widget_info_t *widget); - -static Eina_Bool __data_model_reattach_children(const void *container, void *node, void *fdata); -static bool __data_model_search_package_cb(Tree_node_t *parent, Tree_node_t *node, void *data); - - -HAPI Tree_node_t *data_model_get_data(void) -{ - return s_info.data; -} - -HAPI Tree_node_t *data_model_get_all_apps(void) -{ - return s_info.all_apps; -} - -HAPI Tree_node_t *data_model_get_home(void) -{ - return s_info.home; -} - - -HAPI void data_model_load_app_mgr(void) -{ - Eina_List *livebox_list = NULL; - Eina_List *apps = NULL; - Eina_List *it = NULL; - app_mgr_item_t *app_mgr_item = NULL; - Tree_node_t *page = NULL; - Tree_node_t *item = NULL; - widget_info_t *widget = NULL; - - LOGD("LOADING DATA MODEL FROM APP MGR"); - db_create_tables(); - - if (!tree_node_new(&s_info.data)) { - LOGE("app_mgr_load -> tree_node_new failure1"); - return; - } - - s_info.data->data = app_item_create(APP_ITEM_ROOT, -1, "ROOT", NULL, NULL, "ROOT", NULL, false, 0, 0, 0, 0, NULL); - - if (!tree_node_new(&s_info.all_apps)) { - LOGE("app_mgr_load -> tree_node_new failure2"); - return; - } - s_info.all_apps->data = app_item_create(APP_ITEM_ALL_APPS_ROOT, -1, "ALL APPS", NULL, NULL, "ALL APPS", NULL, false, 0, 0, 0, 0, NULL); - tree_node_append(s_info.data, s_info.all_apps); - - if (!tree_node_new(&s_info.home)) { - LOGE("app_mgr_load -> tree_node_new failure2"); - return; - } - s_info.home->data = app_item_create(APP_ITEM_HOME, -1, "HOME", NULL, NULL, "HOME", NULL, false, 0, 0, 0, 0, NULL); - tree_node_append(s_info.data, s_info.home); - - - apps = app_mgr_get_apps(); - - EINA_LIST_FOREACH(apps, it, app_mgr_item) { - if (!tree_node_new(&item)) { - LOGE("app_mgr_load -> tree_node_new failure2"); - continue; - } - item->data = app_item_create( - APP_ITEM_ICON, - -1, - app_mgr_item->label, - app_mgr_item->icon, - app_mgr_item->exec, - app_mgr_item->appid, - NULL, - app_mgr_item->removable, - 0, - 0, - 0, - 0, - NULL); - - if (!item->data) { - LOGE("app_mgr_load -> app_item-create failure"); - tree_node_free(item, NULL, NULL, NULL); - continue; - } - - if (!__data_model_append_item(s_info.all_apps, item, APPS_PAGE)) - tree_node_free(item, NULL, NULL, NULL); - } - - livebox_list = livebox_widget_get_list(); - if (!livebox_list) { - LOGW(" livebox_list == NULL"); - - page = data_model_add_widget_page(); - if (!page) { - LOGE("page == NULL"); - return; - } - - return; - } - - widget = eina_list_nth(livebox_list, 0); - if (!widget) { - LOGE("widget == NULL"); - return; - } - - __add_default_widget(widget); - - - widget = eina_list_nth(livebox_list, 1); - if (!widget) { - LOGE("widget == NULL"); - return; - } - - __add_default_widget(widget); - - app_mgr_free_apps(apps); - - /*by default model is being sorted:*/ - data_model_sort(__data_model_set_lexical_compare_function); -} - -HAPI Eina_Bool data_model_load_db(void) -{ - Eina_List *apps_db = NULL; - Eina_List *apps_mgr = NULL; - Eina_List *it = NULL; - db_item_t *db_item = NULL; - - LOGD("LOADING DATA MODEL FROM DB"); - - db_get_apps(&apps_db); - - if (apps_db == NULL || eina_list_count(apps_db) == 0) - return EINA_FALSE; - - EINA_LIST_FOREACH(apps_db, it, db_item) { - switch (db_item->type) { - case APP_ITEM_ROOT: - if (!s_info.data) { - __data_model_load_item(NULL, &s_info.data, db_item, apps_db); - } else { - LOGE("DB corrupted s_info.data != NULL"); - } - break; - case APP_ITEM_ALL_APPS_ROOT: - if (!s_info.all_apps) { - __data_model_load_item(s_info.data, &s_info.all_apps, db_item, apps_db); - } else { - LOGE("DB corrupted s_info.all_apps != NULL"); - } - break; - case APP_ITEM_HOME: - if (!s_info.home) { - __data_model_load_item(s_info.data, &s_info.home, db_item, apps_db); - } else { - LOGE("DB corrupted s_info.home != NULL"); - } - break; - default: - LOGW("Unknown type"); - } - } - db_free_apps(apps_db); - - apps_mgr = app_mgr_get_apps(); - tree_in_depth_browse(s_info.all_apps, __data_model_update_tree_cb, apps_mgr); - app_mgr_free_apps(apps_mgr); - - if (!s_info.home) { - LOGE("s_info.home == NULL"); - - if (!tree_node_new(&s_info.home)) { - LOGE("app_mgr_load -> tree_node_new failure2"); - return EINA_FALSE; - } - s_info.home->data = app_item_create(APP_ITEM_HOME, -1, "HOME", NULL, NULL, "HOME", NULL, false, 0, 0, 0, 0, NULL); - tree_node_append(s_info.data, s_info.home); - } - - if (s_info.home->count == 0) { - LOGE("s_info.home == s_info.home->count"); - data_model_add_widget_page(); - } - - home_screen_print_tree(); - - /*by default model is being sorted:*/ - data_model_sort(__data_model_set_lexical_compare_function); - return EINA_TRUE; -} - -HAPI void data_model_free(void) -{ - __data_model_free_subtree(s_info.data); -} - -HAPI Tree_node_t *data_model_create_folder(app_item_t *new_folder_data) -{ - Tree_node_t *folder = NULL, *new_page = NULL; - - if (new_folder_data) { - tree_node_new(&folder); - if (folder) { - folder->data = new_folder_data; - __data_model_append_item(s_info.all_apps, folder, APPS_PAGE); - /*also give it one initial page:*/ - tree_node_new(&new_page); - if (new_page) { - new_page->data = app_item_create(APP_ITEM_PAGE, -1, NULL, NULL, NULL, "PAGE", NULL, false, 0, 0, 0, 0, NULL); - if (new_page->data) { - tree_node_append(folder, new_page); - } else { - tree_node_free(new_page, NULL, NULL, NULL); - } - } - } - } - - return folder; -} - -HAPI void data_model_append_node_to_folder(Tree_node_t *folder, Tree_node_t *node) -{ - if (!node || !folder) - return; - tree_node_detatch(node); - __data_model_append_item(folder, node, FOLDER_APPS_PAGE); -} - -HAPI void data_model_free_empty_pages(Tree_node_t *folder_or_some_other_root) -{ - Tree_node_t *empty_page = NULL; - - if (!folder_or_some_other_root) - folder_or_some_other_root = data_model_get_all_apps(); - - do { - empty_page = NULL; - data_model_iterate_pages(folder_or_some_other_root, __data_model_get_empty_page, NULL, &empty_page); - __data_model_free_subtree(empty_page); - } while (empty_page); -} - -HAPI void data_model_delete_folder(Tree_node_t *node) -{ - Tree_node_t *page = NULL, *it = NULL, *it_tmp_next = NULL; - - /*attach child elements to the last page:*/ - TREE_NODE_FOREACH(node, page) - for (it = page->first; it; it = it_tmp_next) { - it_tmp_next = it->next; - tree_node_detatch(it); - tree_node_append(s_info.all_apps->last, it); - } - - /*out from the tree:*/ - tree_node_detatch(node); - /*folder with empty pages subtree can be deleted:*/ - __data_model_free_subtree(node); -} - -HAPI Tree_node_t *data_model_install_application(app_mgr_item_t *app_mgr_item) -{ - Tree_node_t *item = NULL; - - tree_node_new(&item); - item->data = app_item_create( - APP_ITEM_ICON, - -1, - app_mgr_item->label, - app_mgr_item->icon, - app_mgr_item->exec, - app_mgr_item->appid, - NULL, - app_mgr_item->removable, - 0, - 0, - 0, - 0, - NULL); - - if (!item->data) { - tree_node_free(item, NULL, NULL, NULL); - return NULL; - } - - __data_model_append_item(s_info.all_apps, item, APPS_PAGE); - - return item; -} - -HAPI void data_model_uninstall_application(Tree_node_t *node) -{ - tree_node_detatch(node); - - /*this will free memory since application node is always empty:*/ - __data_model_remove_empty(node); -} - -HAPI void data_model_check_all_apps(Tree_node_t *node, bool checked) -{ - LOGI(""); - tree_in_depth_browse(node, __data_model_check_cb, &checked); -} - -HAPI int data_model_get_app_check_state(void) -{ - LOGI(""); - int count = 0; - tree_in_depth_browse(s_info.all_apps, __data_model_check_count_cb, &count); - return count; -} - -HAPI void data_model_reposition_item(Tree_node_t *node, Tree_node_t *destinations_parent, Tree_node_t *destination, - reposition_side_t side, int page_limit) -{ - if (!node || !destinations_parent) { - LOGE("item_reposition INVALID usage: %d %d %d", node, destinations_parent, destination); - return; - } - - if (node == destination) - return; - - tree_node_detatch(node); - - if (destination) - /*append relatively to sibling:*/ - side == REPOSITION_SIDE_TO_RIGHT ? tree_node_append_relative(node, destination) : tree_node_prepend_relative(node, destination); - else - /*append to page:*/ - side == REPOSITION_SIDE_TO_RIGHT ? tree_node_append(destinations_parent, node) : tree_node_prepend(destinations_parent, node); - - /*now, it may be that we have more items than we can on this page...*/ - while (destinations_parent->count > page_limit) { - tree_node_detatch(node = destinations_parent->last); - - /*next page (create, or prepend):*/ - if (!destinations_parent->next) { /*there seems to be no pages left, create one:*/ - __data_model_append_item(destinations_parent->parent, node, page_limit); - break; - } else {/*there is a next page, so lets prepend*/ - destinations_parent = destinations_parent->next; - tree_node_prepend(destinations_parent, node); - } - } -} - -HAPI void data_model_iterate(Tree_node_t *node, tree_browse_cb_t func_cb, void *data) -{ - if (!node) - tree_in_depth_browse(s_info.all_apps, func_cb, data); - else - tree_in_depth_browse(node, func_cb, data); -} - -HAPI void data_model_iterate_pages(Tree_node_t *node, tree_browse_cb_t page_func, tree_browse_cb_t item_func, void *data) -{ - Tree_node_t *page = NULL, *item = NULL; - - if (!node) - node = s_info.all_apps; - - /*for each page:*/ - for (page = node->first; page; page = page->next) { - if (!page->data || page->data->type != APP_ITEM_PAGE) { - LOGE("Model unstable [or node != root], skipping: %d %d", page->data, page->data ? page->data->type : -1); - continue; - } - if (page_func) - page_func(NULL, page, data); - /*for each item in page:*/ - if (item_func) { - for (item = page->first; item; item = item->next) { - item_func(page, item, data); - LOGI("[%s]", item->data->label); - } - } - } -} - -HAPI void data_model_update_item(Tree_node_t *node) -{ - if (!node) { - LOGE("node == NULL"); - return; - } - - tree_node_update(node); -} - -HAPI void data_model_set_view_mode(homescreen_view_t view) -{ - tree_in_depth_browse(s_info.all_apps, __data_model_set_set_cb, &view); -} - -HAPI void data_model_detach_from_folder(Tree_node_t *folder_node, Tree_node_t *node) -{ - if (!folder_node || !node) { - LOGE("[INVALID_PARAMS]"); - return; - } - - data_model_reposition_item(node, s_info.all_apps->last, NULL, - REPOSITION_SIDE_TO_RIGHT, APPS_PAGE); - data_model_sort(__data_model_set_lexical_compare_function); -} - - -/* -----=========================== widget ===================================*/ - -HAPI Tree_node_t *data_model_add_widget_page() -{ - Tree_node_t *item = NULL; - - if (!tree_node_new(&item)) { - LOGE(" app_mgr_load -> tree_node_new failure2"); - return NULL; - } - - item->data = app_item_create(APP_ITEM_PAGE, -1, "WIDGET_PAGE", NULL, NULL, "WIDGET_PAGE", NULL, false, 0, 0, 0, 0, NULL); - if (!item->data) { - tree_node_free(item, NULL, NULL, NULL); - return NULL; - } - - tree_node_append(s_info.home, item); - - return item; -} - -HAPI Tree_node_t *data_model_add_widget(Tree_node_t *page, const char *widget_id, int col, int row, int col_span, int row_span, const char *content_info) -{ - Tree_node_t *item = NULL; - - if (!tree_node_new(&item)) { - LOGE(" app_mgr_load -> tree_node_new failure2"); - return NULL; - } - - item->data = app_item_create(APP_ITEM_WIDGET, -1, - NULL, - NULL, - NULL, - widget_id, - NULL, - false, - col, - row, - col_span, - row_span, - content_info); - - if (!item->data) { - tree_node_free(item, NULL, NULL, NULL); - return NULL; - } - - tree_node_append(page, item); - - return item; -} - -HAPI void data_model_reposition_widget(Tree_node_t *page_node, Tree_node_t *obj_node) -{ - tree_node_detatch(obj_node); - tree_node_append(page_node, obj_node); -} - -HAPI void data_model_insert_after(Tree_node_t *prev_node, Tree_node_t *item_node) -{ - tree_node_detatch(item_node); - - if (prev_node) { - tree_node_append_relative(item_node, prev_node); - } else { - tree_node_prepend(s_info.home, item_node); - } -} - -HAPI void data_model_del_item(Tree_node_t *node) -{ - tree_node_detatch(node); - __data_model_free_subtree(node); -} - -HAPI void data_model_resize_widget(Tree_node_t *item_node, int col, int row, int col_span, int row_span) -{ - if (!item_node) { - LOGE("item_node == NULL"); - return; - } - - if (!item_node->data) { - LOGE("item_node->data == NULL"); - return; - } - - app_item_geometry_update(item_node->data, col, row, col_span, row_span); - tree_node_update(item_node); -} - -HAPI void data_model_update_content_info(Tree_node_t *item_node, const char *content_info) -{ - if (!item_node) { - LOGE("item_node == NULL"); - return; - } - - if (!item_node->data) { - LOGE("item_node->data == NULL"); - return; - } - - app_item_update_content_info(item_node->data, content_info); - tree_node_update(item_node); -} - -/*===================================== widget ===============================*/ - -HAPI void data_model_sort(Eina_Compare_Cb sort_compare_function) -{ - Eina_Inarray *sorted_children = NULL; - Tree_node_t *page = NULL, *it = NULL; - - if (!sort_compare_function) - sort_compare_function = __data_model_set_lexical_compare_function; - - if (!s_info.all_apps) - return; - - /*First we have to sort top level applications and folders:*/ - sorted_children = __data_model_sort_children(s_info.all_apps, s_info.all_apps->count*APPS_PAGE, sort_compare_function); - eina_inarray_foreach(sorted_children, __data_model_reattach_children, s_info.all_apps); - eina_inarray_free(sorted_children); - - /*Second we have to sort all items in all folders: - find folders:*/ - for (page = s_info.all_apps->first; page; page = page->next) { - for (it = page->first; it; it = it->next) { - if (it->data && it->data->type == APP_ITEM_FOLDER) { - sorted_children = __data_model_sort_children(it, it->count*FOLDER_APPS_PAGE, sort_compare_function); - eina_inarray_foreach(sorted_children, __data_model_reattach_children, it); - eina_inarray_free(sorted_children); - } - } - } -} - -Tree_node_t *data_model_search_package(const char* pkg_str) -{ - search_package_t search; - search.data = NULL; - search.search = (char *)pkg_str; - - tree_in_depth_browse(s_info.all_apps, __data_model_search_package_cb, &search); - - return search.data; -} - -static bool __data_model_search_package_cb(Tree_node_t *parent, Tree_node_t *node, void *data) -{ - search_package_t *search_data = (search_package_t *)data; - - if (node->data->appid && strcmp(search_data->search, node->data->appid) == 0) - search_data->data = node; - - return true; -} - -static bool __data_model_get_empty_page(Tree_node_t *nothing, Tree_node_t *page, void *data) -{ - Tree_node_t **empty_page = (Tree_node_t **)data; - - if (page->count == 0) { - *empty_page = page; - return false; - } - - return true; -} - -static void __data_model_load_item(Tree_node_t *parent, Tree_node_t **item, db_item_t* db_item, Eina_List* apps_db) -{ - if (!tree_node_new(item)) { - LOGE("*item == NULL"); - return; - } - - (*item)->data = app_item_create(db_item->type, - db_item->id, - NULL, - NULL, NULL, - db_item->appid, - NULL, - false, - db_item->x, - db_item->y, - db_item->w, - db_item->h, - db_item->content_info); - - if (parent) { - if (!tree_node_append(parent, *item)) { - LOGE("failed to append home to data"); - __data_model_free_subtree(*item); - return; - } - - __data_model_convert_db_list_to_tree(*item, db_item->first_id, apps_db); - } -} - - -static bool __data_model_append_item(Tree_node_t *parent, Tree_node_t *node, int container_limit) -{ - Tree_node_t *page = NULL; - - if (!parent || !node) - return false; - - page = parent->last; - if (!page || page->count >= container_limit) { - if (!tree_node_new(&page)) - return false; - page->data = app_item_create(APP_ITEM_PAGE, -1, "PAGE", NULL, NULL, "PAGE", NULL, false, 0, 0, 0, 0, NULL); - if (!page->data) { - tree_node_free(page, NULL, NULL, NULL); - return NULL; - } - - if (!tree_node_append(parent, page)) { - data_model_del_item(page); - return false; - } - } - - return tree_node_append(page, node); -} - -static void __data_model_convert_db_list_to_tree(Tree_node_t *parent, int id, Eina_List *list) -{ - Eina_List *it = NULL; - db_item_t *db_item = NULL; - Tree_node_t *node = NULL; - - if (id == -1) - return; - - EINA_LIST_FOREACH(list, it, db_item) { - if (db_item->id == id) - break; - } - - if (!db_item) - return; - - tree_node_new(&node); - node->data = app_item_create(db_item->type, - db_item->id, - "", - "", - "", - db_item->appid, - NULL, - db_item->type == APP_ITEM_FOLDER, - db_item->x, - db_item->y, - db_item->w, - db_item->h, - db_item->content_info); - - if (!node->data) { - tree_node_free(node, NULL, NULL, NULL); - return; - } - - tree_node_append(parent, node); - - __data_model_convert_db_list_to_tree(parent, db_item->next_id, list); - __data_model_convert_db_list_to_tree(node, db_item->first_id, list); -} - -static bool __data_model_update_tree_cb(Tree_node_t *parent, Tree_node_t *node, void *data) -{ - if (node->data->type == APP_ITEM_ICON) { - Eina_List *it; - app_mgr_item_t *app_mgr; - EINA_LIST_FOREACH((Eina_List *)data, it, app_mgr) { - if (!strncmp(app_mgr->appid, node->data->appid, strlen(node->data->appid))) - break; - } - - if (app_mgr) { - node->data->label = strdup(app_mgr->label); - node->data->icon = strdup(app_mgr->icon); - node->data->exec = strdup(app_mgr->exec); - - node->data->removable = app_mgr->removable; - } - } else if (node->data->type == APP_ITEM_FOLDER) { - node->data->label = strdup(node->data->appid); - } - return true; -} - -static bool __data_model_check_cb(Tree_node_t *parent, Tree_node_t *node, void *data) -{ - if (node->data->type == APP_ITEM_ICON) - node->data->is_checked = *(bool *)data; - - return true; -} - -static bool __data_model_check_count_cb(Tree_node_t *parent, Tree_node_t *node, void *data) -{ - if (node && node->data && node->data->is_checked) { - LOGI("%s", node->data->label); - ++*(int *)data; - } - return true; -} - -static bool __data_model_set_set_cb(Tree_node_t *parent, Tree_node_t *node, void *data) -{ - if (node->data->type == APP_ITEM_ICON || node->data->type == APP_ITEM_FOLDER) { - if (node->parent->parent && node->parent->parent->data->type == APP_ITEM_FOLDER) { - app_icon_set_view_mode(node->data->layout, *(homescreen_view_t *)data, true); - } else { - app_icon_set_view_mode(node->data->layout, *(homescreen_view_t *)data, false); - } - } else if (node->data->type == APP_ITEM_PAGE && node->parent->data->type == APP_ITEM_ALL_APPS_ROOT) { - app_grid_set_view_mode(node->data->layout, *(homescreen_view_t *)data); - } - return true; -} - -/* -static void _data_model_full_page_reorder(Tree_node_t *node) -{ - if (node->parent->count > APPS_PAGE) - { - Tree_node_t *parent = node->parent; - Tree_node_t *last = parent->last; - tree_node_detatch(last); - - last->data->grid_item = app_grid_insert_item_relative(parent->next->data->layout, last->data->layout, parent->next->first->data->grid_item); - - //TODO check if next exist - tree_node_prepend(parent->next, last); - _data_model_full_page_reorder(last); - } -} -*/ - -static void __data_model_remove_empty(Tree_node_t *node) -{ - if (!node || !node->data) - return; - - if ((node->data->type == APP_ITEM_PAGE || node->data->type == APP_ITEM_FOLDER) && node->count == 0) { - app_item_free(node->data); - /*since it's empty, we pass NULLs:*/ - tree_node_free(node, NULL, NULL, NULL); - } -} - -static Eina_Bool __data_model_reattach_children(const void *container, void *node, void *fdata) -{ - unsigned int page_size_limit = FOLDER_APPS_PAGE; - bool place_found = false; - Tree_node_t *parent = (Tree_node_t *)fdata, *child = *((Tree_node_t **)node), *page = NULL; - - if (parent->data->type == APP_ITEM_ALL_APPS_ROOT) - page_size_limit = APPS_PAGE; - - /*now find first free page:*/ - for (page = parent->first; page; page = page->next) { - if (page->count < page_size_limit) { - tree_node_append(page, child); - place_found = true; - LOGI("reattach_children %s found place in %s", child->data->label, parent->data->label); - break; - } - } - - /*sanity check:*/ - if (!place_found) { - LOGE("reattach_children %s could not find place", child->data->label); - __data_model_append_item(parent, child, page_size_limit); - } - return EINA_TRUE; -} - -static Eina_Inarray *__data_model_sort_children(const Tree_node_t *const root, unsigned int size_hint, Eina_Compare_Cb sort_compare_function) -{ - Eina_Inarray *array = NULL; - Tree_node_t *page = NULL, *it = NULL, *it_tmp = NULL; - - if (!root || !root->data || - !(root->data->type == APP_ITEM_FOLDER || - root->data->type == APP_ITEM_ALL_APPS_ROOT) - ) - return NULL; - /*now we know this is root or folder for sure, so it contains pages:*/ - - array = eina_inarray_new(sizeof(Tree_node_t *), size_hint); - - if (!array) { - LOGE("sort_children: allocation error"); - return NULL; - } - - /*for each "page":*/ - for (page = root->first; page; page = page->next) { - /*sanity check:*/ - if (!page->data || page->data->type != APP_ITEM_PAGE) { - LOGE("sort_children problem: data: %d type: %d", page->data, page->data ? page->data->type : -1); - return array; - } - - /*for each node in "page":*/ - for (it = page->first; it; it = it_tmp) { - it_tmp = it->next; - tree_node_detatch(it); - - if (eina_inarray_insert_sorted(array, &it, sort_compare_function) < 0) { - LOGE("sort_children: item insertion error"); - return array; - } - } - } - - return array; -} - -static void __data_model_free_subtree(Tree_node_t *root_node) -{ - Tree_node_t *first_child = NULL, *last_child = NULL, *child_tmp = NULL; - int children_count = 0; - - if (!root_node) { - LOGE("root_node == NULL"); - return; - } - - tree_node_free(root_node, &first_child, &last_child, &children_count); - - if ((!first_child || !last_child) && children_count > 0) { - LOGE("Node has %d children but pointers are first: %d, last: %d", children_count, first_child, last_child); - return; - } - - while (children_count-- > 0) { - child_tmp = first_child->next; - __data_model_free_subtree(first_child); - first_child = child_tmp; - } -} - -static int __data_model_set_lexical_compare_function(const void *data1, const void *data2) -{ - char *l_upper = NULL, *r_upper = NULL; - Tree_node_t *l = *((Tree_node_t **)data1), *r = *((Tree_node_t **)data2); - int res = 0; - - if (!l || !l->data || !l->data->label) - return 1; - - if (!r || !r->data || !r->data->label) - return -1; - - l_upper = (char *)alloca(NAME_MAX*sizeof(char)); - r_upper = (char *)alloca(NAME_MAX*sizeof(char)); - - strncpy(l_upper, l->data->label, NAME_MAX - sizeof('\0')); - strncpy(r_upper, r->data->label, NAME_MAX - sizeof('\0')); - - eina_str_toupper(&l_upper); - eina_str_toupper(&r_upper); - - return !(res = strcoll(l_upper, r_upper)) ? 1 : res; -} - -static void __add_default_widget(widget_info_t *widget) -{ - Tree_node_t *item = NULL; - - Tree_node_t *page = data_model_add_widget_page(); - if (!page) { - LOGE("item == NULL"); - return; - } - - item = data_model_add_widget(page, widget->widget_id, 0, 0, widget->width, - widget->height, NULL); - if (!item) { - LOGE("item == NULL"); - return; - } - - LOGD("Widget: %s with size (%d, %d) added", widget->widget_id, - widget->width, widget->height); -} diff --git a/src/db/db.c b/src/db/db.c deleted file mode 100644 index 0503aca..0000000 --- a/src/db/db.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "homescreen-efl.h" -#include "conf.h" -#include "util.h" -#include "db/db.h" - -static struct { - sqlite3 *db; - Ecore_Timer *close_timer; -} db_info = { - .db = NULL, - .close_timer = NULL, -}; - -#define CREATE_TABLE_ITEM "CREATE TABLE IF NOT EXISTS item(\ -id INTEGER PRIMARY KEY NOT NULL,\ -type INTEGER,\ -pkg_id TEXT,\ -first INTEGER,\ -next INTEGER,\ -x INTEGER,\ -y INTEGER,\ -w INTEGER,\ -h INTEGER,\ -content_info TEXT);" - -#define SELECT_ITEM "SELECT * FROM item;" -#define INSERT_ITEM "INSERT OR REPLACE INTO item VALUES(?,?,?,?,?,?,?,?,?,?);" -#define CLEAR_TABLE "DELETE FROM item;" -#define DELETE_ITEM "DELETE FROM item WHERE id = ?;" - -#define DATABASE_CLOSE_TIME 5 - -bool _db_is_success(int return_code); -bool _db_open(void); -void _db_close(void); -bool _db_prepare(const char *query, sqlite3_stmt **stmt); -bool _db_step(sqlite3_stmt *stmt); -bool _db_finalize(sqlite3_stmt *stmt); - -bool db_create_tables(void) -{ - if (!_db_open()) - return false; - - sqlite3_exec(db_info.db, CLEAR_TABLE, NULL, NULL, NULL); - - if (sqlite3_exec(db_info.db, CREATE_TABLE_ITEM, NULL, NULL, NULL)) - return false; - - db_item_t root = {0, APP_ITEM_ROOT, "", -1, -1, 0, 0, 0, 0}; - if (!db_update_apps(root, true)) - return false; - - _db_close(); - - return true; -} - -bool db_get_apps(Eina_List **apps) -{ - const char *content_info = NULL; - sqlite3_stmt *stmt; - if (!_db_open()) - return false; - - if (!_db_prepare(SELECT_ITEM, &stmt)) - return false; - - while (sqlite3_step(stmt) == SQLITE_ROW) { - db_item_t *item = (db_item_t *) malloc(sizeof(db_item_t)); - item->id = sqlite3_column_int(stmt, 0); - item->type = sqlite3_column_int(stmt, 1); - item->appid = strdup((const char *) sqlite3_column_text( - stmt, 2)); - item->first_id = sqlite3_column_int(stmt, 3); - item->next_id = sqlite3_column_int(stmt, 4); - - item->x = sqlite3_column_int(stmt, 5); - item->y = sqlite3_column_int(stmt, 6); - item->w = sqlite3_column_int(stmt, 7); - item->h = sqlite3_column_int(stmt, 8); - - - content_info = (const char *)sqlite3_column_text(stmt, 9); - - if (content_info) { - item->content_info = strdup(content_info); - } else { - item->content_info = NULL; - } - - *apps = eina_list_append(*apps, item); - dlog_print(DLOG_DEBUG, LOG_TAG, "App: %s [%s]", item->appid, item->content_info ); - } - - if (!_db_finalize(stmt)) - return false; - - _db_close(); - - return true; -} - -void db_free_apps(Eina_List *apps) -{ - db_item_t *db_item; - EINA_LIST_FREE(apps, db_item) { - free(db_item->appid); - free(db_item); - } -} - -bool db_update_apps(db_item_t item, bool insert) -{ - sqlite3_stmt *stmt; - - if (!_db_open()) - return false; - - if (insert) { - if (!_db_prepare(INSERT_ITEM, &stmt)) { - LOGD("_db_prepare() failed"); - return false; - } - - sqlite3_bind_int(stmt, 1, item.id); - sqlite3_bind_int(stmt, 2, item.type); - sqlite3_bind_text(stmt, 3, item.appid, -1, SQLITE_STATIC); - sqlite3_bind_int(stmt, 4, item.first_id); - sqlite3_bind_int(stmt, 5, item.next_id); - sqlite3_bind_int(stmt, 6, item.x); - sqlite3_bind_int(stmt, 7, item.y); - sqlite3_bind_int(stmt, 8, item.w); - sqlite3_bind_int(stmt, 9, item.h); - sqlite3_bind_text(stmt, 10, item.content_info, -1, SQLITE_STATIC); - } else { - if (!_db_prepare(DELETE_ITEM, &stmt)) { - LOGD("_db_prepare() failed"); - return false; - } - - sqlite3_bind_int(stmt, 1, item.id); - } - - - if (!_db_step(stmt)) - return false; - - if (!_db_finalize(stmt)) - return false; - - _db_close(); - - return true; -} - -bool _db_is_success(int return_code) -{ - switch (return_code) { - case SQLITE_OK: - LOGD("RETURN CODE: SQLITE_OK"); - break; - case SQLITE_ERROR: - LOGD("RETURN CODE: SQLITE_ERROR"); - break; - case SQLITE_INTERNAL: - LOGD("RETURN CODE: SQLITE_INTERNAL"); - break; - case SQLITE_PERM: - LOGD("RETURN CODE: SQLITE_PERM"); - break; - case SQLITE_ABORT: - LOGD("RETURN CODE: SQLITE_ABORT"); - break; - case SQLITE_BUSY: - LOGD("RETURN CODE: SQLITE_BUSY"); - break; - case SQLITE_LOCKED: - LOGD("RETURN CODE: SQLITE_LOCKED"); - break; - case SQLITE_NOMEM: - LOGD("RETURN CODE: SQLITE_NOMEM"); - break; - case SQLITE_READONLY: - LOGD("RETURN CODE: SQLITE_READONLY"); - break; - case SQLITE_INTERRUPT: - LOGD("RETURN CODE: SQLITE_INTERRUPT"); - break; - case SQLITE_IOERR: - LOGD("RETURN CODE: SQLITE_IOERR"); - break; - case SQLITE_CORRUPT: - LOGD("RETURN CODE: SQLITE_CORRUPT"); - break; - case SQLITE_NOTFOUND: - LOGD("RETURN CODE: SQLITE_NOTFOUND"); - break; - case SQLITE_FULL: - LOGD("RETURN CODE: SQLITE_FULL"); - break; - case SQLITE_CANTOPEN: - LOGD("RETURN CODE: SQLITE_CANTOPEN"); - break; - case SQLITE_PROTOCOL: - LOGD("RETURN CODE: SQLITE_PROTOCOL"); - break; - case SQLITE_EMPTY: - LOGD("RETURN CODE: SQLITE_EMPTY"); - break; - case SQLITE_SCHEMA: - LOGD("RETURN CODE: SQLITE_SCHEMA"); - break; - case SQLITE_TOOBIG: - LOGD("RETURN CODE: SQLITE_TOOBIG"); - break; - case SQLITE_CONSTRAINT: - LOGD("RETURN CODE: SQLITE_CONSTRAINT"); - break; - case SQLITE_MISMATCH: - LOGD("RETURN CODE: SQLITE_MISMATCH"); - break; - case SQLITE_MISUSE: - LOGD("RETURN CODE: SQLITE_MISUSE"); - break; - case SQLITE_NOLFS: - LOGD("RETURN CODE: SQLITE_NOLFS"); - break; - case SQLITE_AUTH: - LOGD("RETURN CODE: SQLITE_AUTH"); - break; - case SQLITE_FORMAT: - LOGD("RETURN CODE: SQLITE_FORMAT"); - break; - case SQLITE_RANGE: - LOGD("RETURN CODE: SQLITE_RANGE"); - break; - case SQLITE_NOTADB: - LOGD("RETURN CODE: SQLITE_NOTADB"); - break; - case SQLITE_ROW: - LOGD("RETURN CODE: SQLITE_ROW"); - break; - case SQLITE_DONE: - LOGD("RETURN CODE: SQLITE_DONE"); - break; - default: - break; - } - - return return_code == SQLITE_OK || return_code == SQLITE_DONE; -} - -bool _db_open(void) -{ - if (db_info.db) - return true; - - if (!_db_is_success(sqlite3_open(util_get_data_file_path(DATABASE_FILE), &db_info.db))) - return false; - - if (sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, - NULL, NULL)) - return false; - - return true; -} - -Eina_Bool _db_close_cb(void *data) -{ - LOGD("DB CLOSE"); - - if (db_info.db) { - if (sqlite3_exec(db_info.db, "COMMIT TRANSACTION", - NULL, NULL, NULL)) - return ECORE_CALLBACK_DONE; - - if (_db_is_success(sqlite3_close(db_info.db))) - db_info.db = NULL; - } - db_info.close_timer = NULL; - return ECORE_CALLBACK_DONE; -} - -void _db_close(void) -{ - if (!db_info.db) - return; - - if (db_info.close_timer) { - ecore_timer_reset(db_info.close_timer); - } else { - db_info.close_timer = ecore_timer_add(DATABASE_CLOSE_TIME, - _db_close_cb, NULL); - } -} - -bool _db_prepare(const char *query, sqlite3_stmt **stmt) -{ - return _db_is_success(sqlite3_prepare_v2(db_info.db, query, - strlen(query), stmt, NULL)); -} - -bool _db_step(sqlite3_stmt *stmt) -{ - return _db_is_success(sqlite3_step(stmt)); -} - -bool _db_finalize(sqlite3_stmt *stmt) -{ - return _db_is_success(sqlite3_finalize(stmt)); -} diff --git a/src/dynamic_index.c b/src/dynamic_index.c deleted file mode 100644 index c364040..0000000 --- a/src/dynamic_index.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "dynamic_index.h" - -#include -#include - -#include "homescreen-efl.h" -#include "util.h" -#include "livebox/livebox_panel.h" -#include "layout.h" - -static Evas_Object *__dynamic_index_create_indice(Evas_Object *box); -static Eina_Bool __dynamic_index_fill_box(dynamic_index_t *dynamic_index); - -static void __dynamic_index_page_count_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __dynamic_index_page_area_changed_cb(void *data, Evas_Object *obj, void *event_info); - -static void __dynamic_index_current_page_changed_start_cb(void *data, Evas_Object *obj, void *event_info); -static void __dynamic_index_current_page_changed_stop_cb(void *data, Evas_Object *obj, void *event_info); -static void __dynamic_index_set_properties(Evas_Object *index, double percent); -static Evas_Object *__dynamic_index_box_create(void); -static void __dynamic_index_rotate(Evas_Object *element, double angle, double alpha); - -HAPI dynamic_index_t *dynamic_index_new(Evas_Object *page_scroller) -{ - dynamic_index_t *dynamic_index = NULL; - Evas_Object *box = NULL; - - if (!page_scroller) { - LOGD("Invalid parameter : page_scroller is NULL"); - return NULL; - } - - dynamic_index = (dynamic_index_t *) malloc (sizeof(dynamic_index_t)); - if (!dynamic_index) - return NULL; - - box = __dynamic_index_box_create(); - - dynamic_index->scroller = page_scroller; - dynamic_index->box = box; - dynamic_index->page_count = page_scroller_get_page_count(page_scroller); - dynamic_index->page_current = page_scroller_get_current_page(page_scroller); - - elm_scroller_page_size_get(page_scroller, &dynamic_index->page_width, NULL); - elm_scroller_region_get(page_scroller, &dynamic_index->x_current, NULL, NULL, NULL); - - if (!__dynamic_index_fill_box(dynamic_index)) { - LOGD("Box fill failed"); - evas_object_del(box); - free(dynamic_index); - return NULL; - } - - elm_object_signal_callback_add(page_scroller, "scroller,count,changed", "*", __dynamic_index_page_count_changed_cb, dynamic_index); - evas_object_smart_callback_add(page_scroller, "scroll", __dynamic_index_page_area_changed_cb, dynamic_index); - evas_object_smart_callback_add(page_scroller, "scroll,drag,start", __dynamic_index_current_page_changed_start_cb, dynamic_index); - evas_object_smart_callback_add(page_scroller, "scroll,anim,stop", __dynamic_index_current_page_changed_stop_cb, dynamic_index); - evas_object_data_set(page_scroller, KEY_INDEX, dynamic_index); - - return dynamic_index; -} - -HAPI void dynamic_index_clear(dynamic_index_t *dynamic_index) -{ - int i = 0; - - if (!dynamic_index) { - LOGE("Invalid parameter"); - return; - } - - for (i = 0; i < dynamic_index->page_count; i++) { - if (dynamic_index->indices[i]) { - evas_object_del(dynamic_index->indices[i]); - dynamic_index->indices[i] = NULL; - } - } - - elm_box_clear(dynamic_index->box); -} - -HAPI void dynamic_index_del(dynamic_index_t *dynamic_index) -{ - if (!dynamic_index) { - LOGE("[INVALID_PARAM][dynamic_index='%p']", dynamic_index); - return; - } - - elm_object_signal_callback_del(dynamic_index->scroller, "scroller,count,changed", "*", __dynamic_index_page_count_changed_cb); - - evas_object_smart_callback_del(dynamic_index->scroller, "scroll", __dynamic_index_page_area_changed_cb); - evas_object_smart_callback_del(dynamic_index->scroller, "scroll,drag,start", __dynamic_index_current_page_changed_start_cb); - evas_object_smart_callback_del(dynamic_index->scroller, "scroll,anim,stop", __dynamic_index_current_page_changed_stop_cb); - - dynamic_index_clear(dynamic_index); - free(dynamic_index); -} - -HAPI void dynamic_index_reload(dynamic_index_t *dynamic_index, int idx, int page_count) -{ - if (!dynamic_index) { - LOGE("[INVALID_PARAMS]"); - return; - } - - dynamic_index_clear(dynamic_index); - dynamic_index->page_current = idx; - dynamic_index->page_count = page_count; - - __dynamic_index_fill_box(dynamic_index); -} - -static Evas_Object *__dynamic_index_create_indice(Evas_Object *box) -{ - Evas_Object *layout = NULL; - Evas_Object *size_setter_rect = NULL; - - int idx_width = (INDEX_ELEMENT_CONTAINER_WIDTH / ROOT_WIN_W) * home_screen_get_root_width(); - int idx_height = (INDEX_ELEMENT_CONTAINER_HEIGHT / ROOT_WIN_H) * home_screen_get_root_height(); - - if (!box) { - LOGD("Invalid argument : box is NULL"); - return NULL; - } - - layout = elm_layout_add(box); - if (!layout) { - LOGD("Layout creation failed"); - return NULL; - } - - if (!elm_layout_file_set(layout, util_get_res_file_path(INDEX_EDJE), GROUP_INDEX_ELEMENT)) { - evas_object_del(layout); - return NULL; - } - - size_setter_rect = evas_object_rectangle_add(evas_object_evas_get(home_screen_get_win())); - if (!size_setter_rect) { - LOGE("Failed to create size setter rectangle"); - return NULL; - } - - elm_object_part_content_set(layout, INDICE_SIZE_SETTER, size_setter_rect); - - evas_object_color_set(size_setter_rect, 0, 0, 0, 0); - evas_object_size_hint_min_set(size_setter_rect, idx_width, idx_height); - evas_object_size_hint_max_set(size_setter_rect, idx_width, idx_height); - evas_object_resize(size_setter_rect, idx_width, idx_height); - - evas_object_show(layout); - elm_box_pack_end(box, layout); - return layout; -} - -static void __dynamic_index_set_properties(Evas_Object *index, double percent) -{ - double size = (percent*INDEX_CURRENT_SIZE+(1.0-percent)*INDEX_NORMAL_SIZE)*home_screen_get_root_width(); - evas_object_size_hint_min_set(index, size, size); - evas_object_size_hint_max_set(index, size, size); - evas_object_color_set(index, 255, 255, 255, percent*INDEX_CURRENT_ALPHA+(1.0-percent)*INDEX_NORMAL_ALPHA); -} - -static Eina_Bool __dynamic_index_fill_box(dynamic_index_t *dynamic_index) -{ - int i = 0, c_page = -1; - - Evas_Object *layout = NULL; - - if (!dynamic_index) - return EINA_FALSE; - - if (!dynamic_index->box || dynamic_index->page_count < 1) { - LOGD("Invalid parameters : box is NULL or elements_count is < 1"); - return EINA_FALSE; - } - - c_page = dynamic_index->page_current; - if(c_page < 0 || c_page > dynamic_index->page_count) - { - LOGE("Failed to get current_page "); - return EINA_FALSE; - } - - for (i = 0 ; i < dynamic_index->page_count; i++) { - layout = __dynamic_index_create_indice(dynamic_index->box); - if (!layout) { - LOGE("Failed to append index element into the box"); - dynamic_index_clear(dynamic_index); - return EINA_FALSE; - } - - dynamic_index->indices[i] = layout; - } - - elm_layout_signal_emit(dynamic_index->indices[c_page], SIGNAL_SET_CURRENT, SIGNAL_SOURCE); - __dynamic_index_set_properties(dynamic_index->indices[dynamic_index->page_current], 1.0); - return EINA_TRUE; -} - -static void __dynamic_index_page_count_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - LOGD("The page count has changed"); - dynamic_index_t *dynamic_index = (dynamic_index_t *)data; - dynamic_index_clear(dynamic_index); - dynamic_index->page_count = page_scroller_get_page_count(dynamic_index->scroller); - - LOGD("page count : %d ", dynamic_index->page_count); - - if (!dynamic_index->page_count) - return; - - dynamic_index->page_current = page_scroller_get_current_page(dynamic_index->scroller); - - if (!__dynamic_index_fill_box(dynamic_index)) { - elm_object_signal_callback_del(dynamic_index->scroller, "scroller,count,changed", "*", __dynamic_index_page_count_changed_cb); - evas_object_smart_callback_del(dynamic_index->scroller, "scroll", __dynamic_index_page_area_changed_cb); - evas_object_smart_callback_del(dynamic_index->scroller, "scroll,drag,start", __dynamic_index_current_page_changed_start_cb); - evas_object_smart_callback_del(dynamic_index->scroller, "scroll,anim,stop", __dynamic_index_current_page_changed_stop_cb); - } -} - -HAPI double _dist(int current, int page_x, int page_width) -{ - return 1.0-((double)fabs((float)page_x-current))/page_width; -} - -static void __dynamic_index_page_area_changed_cb(void *data, Evas_Object *obj, void *event_info) -{ - int x = 0; - double angle = 0.0; - double color = 0.0; - int next_page = -1; - - dynamic_index_t *dynamic_index = (dynamic_index_t*) data; - if(!dynamic_index) - { - LOGE("Invalid dynamic_index"); - return; - } - elm_scroller_region_get(obj, &x, NULL, NULL, NULL); - - angle = (double)(x - dynamic_index->x_current)/dynamic_index->page_width * 90.0; - - if(fabs((float)(x - dynamic_index->x_current)) <= dynamic_index->page_width) - { - next_page = x > dynamic_index->x_current ? (dynamic_index->page_current+1) % dynamic_index->page_count : dynamic_index->page_current-1; - color = fabs(angle) * 2; - } - else - { - if(x > dynamic_index->x_current) - { - next_page = dynamic_index->page_count-1; - color = (double)(dynamic_index->page_width*dynamic_index->page_count - x)/dynamic_index->page_width * 180.0; - } - else - { - next_page = 0; - color = 180.0; - } - } - - if (next_page == dynamic_index->page_count - 1 && dynamic_index->page_current == 0 && dynamic_index->page_count % 2 == 1) - angle = angle - 270.0; - - __dynamic_index_rotate(dynamic_index->indices[dynamic_index->page_current], 90.0 + angle, 255.0 - color); - __dynamic_index_rotate(dynamic_index->indices[next_page], angle, 75.0 + color); -} - -static Evas_Object *__dynamic_index_box_create(void) -{ - Evas_Object *box = NULL; - - box = elm_box_add(home_screen_get_win()); - if (!box) { - LOGD("Box creation failed"); - return NULL; - } - - elm_box_homogeneous_set(box, EINA_TRUE); - elm_box_horizontal_set(box, EINA_TRUE); - - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_box_align_set(box, 0.5, 0.5); - evas_object_show(box); - - return box; -} - -static void __dynamic_index_current_page_changed_start_cb(void *data, Evas_Object *obj, void *event_info) -{ - dynamic_index_t *dynamic_index = (dynamic_index_t*) data; - if(!dynamic_index) - { - LOGE("Invalid data"); - return; - } - - elm_scroller_current_page_get(obj, &dynamic_index->page_current, NULL); - elm_scroller_region_get(obj, &dynamic_index->x_current, NULL, NULL, NULL); -} - -static void __dynamic_index_current_page_changed_stop_cb(void *data, Evas_Object *obj, void *event_info) -{ - dynamic_index_t *dynamic_index = (dynamic_index_t*)data; - int i; - - if(!dynamic_index) - { - LOGE("Invalid data"); - return; - } - - elm_scroller_current_page_get(obj, &dynamic_index->page_current, NULL); - for(i = 0; ipage_current; i++) - { - elm_object_signal_emit(dynamic_index->indices[i], SIGNAL_SET_DEFAULT, SIGNAL_SOURCE); - } - elm_object_signal_emit(dynamic_index->indices[dynamic_index->page_current], SIGNAL_SET_CURRENT, SIGNAL_SOURCE); - for(i = dynamic_index->page_current+1; ipage_count; i++) - { - elm_object_signal_emit(dynamic_index->indices[i], SIGNAL_SET_DEFAULT, SIGNAL_SOURCE); - } -} - -static void __dynamic_index_rotate(Evas_Object *element, double angle, double alpha) -{ - Evas_Object *edje = NULL; - - if(!element) - { - LOGE("Invalid argument : element is NULL"); - return; - } - - edje = elm_layout_edje_get(element); - if(!edje) - { - LOGE("Failed to get edje from layout"); - return; - } - - Edje_Message_Float_Set *msg = malloc(sizeof(*msg) + sizeof(double)); - msg->count = 2; - msg->val[0] = angle; - msg->val[1] = alpha; - - edje_object_message_send(edje, EDJE_MESSAGE_FLOAT_SET, 1, msg); - edje_object_signal_emit(edje, "rot_changed", "ly"); - - free(msg); -} - diff --git a/src/folder_panel.c b/src/folder_panel.c deleted file mode 100644 index 40bd9af..0000000 --- a/src/folder_panel.c +++ /dev/null @@ -1,942 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "folder_panel.h" -#include "homescreen-efl.h" -#include "util.h" -#include "page_scroller.h" -#include "app_icon.h" -#include "app_grid.h" -#include "layout.h" -#include "option_menu.h" -#include "tree.h" -#include "data_model.h" -#include "all_apps.h" - -static struct -{ - Evas_Object *opened_folder_window; - Evas_Object *opened_folder_popup; - Elm_Theme *folder_entry_theme; - app_item_t *folder_item; - app_item_t *folder_item_add; - Tree_node_t *destination_folder; - bool click_ignore; - bool is_opened; - bool entry_activated; - bool opened_folder_name_is_empty; - bool opened_folder_entrychange_cb_ignore; -} s_info = { - .opened_folder_window = NULL, - .opened_folder_popup = NULL, - .folder_entry_theme = NULL, - .folder_item = NULL, - .folder_item_add = NULL, - .destination_folder = NULL, - .click_ignore = false, - .is_opened = false, - .entry_activated = false, - .opened_folder_name_is_empty = true, - .opened_folder_entrychange_cb_ignore = true -}; - -typedef struct { - bool all_checked; - bool any_checked; -} check_info_s; - -static void __folder_panel_create_folder_window_layout_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __folder_window_destroy_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static bool __folder_panel_detach_grid_items(Tree_node_t *parent, Tree_node_t *item, void *data); -static void __folder_panel_name_set_cb(void *data, Evas_Object *obj, void *event_info); -static bool __folder_panel_get_items_count(Tree_node_t *parent, Tree_node_t *item, void *count); -/*frees folder UI data related to opened window:*/ -static void __folder_panel_free_popup_data(folder_data_t *folder_data); - -static Evas_Object* __folder_panel_create_icon(Tree_node_t *new_folder); -static Evas_Object *__folder_panel_create_scroller(Evas_Object *folder_window_layout); -static bool __folder_panel_create_layout(Evas_Object *parent, app_item_t *folder, bool keypad_show); -static bool __folder_panel_fill(Evas_Object *folder_window_layout, Evas_Object *folder_page_scroller,app_item_t *folder); -static bool __folder_panel_set_current_view_state(Tree_node_t *parent, Tree_node_t *item, void *data); -static bool __folder_panel_show_checkbox(Tree_node_t *parent, Tree_node_t *leaf, void *data); -static bool __folder_panel_get_checked_icons(Tree_node_t *parent, Tree_node_t *leaf, void *data); -static Evas_Object *__folder_panel_create_add_icon(app_item_t *folder); -static Evas_Object *__folder_panel_create_popup(Evas_Object *parent, app_item_t *item); - -static Evas_Object *__folder_panel_create_entry(Evas_Object *parent, const char *default_text); -static void __folder_panel_entry_activated_cb(void *data, Evas_Object *obj, void *ei); -static void __folder_panel_entry_deactivated_cb(void *data, Evas_Object *obj, void *ei); -static void __folder_panel_entry_changed_cb(void *data, Evas_Object *obj, void *ei); -static void __folder_panel_entry_clicked_cb(void *data, Evas_Object *obj, void *ei); -static void __folder_panel_entry_done_cb(void *data, Evas_Object *obj, void *ei); -static void __folder_panel_entry_clear_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); - -static void __folder_panel_item_add_to_folder_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __folder_panel_print_labels(Tree_node_t *folder_tree); -static void __folder_panel_close_cb(void *data, Evas_Object *obj, const char *emission, const char *source); - -/*========================================== PUBLIC FUNCTIONS IMPLEMENTATION =============================================*/ -HAPI void folder_panel_init_module(void) -{ - if (!s_info.folder_entry_theme) { - s_info.folder_entry_theme = elm_theme_new(); - if (!s_info.folder_entry_theme) { - LOGE("Failed to create theme"); - return; - } - - elm_theme_ref_set(s_info.folder_entry_theme, NULL); - elm_theme_extension_add(s_info.folder_entry_theme, util_get_res_file_path(EDJE_DIR"/folder_entry.edj")); - } -} - -HAPI void folder_panel_deinit_module(void) -{ - elm_theme_free(s_info.folder_entry_theme); - s_info.folder_entry_theme = NULL; -} - -HAPI app_item_t *folder_panel_create(Tree_node_t *data) -{ - LOGI(""); - Evas_Object *folder_icon_layout = NULL; - folder_data_t *f_data = NULL; - - f_data = (folder_data_t *) calloc(1, sizeof(folder_data_t)); - if (!f_data) { - LOGE("Failed to create either data: %d", f_data); - return NULL; - } - - folder_icon_layout = __folder_panel_create_icon(data); - if (!folder_icon_layout) { - LOGE("Failed to create folder"); - free(f_data); - f_data = NULL; - } - - data->data->layout = folder_icon_layout; - data->data->data = f_data; - - __folder_panel_print_labels(data); - - return data->data; -} - -HAPI void folder_panel_set_click_ignore_state(bool ignore) -{ - s_info.click_ignore = ignore; -} - -HAPI void folder_panel_enable_entry(bool state) -{ - if (s_info.opened_folder_popup) { - if (state) { - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_ENTRY_BLOCK_OFF, SIGNAL_SOURCE); - } else { - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_ENTRY_BLOCK_ON, SIGNAL_SOURCE); - } - } -} - -HAPI Elm_Object_Item * folder_panel_attach_to_grid(Evas_Object *icon, folder_data_t *folder_data) -{ - Evas_Object *grid_layout = NULL; - Evas_Object *grid = NULL; - - if (!icon || !folder_data) { - LOGE("icon: %d folder_data: %d", icon, folder_data); - return NULL; - } - - if (!folder_data->folder_scroller) - return NULL; - - grid_layout = page_scroller_get_page(folder_data->folder_scroller, 0); - grid = elm_object_part_content_get(grid_layout, PART_APP_GRID_CONTENT); - - /*the last item is "+:"*/ - return app_grid_insert_item_relative(grid_layout, icon, elm_gengrid_last_item_get(grid)); -} - -HAPI bool folder_panel_open_folder(app_item_t *folder, bool keypad_show) -{ - LOGI(""); - s_info.is_opened = true; - s_info.opened_folder_entrychange_cb_ignore = true; - - return __folder_panel_create_layout(home_screen_get_win(), folder, keypad_show); -} - -HAPI void folder_panel_close_folder(void) -{ - s_info.is_opened = false; - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_PANEL_CLOSE, SIGNAL_SOURCE); - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_UNNAMED_TEXT_HIDE, SIGNAL_SOURCE); - elm_object_signal_callback_add(s_info.opened_folder_popup, SIGNAL_FOLDER_ANIM_DONE, SIGNAL_SOURCE, - __folder_panel_close_cb, NULL); - -} - -HAPI void folder_panel_cancel_add_icon(void) -{ - if (s_info.folder_item_add) - app_icon_set_color(s_info.folder_item_add->layout, 255, 255, 255, 255); - s_info.folder_item_add = NULL; - s_info.destination_folder = NULL; -} - -HAPI bool folder_panel_is_folder_visible(void) -{ - return s_info.is_opened; -} - -HAPI folder_checked_t folder_panel_set_content_checked(Tree_node_t *node) -{ - LOGD(""); - check_info_s check_info = { - .all_checked = true, - .any_checked = false - }; - - tree_in_depth_browse(node, __folder_panel_get_checked_icons, &check_info); - - if (check_info.all_checked) { - LOGD("All items checked"); - return FOLDER_PANEL_CHECKED_ALL; - } - else if (check_info.any_checked) { - LOGD("Any item checked"); - return FOLDER_PANEL_CHECKED_ANY; - } - else { - LOGD("None items checked"); - return FOLDER_PANEL_CHECKED_NONE; - } -} - -HAPI Tree_node_t *folder_panel_get_opened_folder_node(void) -{ - return s_info.destination_folder; -} - -HAPI const app_item_t *folder_panel_get_opened_folder_item(void) -{ - return s_info.folder_item; -} - -HAPI int folder_panel_get_items_count(Tree_node_t *folder) -{ - int i = 0; - data_model_iterate_pages(folder, NULL, __folder_panel_get_items_count, &i); - - return i; -} - -HAPI void folder_panel_remove_empty_folder(Tree_node_t *folder) -{ - if (!folder) { - LOGE("[INVALID_PARAM][folder=NULL]"); - return; - } - - app_icon_remove(folder->data->layout); - folder->data->layout = NULL; -} - -HAPI void folder_panel_get_folder_geometry(int *x, int *y, int *w, int *h) -{ - if (!s_info.opened_folder_popup) { - if (x) - *x = -1; - - if (y) - *y = -1; - - if (w) - *w = -1; - - if (h) - *h = -1; - } - - evas_object_geometry_get(s_info.opened_folder_popup, x, y, w, h); -} - -HAPI void folder_panel_hide_input_panel(void) -{ - Evas_Object *entry = NULL; - - if (!s_info.opened_folder_popup) - return; - - entry = elm_object_part_content_get(s_info.opened_folder_popup, PART_FOLDER_NAME); - if (!entry) { - LOGE("[FAILED][entry=NULL]"); - return; - } - - elm_entry_input_panel_hide(entry); -} -/*====================================== PRIVATE FUNCTIONS IMPLEMENTATION =================================================*/ -static bool __folder_panel_get_items_count(Tree_node_t *parent, Tree_node_t *item, void *count) -{ - (*(int *)count)++; - - return true; -} - -static void __folder_panel_create_folder_window_layout_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - bool keypad_show = false; - - if (s_info.click_ignore && s_info.destination_folder) { /*don't open a folder when adding items to it*/ - LOGI("Click ignore"); - return; - } - - s_info.folder_item = (app_item_t*) data; - if (!s_info.folder_item) { - LOGE("Failed to get folder item"); - return; - } - - if (!emission && !source) - keypad_show = true; - - if (!folder_panel_open_folder(s_info.folder_item, keypad_show)) { - LOGE("Failed to open folder"); - return; - } - - app_icon_highlight_folder_icon(s_info.folder_item->layout, FOLDER_ICON_FRAME_POSSIBLE); -} - -static void __folder_window_destroy_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - folder_panel_close_folder(); -} - -static void __folder_panel_name_set_cb(void *data, Evas_Object *obj, void *event_info) -{ - LOGI(""); - app_item_t *folder = NULL; - Tree_node_t *node = NULL; - const char *entry_text; - char prev_label[NAME_MAX]; - - folder = (app_item_t*) data; - if (!data) { - LOGE("invalid cb parameter : data is NULL"); - return; - } - - strncpy(prev_label, folder->label, NAME_MAX - sizeof('\0')); - - if (elm_entry_is_empty(obj) || s_info.opened_folder_name_is_empty) { - free((void *)folder->label); - folder->label = strdup(""); - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_UNNAMED_TEXT_SHOW, - SIGNAL_SOURCE); - } else { - entry_text = elm_object_text_get(obj); - if (!entry_text) { - LOGE("Failed to get the text from the entry"); - return; - } - - free((void *)folder->label); - folder->label = strdup(entry_text); - if (!folder->label) { - LOGE("Failed to copy the text"); - return; - } - - folder->appid = strdup(entry_text); - if (!folder->appid) { - LOGE("Failed to copy the text"); - return; - } - } - - if (folder->label && - strncasecmp(prev_label, folder->label, NAME_MAX) != 0) { - app_icon_set_label(folder->layout, folder->label); - - node = (Tree_node_t*)evas_object_data_get(folder->layout, KEY_ICON_DATA); - if (!node) { - LOGE("node == NULL"); - return; - } - data_model_update_item(node); - home_screen_mvc_update_view(); - } - - home_screen_print_tree(); -} - -static Evas_Object* __folder_panel_create_icon(Tree_node_t *new_folder) -{ - Evas_Object *folder_icon_layout = app_icon_create(new_folder, APP_ICON_TYPE_FOLDER); - if (!folder_icon_layout) { - LOGE("Failed to create folder"); - return NULL; - } - - elm_object_signal_callback_add(folder_icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, __folder_panel_create_folder_window_layout_cb, new_folder->data); - - return folder_icon_layout; -} - -static bool __folder_panel_create_layout(Evas_Object *parent, app_item_t *folder, bool keypad_show) -{ - Evas_Object *entry = NULL; - Evas_Object *add_icon = NULL; - - folder_data_t *f_data = NULL; - Tree_node_t *f_node = NULL; - - int count = -1; - - if (!parent || !folder) { - LOGE("Invalid parameter"); - return false; - } - - f_data = (folder_data_t *) folder->data; - if (!f_data) { - LOGE("Failed to get folder data"); - return false; - } - - s_info.opened_folder_window = elm_layout_add(parent); - if (!s_info.opened_folder_window) { - LOGE("Failed to create folder icon layout"); - return false; - } - - if (!elm_layout_file_set(s_info.opened_folder_window, util_get_res_file_path(EDJE_DIR"/folder.edj"), GROUP_FOLDER_WINDOW)) { - LOGE("Failed to load edje file for layout"); - evas_object_del(s_info.opened_folder_window); - s_info.opened_folder_window = NULL; - return false; - } - - s_info.opened_folder_popup = __folder_panel_create_popup(parent, folder); - if (!s_info.opened_folder_popup) { - LOGE("Failed to create folder_popup "); - evas_object_del(s_info.opened_folder_window); - s_info.opened_folder_window = NULL; - return false; - } - evas_object_show(s_info.opened_folder_popup); - - entry = __folder_panel_create_entry(s_info.opened_folder_popup, folder->label); - if (!entry) { - LOGE("Failed to create entry"); - evas_object_del(s_info.opened_folder_window); - evas_object_del(s_info.opened_folder_popup); - s_info.opened_folder_window = NULL; - s_info.opened_folder_popup = NULL; - return false; - } - - f_data->folder_scroller = __folder_panel_create_scroller(home_screen_get_win()); - if (!f_data->folder_scroller) { - LOGE("Failed to create folder layout"); - evas_object_del(s_info.opened_folder_window); - evas_object_del(s_info.opened_folder_popup); - s_info.opened_folder_window = NULL; - s_info.opened_folder_popup = NULL; - return false; - } - elm_object_part_content_set(s_info.opened_folder_popup, PART_FOLDER_CONTENT, f_data->folder_scroller); - if (!__folder_panel_fill(s_info.opened_folder_popup, f_data->folder_scroller, folder)) { - LOGE("Failed to fill folder grid"); - evas_object_del(s_info.opened_folder_window); - evas_object_del(s_info.opened_folder_popup); - __folder_panel_free_popup_data(folder->data); - s_info.opened_folder_window = NULL; - s_info.opened_folder_popup = NULL; - return false; - } - - f_node = evas_object_data_get(folder->layout, KEY_ICON_DATA); - if (!f_node) { - LOGE("[FAILED][f_node=NULL]"); - evas_object_del(s_info.opened_folder_window); - evas_object_del(s_info.opened_folder_popup); - __folder_panel_free_popup_data(folder->data); - s_info.opened_folder_window = NULL; - s_info.opened_folder_popup = NULL; - return false; - } - - count = folder_panel_get_items_count(f_node); - if (count < FOLDER_MAX_ITEMS) { - add_icon = __folder_panel_create_add_icon(folder); - - if (!app_grid_append_item(page_scroller_get_page(f_data->folder_scroller, page_scroller_get_page_count(f_data->folder_scroller)-1), add_icon)) { - LOGE("Creating folder window without \"+\""); - evas_object_del(add_icon); - } - } - - evas_object_resize(s_info.opened_folder_window, FOLDER_WINDOW_W, FOLDER_WINDOW_H); - evas_object_move(s_info.opened_folder_window, 0, 0); - evas_object_show(s_info.opened_folder_window); - - elm_object_signal_callback_add(s_info.opened_folder_window, SIGNAL_BG_CLICKED, SIGNAL_SOURCE, __folder_window_destroy_signal_cb, folder); - evas_object_smart_callback_add(entry, "focused", __folder_panel_entry_activated_cb, folder); - evas_object_smart_callback_add(entry, "unfocused", __folder_panel_entry_deactivated_cb, folder); - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_PANEL_OPEN, SIGNAL_SOURCE); - - return true; -} - -static Evas_Object* __folder_panel_create_scroller(Evas_Object *folder_window_layout) -{ - Evas_Object *folder_page_scroller = NULL; - LOGI(""); - - if (!folder_window_layout) { - LOGE("Invalid parameter"); - return NULL; - } - - folder_page_scroller = page_scroller_create(FOLDER_GRID_W_REL*home_screen_get_root_width(), FOLDER_GRID_H_REL*home_screen_get_root_height()); - if (!folder_page_scroller) { - LOGE("Failed to create folder page scroller layout"); - return NULL; - } - - elm_scroller_movement_block_set(folder_page_scroller, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); - elm_scroller_movement_block_set(folder_page_scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); - elm_scroller_loop_set(folder_page_scroller, EINA_FALSE, EINA_FALSE); - - return folder_page_scroller; -} - -static bool __folder_panel_detach_grid_items(Tree_node_t *parent, Tree_node_t *item, void *data) -{ - if (item->data && item->data->grid_item) { - app_grid_unpack_item(item->data->grid_item); - elm_object_item_del(item->data->grid_item); - evas_object_hide(item->data->layout); - item->data->grid_item = NULL; - - return true; - } - - return false; -} - -static bool __folder_panel_set_current_view_state(Tree_node_t *parent, Tree_node_t *item, void *data) -{ - app_icon_set_view_mode(item->data->layout, home_screen_get_view_type(), true); - return true; -} - -static bool __folder_panel_show_checkbox(Tree_node_t *parent, Tree_node_t *leaf, void *data) -{ - if (leaf->data->type == APP_ITEM_ICON) { - if (leaf->data->is_checked) - elm_object_signal_emit(leaf->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE); - else - elm_object_signal_emit(leaf->data->layout, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE); - } - return true; -} - -static bool __folder_panel_get_checked_icons(Tree_node_t *parent, Tree_node_t *leaf, void *data) -{ - check_info_s *check_info = data; - - if (leaf->data->type == APP_ITEM_ICON) { - check_info->all_checked = check_info->all_checked && leaf->data->is_checked; - check_info->any_checked = check_info->any_checked || leaf->data->is_checked; - } - - return true; -} - -static bool __folder_panel_fill(Evas_Object *folder_window_layout, Evas_Object *folder_page_scroller, app_item_t *folder) -{ - folder_data_t *folder_data = NULL; - Tree_node_t *it; - Tree_node_t *folder_app_tree = NULL; - Evas_Object *folder_app_grid = NULL; - LOGI(""); - - if (!folder_page_scroller || !folder) { - LOGE("Invalid parameter"); - return false; - } - - folder_data = (folder_data_t*)folder->data; - if (!folder_data) { - LOGE("Failed to get folder data"); - return false; - } - - folder_app_tree = evas_object_data_get(folder->layout, KEY_ICON_DATA); - if (!folder_app_tree) { - LOGE("Failed to get folder app tree"); - return false; - } - - TREE_NODE_FOREACH(folder_app_tree, it) { - folder_app_grid = app_grid_create(folder_page_scroller, it, - FOLDER_GRID_W_REL*home_screen_get_root_width(), FOLDER_GRID_H_REL*home_screen_get_root_height(), APP_GRID_TYPE_FOLDER); - if (!folder_app_grid) { - LOGE("[FAILED][app_grid_create]"); - return false; - } - - if (!page_scroller_add_page(folder_page_scroller, folder_app_grid)) { - LOGE("[FAILED][page_scroller_page_add]"); - evas_object_del(folder_app_grid); - return false; - } - - data_model_iterate(it, __folder_panel_set_current_view_state, NULL); - } - - if (home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS_CHOOSE) - data_model_iterate(folder_app_tree, __folder_panel_show_checkbox, NULL); - - __folder_panel_print_labels(folder_app_tree); - - return true; -} - -static Evas_Object* __folder_panel_create_add_icon(app_item_t *folder) -{ - Evas_Object *icon_layout = NULL; - Evas_Object *add_icon = NULL; - LOGI(""); - - icon_layout = util_create_edje_layout(home_screen_get_win(), util_get_res_file_path(EDJE_DIR"/icon.edj"), GROUP_ICON_LY); - if (!icon_layout) { - LOGE("Failed to create icon layout"); - return NULL; - } - - add_icon = elm_layout_add(home_screen_get_win()); - if (!add_icon) { - LOGE("Failed to create folder icon layout"); - evas_object_del(icon_layout); - return NULL; - } - - if (!elm_layout_file_set(add_icon, util_get_res_file_path(EDJE_DIR"/folder.edj"), GROUP_FOLDER_ADD_ICON)) { - LOGE("Failed to load edje file for layout"); - evas_object_del(add_icon); - evas_object_del(icon_layout); - return NULL; - } - - elm_object_part_content_set(icon_layout, PART_ICON_CONTENT, add_icon); - evas_object_size_hint_align_set(icon_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(icon_layout); - evas_object_show(add_icon); - - elm_object_signal_callback_add(add_icon, "mouse,clicked,1", "add_icon", __folder_panel_item_add_to_folder_cb, s_info.folder_item); - evas_object_data_set(icon_layout, KEY_IS_REPOSITIONABLE, (void*)false); - - return icon_layout; -} - -static Evas_Object *__folder_panel_create_popup(Evas_Object *parent, app_item_t *folder) -{ - Evas_Object *folder_popup = NULL; - Tree_node_t *folder_app_tree = NULL; - - if (!parent || !folder) { - LOGE("Invalid parameters: [%p] [%p]", parent, folder); - return NULL; - } - - folder_app_tree = evas_object_data_get(folder->layout, KEY_ICON_DATA); - if (!folder_app_tree) { - LOGE("Failed to get folder app tree"); - return NULL; - } - - folder_popup = elm_layout_add(parent); - if (!folder_popup) { - LOGE("Failed to create folder_popup "); - return NULL; - } - - if (!elm_layout_file_set(folder_popup, util_get_res_file_path(EDJE_DIR"/folder.edj"), GROUP_FOLDER_POPUP)) { - LOGE("Failed to set folder popup"); - evas_object_del(folder_popup); - return NULL; - } - - elm_object_part_text_set(folder_popup, PART_FOLDER_UNNAMED_TEXT, gettext("IDS_COM_HEADER_UNNAMED_FOLDER")); - - evas_object_resize(folder_popup, FOLDER_POPUP_W_REL*home_screen_get_root_width(), FOLDER_3_ROW_H_REL*home_screen_get_root_height()); - - evas_object_move(folder_popup, FOLDER_POPUP_X_REL*home_screen_get_root_width(), - FOLDER_POPUP_Y_REL*home_screen_get_root_height()); - - return folder_popup; -} - -static Evas_Object *__folder_panel_create_entry(Evas_Object *parent, const char *default_text) -{ - Evas_Object *entry = NULL; - - if (!parent) { - LOGE("Invalid parameter : parent is NULL"); - return NULL; - } - - entry = elm_entry_add(parent); - if (!entry) { - LOGE("Failed to create entry widget"); - return NULL; - } - - evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_entry_single_line_set(entry, EINA_TRUE); - elm_entry_scrollable_set(entry, EINA_TRUE); - evas_object_show(entry); - - if (s_info.folder_entry_theme) { - elm_object_theme_set(entry, s_info.folder_entry_theme); - elm_object_style_set(entry, "default"); - } - - elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); - elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); - - evas_object_smart_callback_add(entry, "changed", __folder_panel_entry_changed_cb, parent); - evas_object_smart_callback_add(entry, "clicked", __folder_panel_entry_clicked_cb, parent); - evas_object_smart_callback_add(entry, "activated", __folder_panel_entry_done_cb, parent); - - elm_object_signal_callback_add(parent, SIGNAL_CLEAR_BTN_CLICKED, SIGNAL_SOURCE, - __folder_panel_entry_clear_button_clicked_cb, entry); - - if (strlen(default_text) > 0) { - elm_entry_entry_set(entry, default_text); - s_info.opened_folder_name_is_empty = false; - } else { - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_UNNAMED_TEXT_SHOW, - SIGNAL_SOURCE); - elm_object_text_set(entry, ""); - s_info.opened_folder_name_is_empty = true; - } - - elm_object_part_content_set(s_info.opened_folder_popup, PART_FOLDER_NAME, entry); - - return entry; -} - -static void __folder_panel_entry_activated_cb(void *data, Evas_Object *obj, void *ei) -{ - app_item_t *folder = (app_item_t*) data; - LOGI("Entry"); - - if (!folder) { - LOGE("Failed to get folder"); - return; - } - - if (!strcmp(folder->label, "")) - s_info.opened_folder_name_is_empty = true; - - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_UNNAMED_TEXT_HIDE, - SIGNAL_SOURCE); - - s_info.entry_activated = true; - s_info.opened_folder_entrychange_cb_ignore = false; -} - -static void __folder_panel_entry_deactivated_cb(void *data, Evas_Object *obj, void *ei) -{ - const char *label = NULL; - label = elm_entry_entry_get(obj); - - if (!label || !strcmp(label, "")) { - s_info.opened_folder_name_is_empty = true; - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_FOLDER_UNNAMED_TEXT_SHOW, - SIGNAL_SOURCE); - } - - elm_object_signal_emit(s_info.opened_folder_popup, SIGNAL_CLEAR_BTN_HIDE, SIGNAL_SOURCE); -} - -static void __folder_panel_entry_changed_cb(void *data, Evas_Object *obj, void *ei) -{ - Evas_Object *folder = (Evas_Object *)data; - const char *entry_text = elm_object_text_get(obj); - - if (s_info.opened_folder_entrychange_cb_ignore) - return; - - if (!entry_text || strlen(entry_text) == 0) { - s_info.opened_folder_name_is_empty = true; - elm_object_signal_emit(folder, SIGNAL_CLEAR_BTN_HIDE, SIGNAL_SOURCE); - } else { - s_info.opened_folder_name_is_empty = false; - elm_object_signal_emit(folder, SIGNAL_CLEAR_BTN_SHOW, SIGNAL_SOURCE); - } -} - -static void __folder_panel_entry_clicked_cb(void *data, Evas_Object *obj, void *ei) -{ - Evas_Object *folder_popup = (Evas_Object*) data; - LOGI(""); - - if (!folder_popup) { - LOGE("Invalid data"); - return; - } - - if (s_info.entry_activated) { - elm_entry_cursor_end_set(obj); - s_info.entry_activated = false; - } - - if (!s_info.opened_folder_name_is_empty) - elm_object_signal_emit(folder_popup, SIGNAL_CLEAR_BTN_SHOW, SIGNAL_SOURCE); - else - elm_object_signal_emit(folder_popup, SIGNAL_CLEAR_BTN_HIDE, SIGNAL_SOURCE); - elm_entry_input_panel_show(obj); -} - -static void __folder_panel_entry_done_cb(void *data, Evas_Object *obj, void *ei) -{ - LOGI(""); - Evas_Object *entry = obj; - Evas_Object *folder_popup = data; - - if (!folder_popup || !entry) { - LOGE("Invalid data"); - return; - } - - elm_entry_input_panel_hide(entry); -} - -static void __folder_panel_entry_clear_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - LOGI(""); - Evas_Object *entry = NULL; - - entry = (Evas_Object*) data; - if (!entry) { - LOGE("Invalid data pointer"); - return; - } - - elm_object_text_set(entry, ""); - s_info.opened_folder_name_is_empty = true; - elm_object_signal_emit(obj, SIGNAL_CLEAR_BTN_HIDE, SIGNAL_SOURCE); -} - -static void __folder_panel_item_add_to_folder_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - app_item_t *folder_item = NULL; - Tree_node_t *node = NULL; - - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_CHOOSE); - option_menu_update_on_item_selected(); - folder_panel_close_folder(); - - folder_item = (app_item_t*) data; - if (!folder_item) { - LOGE("Failed to get folder item"); - return; - } - - node = evas_object_data_get(folder_item->layout, KEY_ICON_DATA); - if (!node) { - LOGE("[FAILED][node=NULL]"); - return; - } - s_info.destination_folder = node; - - elm_object_signal_emit(folder_item->layout, SIGNAL_CHECKBOX_CHECKED, SIGNAL_SOURCE); - elm_object_signal_emit(folder_item->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE); - elm_object_signal_emit(folder_item->layout, SIGNAL_CHECKBOX_BLOCK, SIGNAL_SOURCE); - - app_icon_set_color(folder_item->layout, 150, 150, 150, 150); - s_info.folder_item_add = folder_item; -} - -static void __folder_panel_print_labels(Tree_node_t *folder_tree) -{ - app_item_t *t = NULL; - Tree_node_t *page = NULL; - Tree_node_t *it = NULL; - int i=0; - TREE_NODE_FOREACH(folder_tree, page) { - TREE_NODE_FOREACH(page, it) { - t = it->data; - LOGI("item %d: %s", i++, t->label); - } - } -} - -static void __folder_panel_free_popup_data(folder_data_t *folder_data) -{ - if (!folder_data) - return; - - evas_object_del(folder_data->folder_scroller); - folder_data->folder_scroller = NULL; -} - -static void __folder_panel_close_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Tree_node_t *folder_app_tree = NULL; - Evas_Object *entry = NULL; - - entry = elm_object_part_content_get(s_info.opened_folder_popup, PART_FOLDER_NAME); - elm_object_signal_callback_del(s_info.opened_folder_popup, SIGNAL_FOLDER_ANIM_DONE, SIGNAL_SOURCE, __folder_panel_close_cb); - __folder_panel_name_set_cb(s_info.folder_item, entry, NULL); - - if (s_info.folder_item) { - folder_app_tree = evas_object_data_get(s_info.folder_item->layout, KEY_ICON_DATA); - if (folder_app_tree) { - __folder_panel_print_labels(folder_app_tree); - data_model_iterate_pages(folder_app_tree, NULL, __folder_panel_detach_grid_items, NULL); - } - - app_icon_highlight_folder_icon(s_info.folder_item->layout, FOLDER_ICON_FRAME_NONE); - //app_icon_set_color(s_info.folder_item->layout, 255, 255, 255, 255); - - __folder_panel_free_popup_data(s_info.folder_item->data); - s_info.folder_item = NULL; - } - - if (s_info.opened_folder_popup) { - evas_object_del(s_info.opened_folder_popup); - s_info.opened_folder_popup = NULL; - } - if (s_info.opened_folder_window) { - evas_object_del(s_info.opened_folder_window); - s_info.opened_folder_window = NULL; - } -} diff --git a/src/homescreen-efl.c b/src/homescreen-efl.c old mode 100644 new mode 100755 index 984c1d4..00661b1 --- a/src/homescreen-efl.c +++ b/src/homescreen-efl.c @@ -14,1261 +14,379 @@ * limitations under the License. */ -#include -#include -#include -#include #include -#include +#include +#include + +#include "conf.h" +#include "edc_conf.h" +#include "util.h" #include "homescreen-efl.h" -#include "add_viewer/add_viewer.h" -#include "key.h" -#include "option_menu.h" -#include "add_viewer/add_viewer.h" -#include "livebox/livebox_panel.h" -#include "livebox/livebox_utils.h" -#include "mouse.h" -#include "app_mgr.h" -#include "app_icon.h" -#include "all_apps.h" -#include "data_model.h" -#include "layout.h" -#include "folder_panel.h" -#include "livebox_all_pages.h" -#include "mouse.h" -#include "popup.h" +#include "apps_view.h" +#include "cluster_view.h" +#include "hw_key.h" +#include "view.h" static struct { - Evas_Object *win; - Evas_Object *bg; - Evas_Object *gradient_bg; - Evas_Object *conformant; - Evas_Object *gesture_rect; - Evas_Object *layout; - Evas_Object *all_apps; - Evas_Object *home; - Elm_Gesture_Layer *gesture_layer; - int root_width; - int root_height; - homescreen_view_t view_type; - bool is_bg_blurred; - Ecore_Animator* animator; -} s_info = { - .win = NULL, - .bg = NULL, - .gradient_bg = NULL, - .conformant = NULL, - .gesture_rect = NULL, - .layout = NULL, - .all_apps = NULL, - .home = NULL, - .gesture_layer = NULL, - .root_width = 0, - .root_height = 0, - .view_type = HOMESCREEN_VIEW_HOME, - .is_bg_blurred = false, - .animator = NULL + Evas_Object *win; + Evas_Object *bg; + Evas_Object *conformant; + Evas_Object *main_layout; + Evas_Object *apps_layout; + Evas_Object *cluster_layout; + Evas_Object *btn_layout; + int root_width; + int root_height; + homescreen_view_t view_type; + Ecore_Animator *animator; +} main_info = { + .win = NULL, + .bg = NULL, + .conformant = NULL, + .main_layout = NULL, + .apps_layout = NULL, + .cluster_layout = NULL, + .btn_layout = NULL, + .root_width = 0, + .root_height = 0, + .view_type = HOMESCREEN_VIEW_HOME, + .animator = NULL }; -static bool mvc_badge_refresh_enable = true; - -/*======================================UI HELPER FUNCTIONS========================*/ -static void __homescreen_efl_create_base_gui(void); -static void __homescreen_efl_win_delete_request_cb(void *data, Evas_Object *obj, void *event_info); static void __homescreen_efl_get_window_size(Evas_Object *win); -static void __homescreen_efl_home_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __homescreen_efl_menu_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __homescreen_efl_attach_badge_callback(void); -static void __homescreen_efl_detach_badge_callback(void); -static bool __homescreen_efl_update_icon_label(Tree_node_t *parent, Tree_node_t *node, void *data); -static void __homescreen_efl_make_gradient_bg(void); -static void __homescreen_efl_show_gradient_bg(void); -static void __homescreen_efl_show_normal_bg(void); - -/*======================================APP CONTROL CALLBACKS=======================*/ -static bool __homescreen_efl_app_create_cb(void *data); -static void __homescreen_efl_app_control_cb(app_control_h app_control, void *data); -static void __homescreen_efl_app_pause_cb(void *data); -static void __homescreen_efl_app_resume_cb(void *data); -static void __homescreen_efl_app_terminate_cb(void *data); - - -/*============================UI CALLBACKS==========================================*/ -static void __homescreen_efl_lang_changed_cb(app_event_info_h event_info, void *user_data); -static void __homescreen_efl_orient_changed_cb(app_event_info_h event_info, void *user_data); -static void __homescreen_efl_region_changed_cb(app_event_info_h event_info, void *user_data); -static void __homescreen_efl_low_battery_cb(app_event_info_h event_info, void *user_data); -static void __homescreen_efl_low_memory_cb(app_event_info_h event_info, void *user_data); - -/*==================== MVC Controller functions implementation: ===================*/ -static bool __update_all_badges_count(Tree_node_t *parent, Tree_node_t *node, void *data); -static void __badge_change_cb(unsigned int action, const char *app_id, unsigned int count, void *user_data); -static bool __homescreen_efl_update_icon_badge(Tree_node_t *parent, Tree_node_t *node, void *data); -static void __homescreen_efl_badge_count_update_cb(void *app_item); -static void __homescreen_efl_activate_chooser_caption(void); -static void __homescreen_efl_deactivate_chooser_caption(void); -static void __homescreen_efl_chooser_caption_done_button_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __homescreen_efl_chooser_caption_cancel_button_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static bool __homescreen_efl_free_grid_item(Tree_node_t *page, Tree_node_t *item, void *data); -static bool __homescreen_efl_increment_page(Tree_node_t *parent, Tree_node_t *item, void *data); -static bool __homescreen_efl_attach_all_apps_grid_item(Tree_node_t *page, Tree_node_t *item, void *data); -static void __homescreen_efl_apply_data_model_to_view(void); -static void __homescreen_efl_show_all_apps(void); -static void __homescreen_efl_show_home_view(void); -static void __homescreen_efl_home_bg_changed_cb(system_settings_key_e key, void *data); -static void __homescreen_efl_apply_home_bg_effect(bool is_on); -static Eina_Bool __homescreen_efl_show_all_apps_anim(void *data, double pos); -static Eina_Bool __homescreen_efl_show_home_anim(void *data, double pos); -/*====================PUBLIC FUNCTIONS IMPLEMENTATION===============================*/ - -/*used to iterate over data model:*/ -static bool folder_count_pending = false; -static unsigned int folder_badge_counter = 0; - -DAPI int main(int argc, char *argv[]) -{ - dlog_print(DLOG_DEBUG, LOG_TAG, "Starting homescreen-efl"); - - int ret = 0; - ui_app_lifecycle_callback_s event_callback = {0,}; - app_event_handler_h handlers[5] = {NULL, }; - - event_callback.create = __homescreen_efl_app_create_cb; - event_callback.terminate = __homescreen_efl_app_terminate_cb; - event_callback.pause = __homescreen_efl_app_pause_cb; - event_callback.resume = __homescreen_efl_app_resume_cb; - event_callback.app_control = __homescreen_efl_app_control_cb; - - ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, __homescreen_efl_low_battery_cb, NULL); - ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, __homescreen_efl_low_memory_cb, NULL); - ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, __homescreen_efl_orient_changed_cb, NULL); - ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, __homescreen_efl_lang_changed_cb, NULL); - ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, __homescreen_efl_region_changed_cb, NULL); - ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]); - - ret = ui_app_main(argc, argv, &event_callback, NULL); - if (ret != APP_ERROR_NONE) - dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret); - - s_info.view_type = HOMESCREEN_VIEW_HOME; - - return ret; -} - -HAPI int home_screen_get_root_width(void) -{ - return s_info.root_width; -} - -HAPI int home_screen_get_root_height(void) -{ - return s_info.root_height; -} - -HAPI Evas_Object *home_screen_get_win(void) -{ - return s_info.win; -} - -HAPI Evas_Object *home_screen_get_layout(void) -{ - return s_info.layout; -} - -HAPI homescreen_view_t home_screen_get_view_type(void) -{ - return s_info.view_type; -} - -HAPI void home_screen_set_view_type(homescreen_view_t view) -{ - switch (view) { - case HOMESCREEN_VIEW_HOME: - __homescreen_efl_apply_home_bg_effect(false); - __homescreen_efl_show_normal_bg(); - if (s_info.view_type == HOMESCREEN_VIEW_ALL_APPS) { - all_apps_set_view_mode(view); - __homescreen_efl_show_home_view(); - } - else if(s_info.view_type == HOMESCREEN_VIEW_HOME_EDIT) - elm_object_signal_emit(s_info.layout, SIGNAL_BOTTOM_BUTTONS_HOME_STATE_SET, SIGNAL_SOURCE); - break; - case HOMESCREEN_VIEW_HOME_EDIT: - LOGI("HOMESCREEN_VIEW_HOME_EDIT"); - livebox_panel_set_edit_mode_layout(true); - livebox_panel_change_edit_mode_state(false); - elm_object_signal_emit(s_info.layout, SIGNAL_BOTTOM_BUTTONS_HOME_EDIT_STATE_SET, SIGNAL_SOURCE); - break; - case HOMESCREEN_VIEW_HOME_ADD_VIEWER: - LOGI("HOMESCREEN_VIEW_ADD_VIEWER"); - add_viewer_window_create(s_info.root_width, s_info.root_height); - break; - case HOMESCREEN_VIEW_HOME_ALL_PAGES: - LOGI("HOMESCREEN_VIEW_HOME_ALL_PAGES"); - livebox_all_pages_show(); - break; - case HOMESCREEN_VIEW_ALL_APPS: - __homescreen_efl_apply_home_bg_effect(true); - __homescreen_efl_show_gradient_bg(); - if (s_info.view_type == HOMESCREEN_VIEW_HOME) - __homescreen_efl_show_all_apps(); - - if (s_info.view_type == HOMESCREEN_VIEW_ALL_APPS_CHOOSE) - __homescreen_efl_deactivate_chooser_caption(); - all_apps_set_view_mode(view); - elm_object_signal_emit(s_info.layout, SIGNAL_BOTTOM_BUTTONS_ALL_APPS_STATE_SET, SIGNAL_SOURCE); - __badge_change_cb(0, NULL, 0, NULL); - break; - case HOMESCREEN_VIEW_ALL_APPS_EDIT: - LOGI("HOMESCREEN_VIEW_ALL_APPS_EDIT"); - if (s_info.view_type == HOMESCREEN_VIEW_ALL_APPS_CHOOSE) - __homescreen_efl_deactivate_chooser_caption(); - all_apps_set_view_mode(view); - elm_object_signal_emit(s_info.layout, SIGNAL_BOTTOM_BUTTONS_ALL_APPS_EDIT_STATE_SET, SIGNAL_SOURCE); - break; - case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: - LOGI("HOMESCREEN_VIEW_ALL_APPS_CHOOSE"); - __homescreen_efl_activate_chooser_caption(); - all_apps_set_view_mode(view); - break; - case HOMESCREEN_VIEW_UNKNOWN: - LOGI("HOMESCREEN_VIEW_UNKNOWN"); - break; - default: - LOGE("UKNOWN VIEW TYPE"); - break; - } - - s_info.view_type = view; -} - -HAPI void home_screen_set_indice_state(indice_type_t indice) -{ - switch (indice) { - case INDICE_NEXT_PAGE_ON: - elm_object_signal_emit(s_info.layout, SIGNAL_NEXT_PAGE_INDICE_SHOW, SIGNAL_SOURCE); - break; - case INDICE_PREV_PAGE_ON: - elm_object_signal_emit(s_info.layout, SIGNAL_PREV_PAGE_INDICE_SHOW, SIGNAL_SOURCE); - break; - case INDICE_OFF: - elm_object_signal_emit(s_info.layout, SIGNAL_INDICE_HIDE, SIGNAL_SOURCE); - break; - default: - break; - } -} - -HAPI void home_screen_mvc_set_ly_scale(Evas_Object *layout) -{ - Evas_Object *edje = NULL; - int width = -1; - int height = -1; - - if (!layout) { - LOGE("[FAILED][invalid parameter]"); - return; - } - - edje = elm_layout_edje_get(layout); - - width = s_info.root_width; - height = s_info.root_height; - - if (width == HD_WIDTH && height == HD_HEIGHT) { - LOGD("HD_RES"); - edje_object_scale_set(edje, HD_SCALE_FACTOR); - } else if(width == QHD_WIDTH && height == QHD_HEIGHT) { - LOGD("QHD_RES"); - edje_object_scale_set(edje, QHD_SCALE_FACTOR); - } else if(width == WVGA_WIDTH && height == WVGA_HEIGHT) { - LOGD("WVGA_RES"); - edje_object_scale_set(edje, WVGA_SCALE_FACTOR); - } else if(width == UHD_WIDTH && height == UHD_HEIGHT) { - edje_object_scale_set(edje, UHD_SCALE_FACTOR); - } -} - -HAPI void home_screen_close_all_apps_choose_view(void) -{ - folder_panel_cancel_add_icon(); - folder_panel_set_click_ignore_state(false); - data_model_check_all_apps(data_model_get_all_apps(), false); - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS); -} - -HAPI int home_screen_gesture_cb_set(Elm_Gesture_Type idx, Elm_Gesture_State cb_type, Elm_Gesture_Event_Cb cb, void *data) -{ - Elm_Gesture_Layer *gesture_layer = s_info.gesture_layer; - - if (!gesture_layer) { - LOGE("Can not set callback"); - return -1; - } - - elm_gesture_layer_cb_set(gesture_layer, idx, cb_type, cb, NULL); - - return 0; -} - -HAPI int home_screen_gesture_cb_unset(Elm_Gesture_Type idx, Elm_Gesture_State cb_type, Elm_Gesture_Event_Cb cb, void *data) -{ - Elm_Gesture_Layer *gesture_layer = s_info.gesture_layer; - - if (!gesture_layer) { - LOGE("Can not unset callback"); - return -1; - } - - elm_gesture_layer_cb_del(gesture_layer, idx, cb_type, cb, NULL); - - return 0; -} - -/*====================END OF PUBLIC FUNCTIONS IMPLEMENTATION=========================*/ - -static void __homescreen_efl_win_delete_request_cb(void *data, Evas_Object *obj, void *event_info) -{ - ui_app_exit(); -} - -static Evas_Object *_create_conformant(void) -{ - Evas_Object *conformant = NULL; - - if (!s_info.win) { - LOGE("Window is not created"); - return NULL; - } - - conformant = elm_conformant_add(s_info.win); - if (!conformant) { - LOGE("Failed to create conformant"); - return NULL; - } - elm_win_conformant_set(s_info.win, EINA_TRUE); - - evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(s_info.win, conformant); - - elm_win_indicator_mode_set(s_info.win, ELM_WIN_INDICATOR_SHOW); - elm_win_indicator_opacity_set(s_info.win, ELM_WIN_INDICATOR_TRANSLUCENT); - elm_object_signal_emit(conformant, "elm,state,indicator,overlap", "elm"); - - evas_object_show(conformant); - - return conformant; -} - -static Evas_Object *_create_gesture_rect(Evas *e, int w, int h) -{ - LOGD(""); - Evas_Object *gesture_rect = NULL; - - if (!s_info.win) { - LOGE("Window is not created"); - return NULL; - } - - gesture_rect = evas_object_rectangle_add(e); - if(!gesture_rect) { LOGE("Failed to create gesture rectangle"); - return NULL; - } - - evas_object_layer_set(gesture_rect, EVAS_LAYER_MAX); - evas_object_color_set(gesture_rect, 0, 0, 0, 0); - evas_object_geometry_set(gesture_rect, 0, 0, w, h); - evas_object_repeat_events_set(gesture_rect, EINA_TRUE); - - evas_object_show(gesture_rect); - - return gesture_rect; -} - -static Elm_Gesture_Layer *_create_gesture_layer(void) -{ - Elm_Gesture_Layer *gesture_layer = NULL; - Eina_Bool ret = EINA_FALSE; - - if(!s_info.gesture_rect) { - LOGE("Gesture rectangle is not created"); - return NULL; - } - - gesture_layer = elm_gesture_layer_add(s_info.win); - if(!gesture_layer) { - LOGE("Failed to create gesture layer"); - return NULL; - } - - ret = elm_gesture_layer_attach(gesture_layer, s_info.gesture_rect); - if(ret == EINA_FALSE) { - LOGE("Failed to attach gesture layer to gesture rectangle"); - free(gesture_layer); - return NULL; - } +static void __homescreen_efl_set_wallpaper(void); +static void __homescreen_efl_set_conformant(void); +static void __homescreen_efl_create_home_btn(void); +static void __homescreen_efl_home_bg_changed_cb(system_settings_key_e key, void *data); +static void __homescreen_efl_menu_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +static void __homescreen_efl_home_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); - return gesture_layer; -} +static void __homescreen_efl_change_view(void); +static Eina_Bool __homescreen_efl_show_apps_anim(void *data, double pos); +static Eina_Bool __homescreen_efl_show_cluster_anim(void *data, double pos); -static void __homescreen_efl_create_base_gui(void) +static void __homescreen_efl_lang_changed_cb(app_event_info_h event_info, void *user_data) { - char edj_path[PATH_MAX] = {0, }; - const char *bg_path = util_get_res_file_path(IMAGE_DIR"/default_bg.png"); - char trbuf[PATH_MAX] = {0, }; - char *buf = NULL; - int ret = -1; - Evas *e_conf = NULL; - - /* Window */ - s_info.win = elm_win_util_standard_add(PACKAGE, PACKAGE); - // evas_object_resize(s_info.win, 1440, 2560); - elm_win_autodel_set(s_info.win, EINA_TRUE); - - evas_object_smart_callback_add(s_info.win, "delete,request", __homescreen_efl_win_delete_request_cb, NULL); - - /*Background*/ - s_info.bg = evas_object_image_filled_add(evas_object_evas_get(s_info.win)); - - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf); - - if (!buf || ret != SYSTEM_SETTINGS_ERROR_NONE || !ecore_file_exists(buf) - || !ecore_file_can_read(buf)) - evas_object_image_file_set(s_info.bg, bg_path, "bg"); - else - evas_object_image_file_set(s_info.bg, buf, "bg"); - - free(buf); - - system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, __homescreen_efl_home_bg_changed_cb, NULL); - - elm_win_resize_object_add(s_info.win, s_info.bg); - evas_object_show(s_info.bg); - - __homescreen_efl_get_window_size(s_info.win); - - /* Conformant */ - s_info.conformant = _create_conformant(); - - /* Base Layout */ - snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/home.edj")); - s_info.layout = elm_layout_add(s_info.win); - elm_layout_file_set(s_info.layout, edj_path, GROUP_HOME_LY); - evas_object_size_hint_weight_set(s_info.layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(s_info.win, s_info.layout); - evas_object_show(s_info.layout); - - home_screen_mvc_set_ly_scale(s_info.layout); - - s_info.home = livebox_panel_create(s_info.layout); - if (!s_info.home) { - evas_object_del(s_info.win); - evas_object_del(s_info.bg); - evas_object_del(s_info.conformant); - evas_object_del(s_info.layout); - - LOGE("s_info.home == NULL"); - return; - } - - e_conf = evas_object_evas_get(s_info.conformant); - s_info.gesture_rect = _create_gesture_rect(e_conf, s_info.root_width, s_info.root_height); - s_info.gesture_layer = _create_gesture_layer(); - - elm_object_part_content_set(s_info.layout, PART_CONTENT, s_info.home); - - /* Show window after base gui is set up */ - dlog_print(DLOG_INFO, LOG_TAG ,"WINDOW SIZE IS : %d %d", s_info.root_width, s_info.root_height); - evas_object_show(s_info.win); - elm_object_signal_callback_add(s_info.layout, SIGNAL_HOME_BTN_CLICKED, SIGNAL_SOURCE, __homescreen_efl_home_btn_clicked, NULL); - elm_object_signal_callback_add(s_info.layout, SIGNAL_MENU_BTN_CLICKED, SIGNAL_SOURCE, __homescreen_efl_menu_btn_clicked, NULL); - - /*Chooser caption setup:*/ - elm_layout_signal_callback_add(s_info.layout, "mouse,clicked,*", - "chooser_caption_left_clickable_space", - __homescreen_efl_chooser_caption_cancel_button_cb, NULL); - elm_layout_signal_callback_add(s_info.layout, "mouse,clicked,*", - "chooser_caption_right_clickable_space", - __homescreen_efl_chooser_caption_done_button_cb, NULL); - - snprintf(trbuf, sizeof(trbuf), _("IDS_MEMO_HEADER_PD_SELECTED_ABB2"), 0); - layout_main_caption_set_menu_texts(trbuf, - _("IDS_TPLATFORM_ACBUTTON_CANCEL_ABB"), - _("IDS_TPLATFORM_ACBUTTON_DONE_ABB")); + LOGD("called"); } -/*TODO: coding convention!*/ -bool tree_print_cb(Tree_node_t *parent_node, Tree_node_t *tn, void *data) +static void __homescreen_efl_orient_changed_cb(app_event_info_h event_info, void *user_data) { - app_item_t *item = tn->data; - app_item_t *parent = NULL; - - if (tn->parent) - parent = tn->parent->data; - - LOGD("TYPE: %2d; PARENT name: %12.12s; id: %2d | ITEM appid: %28.28s; id: %2d; [%d, %d; %d, %d]; %s", - item->type, - parent ? parent->appid : "NULL", - parent ? parent->unique_id : -1, - item->appid, - item->unique_id, - item->col, - item->row, - item->col_span, - item->row_span, - item->content_info); - - return true; + LOGD("called"); } -/*TODO: coding convention!*/ -void home_screen_print_tree(void) +static void __homescreen_efl_region_changed_cb(app_event_info_h event_info, void *user_data) { - LOGD("TREE TEST START"); - data_model_iterate(data_model_get_data(), tree_print_cb, NULL); + LOGD("called"); } -static void __homescreen_efl_attach_badge_callback(void) +static void __homescreen_efl_low_battery_cb(app_event_info_h event_info, void *user_data) { - app_mgr_register_badge_callback(__badge_change_cb); + LOGD("called"); } -static void __homescreen_efl_detach_badge_callback(void) +static void __homescreen_efl_low_memory_cb(app_event_info_h event_info, void *user_data) { - app_mgr_unregister_badge_callback(__badge_change_cb); + LOGD("called"); } static bool __homescreen_efl_app_create_cb(void *data) { - elm_config_accel_preference_set("3d"); - ecore_animator_frametime_set(FRAMES_PER_SECOND); - - key_register(); - mouse_register(); - - __homescreen_efl_create_base_gui(); - folder_panel_init_module(); - app_mgr_init(); - - if(!data_model_load_db()) { - data_model_load_app_mgr(); - } - - livebox_panel_fill(); - livebox_panel_set_content(s_info.layout); - __homescreen_efl_attach_badge_callback(); - - home_screen_mvc_update_view(); - return true; + elm_config_accel_preference_set("3d"); + ecore_animator_frametime_set(FRAMES_PER_SECOND); + + feedback_initialize(); + + hw_key_register(); + + main_info.win = elm_win_util_standard_add(PACKAGE, PACKAGE); + __homescreen_efl_get_window_size(main_info.win); + + __homescreen_efl_set_wallpaper(); + evas_object_show(main_info.win); + main_info.cluster_layout = cluster_view_create(main_info.win); + if (main_info.cluster_layout == NULL) { + LOGE("main_info.cluster_layout == NULL"); + return false; + } + evas_object_move(main_info.cluster_layout, 0, INDICATOR_H); + evas_object_show(main_info.cluster_layout); + main_info.apps_layout = apps_view_create(main_info.win); + if (main_info.apps_layout == NULL) { + LOGE("main_info.apps_layout == NULL"); + return false; + } + evas_object_move(main_info.apps_layout, 0, main_info.root_height); + evas_object_show(main_info.apps_layout); + __homescreen_efl_set_conformant(); + __homescreen_efl_create_home_btn(); + return true; } static void __homescreen_efl_app_control_cb(app_control_h app_control, void *data) { - elm_win_activate(s_info.win); -} -static void __homescreen_efl_app_pause_cb(void *data) -{ - /* Take necessary actions when application becomes invisible. */ - livebox_panel_paused(); } -static void __homescreen_efl_app_resume_cb(void *data) +static void __homescreen_efl_app_pause_cb(void *data) { - /* Take necessary actions when application becomes visible. */ - livebox_panel_resumed(); -} -static void __homescreen_efl_app_terminate_cb(void *data) -{ - /* Release all resources. */ - __homescreen_efl_detach_badge_callback(); - mouse_unregister(); - key_unregister(); - app_mgr_deinit(); - all_apps_del(); - popup_destroy(); - folder_panel_deinit_module(); - data_model_free(); - livebox_panel_destroy(); } -static bool __homescreen_efl_update_icon_label(Tree_node_t *parent, Tree_node_t *node, void *data) +static void __homescreen_efl_app_resume_cb(void *data) { - if(!node || !node->data) - return false; - - /*update model*/ - if (node->data->label && node->data->type == APP_ITEM_ICON) { - free(node->data->label); - node->data->label = app_mgr_get_app_label(node->data->appid); - } - /*update view*/ - elm_object_part_text_set(node->data->layout, PART_ICON_NAME, node->data->label); - - return true; } -static void __homescreen_efl_make_gradient_bg(void) +static void __homescreen_efl_app_terminate_cb(void *data) { -#ifdef HOME_HOME_SCREEN_GRADIENT_ENABLED - Evas_Map *m = NULL; - Evas_Colorspace ec = EVAS_COLORSPACE_ARGB8888; - char *image_raw_data = NULL; - int image_width = 0; - int image_height = 0; - int r = 0; - int g = 0; - int b = 0; - int a = 0; - - if(!s_info.bg) - return; - - ec = evas_object_image_colorspace_get(s_info.bg); - - if(ec != EVAS_COLORSPACE_ARGB8888) - return; - - image_raw_data = evas_object_image_data_get(s_info.bg, EINA_FALSE); - if(!image_raw_data) - return; - - evas_object_image_size_get(s_info.bg, &image_width, &image_height); - if(image_width == 0 || image_height == 0) - return; - - if(!s_info.gradient_bg) - s_info.gradient_bg = evas_object_rectangle_add(evas_object_evas_get(s_info.win)); - - if(!s_info.gradient_bg) - return; - - evas_object_resize(s_info.gradient_bg, s_info.root_width, s_info.root_height); - - m = evas_map_new(4); - if(!m) - return; - - evas_map_util_points_populate_from_object(m, s_info.gradient_bg); - - r = image_raw_data[2] & 0xff; - g = image_raw_data[1] & 0xff; - b = image_raw_data[0] & 0xff; - a = image_raw_data[3] & 0xff; - evas_map_point_color_set(m, 0, r, g, b, a); - - r = image_raw_data[4*image_width -4 + 2] & 0xff; - g = image_raw_data[4*image_width -4 + 1] & 0xff; - b = image_raw_data[4*image_width -4 + 0] & 0xff; - a = image_raw_data[4*image_width -4 + 3] & 0xff; - evas_map_point_color_set(m, 1, r, g, b, a); - - r = image_raw_data[4*image_width -4 + (image_height-1)*4*image_width + 2] & 0xff; - g = image_raw_data[4*image_width -4 + (image_height-1)*4*image_width + 1] & 0xff; - b = image_raw_data[4*image_width -4 + (image_height-1)*4*image_width + 0] & 0xff; - a = image_raw_data[4*image_width -4 + (image_height-1)*4*image_width + 3] & 0xff; - evas_map_point_color_set(m, 2, r, g, b, a); - - r = image_raw_data[(image_height-1)*4*image_width + 2] & 0xff; - g = image_raw_data[(image_height-1)*4*image_width + 1] & 0xff; - b = image_raw_data[(image_height-1)*4*image_width + 0] & 0xff; - a = image_raw_data[(image_height-1)*4*image_width + 3] & 0xff; - evas_map_point_color_set(m, 3, r, g, b, a); - - evas_object_map_set(s_info.gradient_bg, m); - evas_object_map_enable_set(s_info.gradient_bg, EINA_TRUE); - evas_map_free(m); -#endif + apps_view_app_terminate(); + cluster_view_app_terminate(); + hw_key_unregister(); + feedback_deinitialize(); } -static void __homescreen_efl_show_gradient_bg(void) +int main(int argc, char *argv[]) { -#ifdef HOME_HOME_SCREEN_GRADIENT_ENABLED - if(s_info.gradient_bg) { - evas_object_hide(s_info.bg); - elm_win_resize_object_del(s_info.win, s_info.bg); - elm_win_resize_object_add(s_info.win, s_info.gradient_bg); - evas_object_show(s_info.gradient_bg); - evas_object_raise(s_info.layout); - } -#endif -} + LOGD("Starting homescreen-efl"); -static void __homescreen_efl_show_normal_bg(void) -{ -#ifdef HOME_HOME_SCREEN_GRADIENT_ENABLED - evas_object_hide(s_info.gradient_bg); - elm_win_resize_object_del(s_info.win, s_info.gradient_bg); - elm_win_resize_object_add(s_info.win, s_info.bg); - evas_object_show(s_info.bg); - evas_object_raise(s_info.layout); -#endif -} + int ret = 0; + ui_app_lifecycle_callback_s event_callback = {0,}; + app_event_handler_h handlers[5] = {NULL, }; -static void __homescreen_efl_lang_changed_cb(app_event_info_h event_info, void *user_data) -{ - data_model_iterate(NULL, __homescreen_efl_update_icon_label, NULL); -} + event_callback.create = __homescreen_efl_app_create_cb; + event_callback.terminate = __homescreen_efl_app_terminate_cb; + event_callback.pause = __homescreen_efl_app_pause_cb; + event_callback.resume = __homescreen_efl_app_resume_cb; + event_callback.app_control = __homescreen_efl_app_control_cb; -static void __homescreen_efl_orient_changed_cb(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/ -} + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, __homescreen_efl_low_battery_cb, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, __homescreen_efl_low_memory_cb, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, __homescreen_efl_orient_changed_cb, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, __homescreen_efl_lang_changed_cb, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, __homescreen_efl_region_changed_cb, NULL); -static void __homescreen_efl_region_changed_cb(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_REGION_FORMAT_CHANGED*/ -} + ret = ui_app_main(argc, argv, &event_callback, NULL); + if (ret != APP_ERROR_NONE) + LOGE("ui_app_main() is failed. err = %d", ret); -static void __homescreen_efl_low_battery_cb(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_LOW_BATTERY*/ -} + main_info.view_type = HOMESCREEN_VIEW_HOME; -static void __homescreen_efl_low_memory_cb(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_LOW_MEMORY*/ + return ret; } static void __homescreen_efl_get_window_size(Evas_Object *win) { - elm_win_screen_size_get(win, NULL, NULL, &s_info.root_width, &s_info.root_height); - dlog_print(DLOG_DEBUG, LOG_TAG, "Width: [%d], Height: [%d]", s_info.root_width, s_info.root_height); -} - -static void __homescreen_efl_home_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - if (s_info.animator == NULL) { - homescreen_view_t view_t = home_screen_get_view_type(); - if (view_t == HOMESCREEN_VIEW_HOME) { - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS); - } else if (view_t == HOMESCREEN_VIEW_ALL_APPS) { - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - } - } -} - -static void __homescreen_efl_menu_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - homescreen_view_t view = home_screen_get_view_type(); - - switch (view) { - case HOMESCREEN_VIEW_HOME: - case HOMESCREEN_VIEW_ALL_APPS: - option_menu_show(); - break; - default: - break; - } -} - -/*==================== MVC Controller functions implementation: ===================*/ + elm_win_screen_size_get(win, NULL, NULL, &main_info.root_width, &main_info.root_height); -/*TODO: code convention!*/ -void home_screen_mvc_item_uninstall_cb(Tree_node_t *item) -{ - if (!item || !item->data) - return; - - if (item->data->type == APP_ITEM_ICON) { - app_mgr_uninstall_app(item->data->appid); - data_model_uninstall_application(item); - } else {/*folder item type:*/ - data_model_delete_folder(item); - } - - /*by default model is being sorted:*/ - data_model_sort(NULL); - data_model_free_empty_pages(NULL); - __homescreen_efl_apply_data_model_to_view(); - all_apps_remove_empty_pages(); -} + conf_set_resolution_scale(main_info.root_width, main_info.root_height); -void home_screen_mvc_update_view(void) -{ - data_model_sort(NULL); - __homescreen_efl_apply_data_model_to_view(); + LOGD("Width: [%d], Height: [%d]", main_info.root_width, main_info.root_height); } -void home_screen_mvc_drag_item_to_folder_cb(Tree_node_t *dragged_item, Tree_node_t *folder) +static void __homescreen_efl_set_wallpaper(void) { - if (dragged_item && folder) { - if (!folder->last) - data_model_append_node_to_folder(folder, dragged_item); /*there were no pages in folder*/ - else - data_model_reposition_item(dragged_item, folder->last, folder->last->last, REPOSITION_SIDE_TO_RIGHT, FOLDER_APPS_PAGE); - - /*for now model is always sorted:*/ - data_model_sort(NULL); - data_model_free_empty_pages(NULL); - __homescreen_efl_apply_data_model_to_view(); - all_apps_remove_empty_pages(); - } -} + char edj_path[PATH_MAX] = {0, }; + const char *bg_path = util_get_res_file_path(IMAGE_DIR"/default_bg.png"); + char *buf = NULL; + int ret = -1; -/*TODO:All mvc funcitons will be moved to separeted file.*/ -void home_screen_mvc_drag_item_from_folder_cb(void) -{ - __homescreen_efl_apply_data_model_to_view(); -} + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/home.edj")); -static void __homescreen_efl_activate_chooser_caption(void) -{ - data_model_check_all_apps(data_model_get_all_apps(), false); - elm_layout_signal_emit(s_info.layout, SIGNAL_CHOOSER_CAPTION_ACTIVATE, SIGNAL_SOURCE); - elm_win_indicator_mode_set(s_info.win, ELM_WIN_INDICATOR_HIDE); -} + main_info.main_layout = elm_layout_add(main_info.win); + elm_layout_file_set(main_info.main_layout, edj_path, GROUP_HOME_LY); + evas_object_size_hint_weight_set(main_info.main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(main_info.win, main_info.main_layout); -static void __homescreen_efl_deactivate_chooser_caption(void) -{ - elm_layout_signal_emit(s_info.layout, SIGNAL_CHOOSER_CAPTION_DEACTIVATE, SIGNAL_SOURCE); - elm_win_indicator_mode_set(s_info.win, ELM_WIN_INDICATOR_SHOW); -} + evas_object_show(main_info.main_layout); -static bool __homescreen_efl_free_grid_item(Tree_node_t *page, Tree_node_t *item, void *data) -{ - if (!item->data || !item->data->grid_item) { - LOGE("__homescreen_efl_free_grid_item, skipping: %d %d", item->data, item->data ? item->data->type : -1); - return true; - } + if (main_info.bg == NULL) { + main_info.bg = evas_object_image_filled_add(evas_object_evas_get(main_info.main_layout)); - if (!item->data->layout) - LOGD("__homescreen_efl_free_grid_item, %s item->data->layout == NULL", item->data->label); + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, __homescreen_efl_home_bg_changed_cb, NULL); - all_apps_detach_from_grid(item->data->grid_item); - item->data->grid_item = NULL; - evas_object_hide(item->data->layout); + evas_object_size_hint_min_set(main_info.bg, main_info.root_width, main_info.root_height); + elm_object_part_content_set(main_info.main_layout, "home_bg", main_info.bg); + evas_object_show(main_info.bg); + } - return true; + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf); + if (!buf || !ecore_file_can_read(buf) || ret != SYSTEM_SETTINGS_ERROR_NONE) { + evas_object_image_file_set(main_info.bg, bg_path, "bg"); + } else { + evas_object_image_file_set(main_info.bg, buf, "bg"); + } + if (buf) free(buf); } -static bool __homescreen_efl_increment_page(Tree_node_t *parent, Tree_node_t *item, void *data) -{ - (*((int *)data))++; - - return true; -} - -static bool __homescreen_efl_attach_all_apps_grid_item(Tree_node_t *page, Tree_node_t *item, void *data) +static void __homescreen_efl_home_bg_changed_cb(system_settings_key_e key, void *data) { - if (!item->data) { - LOGE("__homescreen_efl_attach_all_apps_grid_item, skipping: %d", item->data); - return true; - } - - item->data->grid_item = all_apps_attach_to_grid(item->data->layout, *(int *)data); - - if (!item->data->grid_item) { - /*failed to attach item - there is no room in page scroller - so we have to add another page. This problem does not concern folders.*/ - - if (!all_apps_append_page(page)) - LOGE("Could not create page for item: %s", item->data->label); - } - - app_icon_set_view_mode(item->data->layout, home_screen_get_view_type(), false); - - return true; + __homescreen_efl_set_wallpaper(); } -static bool _folder_grid_item_att(Tree_node_t *page, Tree_node_t *item, void *data) +static void __homescreen_efl_set_conformant(void) { - if (!item->data || !page->parent || !page->parent->data || - page->parent->data->type != APP_ITEM_FOLDER || - folder_panel_get_opened_folder_item() != page->parent->data) { - LOGE("_folder_grid_item_att, skipping: %s dest_folder: %d", item->data ? item->data->appid : NULL); - return true; - } - - item->data->grid_item = folder_panel_attach_to_grid(item->data->layout, ((app_item_t *)page->parent->data)->data); + elm_win_conformant_set(main_info.win, EINA_TRUE); - return true; -} + main_info.conformant = elm_conformant_add(main_info.win); + evas_object_size_hint_weight_set(main_info.conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(main_info.win, main_info.conformant); -static bool _folder_data_model_to_view_apply_cb(Tree_node_t *page, Tree_node_t *item, void *data) -{ - if (!item->data || item->data->type != APP_ITEM_FOLDER) - return true; + elm_win_indicator_mode_set(main_info.win, ELM_WIN_INDICATOR_SHOW); + elm_win_indicator_opacity_set(main_info.win, ELM_WIN_INDICATOR_TRANSLUCENT); + elm_object_signal_emit(main_info.conformant, "elm,state,indicator,overlap", "elm"); - data_model_iterate_pages(item, NULL, __homescreen_efl_free_grid_item, NULL); - data_model_iterate_pages(item, NULL, _folder_grid_item_att, NULL); - app_icon_update_folder_icon(item); - return true; + evas_object_show(main_info.conformant); } -static void __homescreen_efl_apply_data_model_to_view(void) +static void __homescreen_efl_create_home_btn(void) { - int page_counter = -1; - Tree_node_t *apps_root = data_model_get_all_apps(); - - if (!apps_root || !apps_root->data || apps_root->data->type != APP_ITEM_ALL_APPS_ROOT) { - LOGE("Can't apply view [apps root]: %d %d", apps_root, apps_root ? apps_root->data : NULL); - return; - } + char edj_path[PATH_MAX] = {0, }; - mvc_badge_refresh_enable = false; + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/home_btn.edj")); - data_model_iterate_pages(NULL, NULL, __homescreen_efl_free_grid_item, NULL); - data_model_iterate_pages(NULL, NULL, _folder_data_model_to_view_apply_cb, NULL); - data_model_iterate_pages(NULL, __homescreen_efl_increment_page, __homescreen_efl_attach_all_apps_grid_item, &page_counter); - all_apps_update_dynamic_index_count(); + main_info.btn_layout = elm_layout_add(main_info.win); + elm_layout_file_set(main_info.btn_layout, edj_path, GROUP_HOME_BTN_LY); + evas_object_size_hint_weight_set(main_info.btn_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(main_info.win, main_info.btn_layout); - mvc_badge_refresh_enable = true; + evas_object_show(main_info.btn_layout); - __badge_change_cb(0, NULL, 0, NULL); + elm_object_signal_callback_add(main_info.btn_layout, SIGNAL_MENU_BTN_CLICKED, SIGNAL_SOURCE, __homescreen_efl_menu_btn_clicked, NULL); + elm_object_signal_callback_add(main_info.btn_layout, SIGNAL_HOME_BTN_CLICKED, SIGNAL_SOURCE, __homescreen_efl_home_btn_clicked, NULL); } -static bool _checked_items_get(Tree_node_t *root, Tree_node_t *item, void *list) -{ - Eina_List **checked_items_list = (Eina_List **)list; - - if (item->data && item->data->is_checked) { - *checked_items_list = eina_list_append(*checked_items_list, item); - item->data->is_checked = false; - } - - return true; -} - -static void __homescreen_efl_chooser_caption_done_button_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +static void __homescreen_efl_menu_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { - /*Folder creation/modification:*/ - app_item_t *destination_folder_data = NULL; - Eina_List *iterator = NULL, *checked_items_list = NULL; - Tree_node_t *item = NULL; - Tree_node_t *destination_folder = folder_panel_get_opened_folder_node(); - - if (!destination_folder) { - destination_folder_data = app_item_create(APP_ITEM_FOLDER, -1, "", NULL, NULL, NULL, NULL, true, 0, 0, 0, 0, NULL); - - if (!destination_folder_data) { - LOGE("caption_done_button_cb: failed to create destination_folder_data"); - return; - } - - destination_folder = data_model_create_folder(destination_folder_data); - - if (!destination_folder) { - LOGE("caption_done_button_cb: failed to create destination_folder"); - folder_panel_cancel_add_icon(); - folder_panel_set_click_ignore_state(false); - app_item_free(destination_folder_data); - return; - } - folder_panel_create(destination_folder); - } - - /*all checked items should be added to the folder:*/ - data_model_iterate(NULL, _checked_items_get, &checked_items_list); - - EINA_LIST_FOREACH(checked_items_list, iterator, item) - data_model_append_node_to_folder(destination_folder, item); - - eina_list_free(checked_items_list); - /*for now they are always sorted:*/ - data_model_sort(NULL); - - folder_panel_cancel_add_icon(); - folder_panel_set_click_ignore_state(false); - - data_model_free_empty_pages(NULL); - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS); - __homescreen_efl_apply_data_model_to_view(); - all_apps_remove_empty_pages(); + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + homescreen_efl_hw_menu_key_release(); } -static void __homescreen_efl_chooser_caption_cancel_button_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +static void __homescreen_efl_home_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { - home_screen_close_all_apps_choose_view(); + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + __homescreen_efl_change_view(); } -static void __homescreen_efl_show_all_apps(void) +static void __homescreen_efl_change_view(void) { - livebox_panel_unset_content(s_info.layout); - all_apps_show(); - - if (!s_info.all_apps) - s_info.all_apps = all_apps_create(s_info.layout, NULL); - - elm_object_part_content_unset(s_info.layout, PART_CONTENT); + if (main_info.animator != NULL) { + LOGE("main_info.animator != NULL"); + return ; + } - evas_object_hide(s_info.all_apps); - evas_object_move(s_info.all_apps, 0, s_info.root_height); + if (main_info.view_type == HOMESCREEN_VIEW_APPS) { + apps_view_hide(); + main_info.animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __homescreen_efl_show_cluster_anim, NULL); - elm_object_signal_emit(s_info.layout, SIGNAL_BLOCK_EVENTS, SIGNAL_SOURCE); - app_icon_set_click_ignore(true); + elm_object_signal_emit(main_info.btn_layout, SIGNAL_HOME_BTN_ICON_HIDE, SIGNAL_SOURCE); + elm_object_signal_emit(main_info.btn_layout, SIGNAL_APPS_BTN_ICON_SHOW, SIGNAL_SOURCE); + main_info.view_type = HOMESCREEN_VIEW_HOME; + } else if (main_info.view_type == HOMESCREEN_VIEW_HOME) { + cluster_view_hide(); + main_info.animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __homescreen_efl_show_apps_anim, NULL); - s_info.animator = ecore_animator_timeline_add(APPS_SHOW_HIDE_ANIMATION_TIME, __homescreen_efl_show_all_apps_anim, NULL); + elm_object_signal_emit(main_info.btn_layout, SIGNAL_APPS_BTN_ICON_HIDE, SIGNAL_SOURCE); + elm_object_signal_emit(main_info.btn_layout, SIGNAL_HOME_BTN_ICON_SHOW, SIGNAL_SOURCE); + main_info.view_type = HOMESCREEN_VIEW_APPS; + } } -static void __homescreen_efl_show_home_view(void) +static Eina_Bool __homescreen_efl_show_apps_anim(void *data, double pos) { - elm_object_part_content_unset(s_info.layout, PART_CONTENT); - all_apps_hide(); - elm_object_signal_emit(s_info.layout, SIGNAL_BOTTOM_BUTTONS_HOME_STATE_SET, SIGNAL_SOURCE); + cluster_view_hide_anim(pos); + apps_view_show_anim(pos); - elm_object_signal_emit(s_info.layout, SIGNAL_BLOCK_EVENTS, SIGNAL_SOURCE); - app_icon_set_click_ignore(true); + if (pos >= (1.0 - (1e-10))) { + apps_view_show(); + main_info.animator = NULL; + return ECORE_CALLBACK_DONE; + } - s_info.animator = ecore_animator_timeline_add(APPS_SHOW_HIDE_ANIMATION_TIME, __homescreen_efl_show_home_anim, NULL); + return ECORE_CALLBACK_RENEW; } -static bool __update_all_badges_count(Tree_node_t *parent, Tree_node_t *node, void *data) +static Eina_Bool __homescreen_efl_show_cluster_anim(void *data, double pos) { - app_item_t *item = NULL; + apps_view_hide_anim(pos); + cluster_view_show_anim(pos); - if (node) { - item = node->data; - __homescreen_efl_badge_count_update_cb(item); - } + if (pos >= (1.0 - (1e-10))) { + cluster_view_show(); + main_info.animator = NULL; + return ECORE_CALLBACK_DONE; + } - return true; -} - -static void __badge_change_cb(unsigned int action, const char *app_id, unsigned int count, void *user_data) -{ - data_model_iterate(NULL, __update_all_badges_count, NULL); + return ECORE_CALLBACK_RENEW; } -static bool __homescreen_efl_update_icon_badge(Tree_node_t *parent, Tree_node_t *node, void *data) +Evas_Object *homescreen_efl_get_win(void) { - app_item_t *app = (app_item_t *)data; - - if (!folder_count_pending && app != node->data) - return true; - - if (!folder_count_pending && app == node->data) { - folder_count_pending = true; - data_model_iterate(node, __homescreen_efl_update_icon_badge, app); - folder_count_pending = false; - } - - if (folder_count_pending && node->data->type == APP_ITEM_ICON) { - app_mgr_app_get_badge_count(node->data->appid, &node->data->badge_count); - folder_badge_counter += node->data->badge_count; - } - - if (!folder_count_pending && app == node->data) - return false; - - return true; + return main_info.win; } -static void __homescreen_efl_badge_count_update_cb(void *app_item) +void homescreen_efl_hw_menu_key_release(void) { - app_item_t *app = (app_item_t *)app_item; - - if (!mvc_badge_refresh_enable) - return; - - if (!app) { - LOGE("badge_count_update_cb: app_item is NULL"); - return; - } - - if (app->type == APP_ITEM_ICON && !app_mgr_app_get_badge_count(app->appid, &app->badge_count)) { - LOGE("badge_count_update_cb: get_badge_count returned error"); - return; - } - - if (app->type == APP_ITEM_FOLDER) { - folder_count_pending = false; - folder_badge_counter = 0; - data_model_iterate(NULL, __homescreen_efl_update_icon_badge, app); - app->badge_count = folder_badge_counter; - } - - app_icon_show_badge(app->layout, app->badge_count); + if (main_info.view_type == HOMESCREEN_VIEW_HOME) { + cluster_view_hw_menu_key(); + } else if (main_info.view_type == HOMESCREEN_VIEW_APPS) { + apps_view_hw_menu_key(); + } } -static void __homescreen_efl_home_bg_changed_cb(system_settings_key_e key, void *data) +void homescreen_efl_hw_home_key_release(void) { - char *buf = NULL; - int ret = -1; - - if (!s_info.bg) { - LOGE("[FAILED][bg=NULL]"); - return; - } - - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf); - if (!buf || ret != SYSTEM_SETTINGS_ERROR_NONE || !ecore_file_exists(buf) - || !ecore_file_can_read(buf)) { - LOGE("[FAILED][failed to get bg path]"); - return; - } - - evas_object_image_file_set(s_info.bg, buf, "bg"); - free(buf); - - __homescreen_efl_make_gradient_bg(); + if (main_info.view_type == HOMESCREEN_VIEW_HOME) { + if (cluster_view_hw_home_key() == false) { + __homescreen_efl_change_view(); + } + } else if (main_info.view_type == HOMESCREEN_VIEW_APPS) { + if (apps_view_hw_home_key() == false) { + __homescreen_efl_change_view(); + } + } } -static void __homescreen_efl_apply_home_bg_effect(bool is_on) +void homescreen_efl_hw_back_key_release(void) { - #ifndef HOME_HOME_SCREEN_BLUR_ENABLED - return; - #endif - char *buf = NULL; - - /*source data and destination data (pixel values)*/ - uint32_t *src = NULL, *dst = NULL; - - /*values of channels in each pixel*/ - uint32_t A = 0, R = 0, G = 0, B = 0; - - /*helper variables*/ - uint32_t *s = NULL, *d = NULL, w = 0, p = 0; - - int width = -1, height = -1; - - /*iterators*/ - int i = 0, j = 0, k = 0; - - /*kernel used for transform the image*/ - uint8_t kernel[25]; - const int size = COUNT_OF(kernel); - const int half = size / 2; - - int ret = -1; - - if (!s_info.bg) { - LOGE("[FAILED][bg=NULL]"); - return; - } - - /*if is_on == false, then restore original image data*/ - if (!is_on) { - /*restore original data and return;*/ - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf); - if (!buf || ret != SYSTEM_SETTINGS_ERROR_NONE || !ecore_file_exists(buf) - || !ecore_file_can_read(buf)) { - - LOGE("[FAILED][failed to get bg path]"); - return; - } - - evas_object_image_file_set(s_info.bg, buf, "bg"); - free(buf); - s_info.is_bg_blurred = false; - return; - } - - evas_object_image_size_get(s_info.bg, &width, &height); - src = evas_object_image_data_get(s_info.bg, EINA_TRUE); - - /*if image is already blurred then we should not perform once again*/ - if (s_info.is_bg_blurred) - return; - - dst = (uint32_t *) alloca(sizeof(uint32_t) * width * height); - if (!dst) { - LOGE("[FAILED][dst=NULL]"); - return; - } - - /*Fill the kernel*/ - w = 0; - for (i = 0; i < size; i++) { - double f = i - half; - w += kernel[i] = exp(-f * f / 60.0) * 40; - } - - /*Apply modifications from src - > dst*/ - for (i = 0; i < height; i++) { - s = (uint32_t *) (src + i * width); - d = (uint32_t *) (dst + i * width); - - for (j = 0; j < width; j++) { - A = R = G = B = 0; - for (k = 0; k < size; k++) { - if (j - half + k < 0 || j - half + k >= width) { - d[j] = s[j]; - continue; - } - - p = s[j - half + k]; - - A = (p & 0xff000000); - R += ((p >> 16) & 0xff) * kernel[k]; - G += ((p >> 8) & 0xff) * kernel[k]; - B += ((p >> 0) & 0xff) * kernel[k]; - } - d[j] = A | (((uint32_t)(R / w)) << 16) | (((uint32_t)(G / w)) << 8) | ((uint32_t)(B / w)); - } - } - - /*Apply modification from dst -> srcs*/ - for (i = 0; i < height; i++) { - s = (uint32_t *) (dst + i * width); - d = (uint32_t *) (src + i * width); - for (j = 0; j < width; j++) { - A = R = G = B = 0; - for (k = 0; k < size; k++) { - if (i - half + k < 0 || i - half + k >= height) { - d[j] = s[j]; - continue; - } - - s = (uint32_t *) (dst + (i - half + k) * width); - p = s[j]; - - A = (p & 0xff000000); - R += ((p >> 16) & 0xff) * kernel[k]; - G += ((p >> 8) & 0xff) * kernel[k]; - B += ((p >> 0) & 0xff) * kernel[k]; - } - d[j] = A | (((uint32_t)(R / w)) << 16) | (((uint32_t)(G / w)) << 8) | ((uint32_t)(B / w)); - } - } - - s_info.is_bg_blurred = true; - evas_object_image_data_update_add(s_info.bg, 0, 0, width, height); + if (main_info.view_type == HOMESCREEN_VIEW_HOME) { + if (cluster_view_hw_back_key() == false) { + __homescreen_efl_change_view(); + } + } else if (main_info.view_type == HOMESCREEN_VIEW_APPS) { + if (apps_view_hw_back_key() == false) { + __homescreen_efl_change_view(); + } + } } -static Eina_Bool __homescreen_efl_show_all_apps_anim(void *data, double pos) +void homescreen_efl_btn_show(homescreen_view_t view_t) { - Evas_Object *box = elm_object_content_get(s_info.all_apps); - - evas_object_show(s_info.all_apps); - evas_object_move(s_info.all_apps, 0, (1.0 - pos) * ALL_APPS_ANIMATION_DELTA_Y); - evas_object_move(s_info.home, 0, -pos * ALL_APPS_ANIMATION_HOME_DELTA_Y); - - evas_object_color_set(box, 255, 255, 255, pos*(double)255); - - if (pos >= 0.99) { - elm_object_part_content_set(s_info.layout, PART_CONTENT, s_info.all_apps); - all_apps_show(); - elm_object_signal_emit(s_info.layout, SIGNAL_UNBLOCK_EVENTS, SIGNAL_SOURCE); - s_info.animator = NULL; - return ECORE_CALLBACK_DONE; - } - - return ECORE_CALLBACK_RENEW; + LOGD("state %d", view_t); + switch (view_t) { + case HOMESCREEN_VIEW_HOME: + elm_object_signal_emit(main_info.btn_layout, SIGNAL_BTN_SHOW_HOME_STATE, SIGNAL_SOURCE); + break; + case HOMESCREEN_VIEW_APPS: + elm_object_signal_emit(main_info.btn_layout, SIGNAL_BTN_SHOW_APPS_STATE, SIGNAL_SOURCE); + break; + default: + break; + } } -static Eina_Bool __homescreen_efl_show_home_anim(void *data, double pos) +void homescreen_efl_btn_hide(homescreen_view_t view_t) { - Evas_Object *box = elm_object_content_get(s_info.all_apps); - - evas_object_move(s_info.all_apps, 0, pos * ALL_APPS_ANIMATION_DELTA_Y); - evas_object_move(s_info.home, 0, -(1.0 - pos ) * ALL_APPS_ANIMATION_HOME_DELTA_Y); - - evas_object_color_set(box, 255, 255, 255, (1.0 - pos * 2.0)*(double)255); - - if (pos >= 0.99) { - if (s_info.layout && elm_object_part_content_get(s_info.layout, PART_CONTENT) == NULL && s_info.home) { - elm_object_part_content_set(s_info.layout, PART_CONTENT, s_info.home); - livebox_panel_set_content(s_info.layout); - } - - elm_object_signal_emit(s_info.layout, SIGNAL_UNBLOCK_EVENTS, SIGNAL_SOURCE); - s_info.animator = NULL; - return ECORE_CALLBACK_DONE; - } - - return ECORE_CALLBACK_RENEW; + LOGD("state %d", view_t); + switch (view_t) { + case HOMESCREEN_VIEW_HOME: + elm_object_signal_emit(main_info.btn_layout, SIGNAL_BTN_HIDE_HOME_STATE, SIGNAL_SOURCE); + break; + case HOMESCREEN_VIEW_APPS: + elm_object_signal_emit(main_info.btn_layout, SIGNAL_BTN_HIDE_APPS_STATE, SIGNAL_SOURCE); + break; + default: + break; + } } diff --git a/src/hw_key.c b/src/hw_key.c new file mode 100755 index 0000000..7ff7ab0 --- /dev/null +++ b/src/hw_key.c @@ -0,0 +1,134 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "hw_key.h" +#include "util.h" +#include "conf.h" +#include "homescreen-efl.h" +#include "menu.h" + +#define KEY_HOME "XF86Home" +#define KEY_MENU "XF86Menu" +#define KEY_BACK "XF86Back" +#define KEY_RETURN "Return" + +typedef enum { + HW_KEY_NONE = -1, + HW_KEY_BACK, + HW_KEY_HOME, + HW_KEY_MENU, +} hw_key_t; + +static struct { + Eina_Bool pressed; + Ecore_Event_Handler *press_handler; + Ecore_Event_Handler *release_handler; + Eina_Bool register_handler; +} hw_key_info = { + .pressed = EINA_FALSE, + .press_handler = NULL, + .release_handler = NULL, + .register_handler = EINA_FALSE +}; + +static Eina_Bool __hw_key_release_cb(void *data, int type, void *event); +static Eina_Bool __hw_key_press_cb(void *data, int type, void *event); + +void hw_key_register(void) +{ + if (!hw_key_info.release_handler) { + hw_key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __hw_key_release_cb, NULL); + if (!hw_key_info.release_handler) + LOGE("Failed to register a key up event handler"); + } + + if (!hw_key_info.press_handler) { + hw_key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __hw_key_press_cb, NULL); + if (!hw_key_info.press_handler) + LOGE("Failed to register a key down event handler"); + } + + hw_key_info.pressed = EINA_FALSE; + hw_key_info.register_handler = EINA_TRUE; +} + +void hw_key_unregister(void) +{ + if (hw_key_info.release_handler) { + ecore_event_handler_del(hw_key_info.release_handler); + hw_key_info.release_handler = NULL; + } + + if (hw_key_info.press_handler) { + ecore_event_handler_del(hw_key_info.press_handler); + hw_key_info.press_handler = NULL; + } + + hw_key_info.register_handler = EINA_FALSE; +} + +static Eina_Bool __hw_key_press_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Down *ev = event; + + if (!hw_key_info.register_handler || !ev) + return ECORE_CALLBACK_RENEW; + + hw_key_info.pressed = EINA_TRUE; + + return ECORE_CALLBACK_RENEW; +} + + +static Eina_Bool __hw_key_release_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Up *ev = event; + + if (!hw_key_info.register_handler || !ev) + return ECORE_CALLBACK_RENEW; + + LOGD("Key(%s) released %d", ev->keyname, hw_key_info.pressed); + + if (hw_key_info.pressed == EINA_FALSE) + return ECORE_CALLBACK_RENEW; + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (menu_is_show()) { + menu_hide(); + } else { + homescreen_efl_hw_back_key_release(); + } + } else if (!strcmp(ev->keyname, KEY_MENU)) { + homescreen_efl_hw_menu_key_release(); + } else if (!strcmp(ev->keyname, KEY_HOME)) { + if (menu_is_show()) { + menu_hide(); + } + homescreen_efl_hw_home_key_release(); + } else { + hw_key_info.pressed = EINA_FALSE; + + return ECORE_CALLBACK_RENEW; + } + + hw_key_info.pressed = EINA_FALSE; + + return ECORE_CALLBACK_RENEW; +} diff --git a/src/key.c b/src/key.c deleted file mode 100644 index 372f536..0000000 --- a/src/key.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include "homescreen-efl.h" -#include "option_menu.h" -#include "add_viewer/add_viewer.h" -#include "livebox/livebox_panel.h" -#include "livebox_all_pages.h" -#include "folder_panel.h" -#include "popup.h" -#include "util.h" - -static Eina_Bool __key_release_cb(void *data, int type, void *event); -static Eina_Bool __key_press_cb(void *data, int type, void *event); - -typedef enum { - HW_KEY_NONE = -1, - HW_KEY_BACK, - HW_KEY_HOME, - HW_KEY_MENU, -} hw_key_t; - -static struct { - Eina_Bool pressed; - Ecore_Event_Handler *press_handler; - Ecore_Event_Handler *release_handler; - Eina_Bool register_handler; -} key_info_s = { - .pressed = EINA_FALSE, - .press_handler = NULL, - .release_handler = NULL, - .register_handler = EINA_FALSE -}; - - -HAPI void key_register(void) -{ - if (!key_info_s.release_handler) { - key_info_s.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __key_release_cb, NULL); - if (!key_info_s.release_handler) - LOGE("Failed to register a key up event handler"); - } - - if (!key_info_s.press_handler) { - key_info_s.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __key_press_cb, NULL); - if (!key_info_s.press_handler) - LOGE("Failed to register a key down event handler"); - } - - key_info_s.pressed = EINA_FALSE; - key_info_s.register_handler = EINA_TRUE; -} - - -HAPI void key_unregister(void) -{ - if (key_info_s.release_handler) { - ecore_event_handler_del(key_info_s.release_handler); - key_info_s.release_handler = NULL; - } - - if (key_info_s.press_handler) { - ecore_event_handler_del(key_info_s.press_handler); - key_info_s.press_handler = NULL; - } - - key_info_s.register_handler = EINA_FALSE; -} - - -static Eina_Bool __key_press_cb(void *data, int type, void *event) -{ - Evas_Event_Key_Down *ev = event; - - if (!key_info_s.register_handler || !ev) - return ECORE_CALLBACK_RENEW; - - key_info_s.pressed = EINA_TRUE; - - return ECORE_CALLBACK_RENEW; -} - - -static Eina_Bool __key_release_cb(void *data, int type, void *event) -{ - Evas_Event_Key_Up *ev = event; - hw_key_t pressed_key = HW_KEY_NONE; - - if (!key_info_s.register_handler || !ev) - return ECORE_CALLBACK_RENEW; - - LOGD("Key(%s) released %d", ev->keyname, key_info_s.pressed); - - if (key_info_s.pressed == EINA_FALSE) - return ECORE_CALLBACK_RENEW; - - if (!strcmp(ev->keyname, KEY_BACK)) - pressed_key = HW_KEY_BACK; - else if (!strcmp(ev->keyname, KEY_MENU)) - pressed_key = HW_KEY_MENU; - else if(!strcmp(ev->keyname, KEY_HOME)) - pressed_key = HW_KEY_HOME; - else { - key_info_s.pressed = EINA_FALSE; - - return ECORE_CALLBACK_RENEW; - } - - if (pressed_key == HW_KEY_MENU) { - LOGD("Menu pressed"); - option_menu_change_state_on_hw_menu_key(); - - return ECORE_CALLBACK_RENEW; - } - - homescreen_view_t view_t = home_screen_get_view_type(); - - if (pressed_key == HW_KEY_BACK || pressed_key == HW_KEY_HOME) { - - option_menu_hide(); - if (popup_destroy()) { - /*we need to close only popup if it is visible. Dont change the view type.*/ - return ECORE_CALLBACK_RENEW; - } - - if (folder_panel_is_folder_visible()) { - folder_panel_close_folder(); - return ECORE_CALLBACK_RENEW; - } - - switch (view_t) { - case HOMESCREEN_VIEW_HOME: - break; - case HOMESCREEN_VIEW_HOME_EDIT: - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - /*TODO: option menu should not have any info about livebox panel. This logic should be invoked in homescreen-efl.c*/ - livebox_panel_set_edit_mode_layout(false); - livebox_panel_change_edit_mode_state(true); - break; - case HOMESCREEN_VIEW_HOME_ADD_VIEWER: - add_viewer_window_delete(); - break; - case HOMESCREEN_VIEW_HOME_ALL_PAGES: - /*TODO: this should be invoked in homescreen-efl.c*/ - livebox_all_pages_hide(); - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - break; - case HOMESCREEN_VIEW_ALL_APPS: - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - break; - case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: - home_screen_close_all_apps_choose_view(); - if (pressed_key == HW_KEY_HOME) - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - break; - case HOMESCREEN_VIEW_ALL_APPS_EDIT: - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS); - if(pressed_key == HW_KEY_HOME) - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - break; - case HOMESCREEN_VIEW_UNKNOWN: - break; - default: - break; - } - } - - if (!strcmp(ev->keyname, KEY_RETURN)) - folder_panel_hide_input_panel(); - - - key_info_s.pressed = EINA_FALSE; - - return ECORE_CALLBACK_RENEW; -} - - diff --git a/src/livebox/grid_item_resize.c b/src/livebox/grid_item_resize.c deleted file mode 100644 index c923c4b..0000000 --- a/src/livebox/grid_item_resize.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "livebox/grid_item_resize.h" -#include "homescreen-efl.h" -#include "layout.h" -#include "livebox/livebox_panel.h" -#include "livebox/livebox_widget.h" -#include "page_scroller.h" -#include "conf.h" -#include "data_model.h" - -typedef enum { - GRID_RESIZE_LEFT, - GRID_RESIZE_RIGHT, - GRID_RESIZE_UP, - GRID_RESIZE_DOWN, -} gird_item_resize_dir_t; - -static struct { - int x_at_drag_start; - int y_at_drag_start; - int w_at_drag_start; - int h_at_drag_start; - Eina_Bool is_resizing; -} s_info = { - .x_at_drag_start = 0, - .y_at_drag_start = 0, - .w_at_drag_start = 0, - .h_at_drag_start = 0, - .is_resizing = false -}; - -static void __gird_item_resize_button_pressed_cb(void *data, Evas_Object *obj, - const char *emission, const char *source); -static int __grid_item_resize_drag_pos_get(Evas_Object *obj, const char *part, - Eina_Bool is_horizontal); -static void __grid_item_resize_finalize(Evas_Object *obj); -static Eina_Bool __grid_item_resize_get_available_sizes(Evas_Object *livebox, int w, int h); -static void __grid_item_resize_drag(Evas_Object *livebox, int new_x, int new_y, int new_w, - int new_h); -static void __grid_item_resize_drag_stop_cb(void *data, Evas_Object *obj, const char *emission, - const char *source); -static void __grid_item_resize_get_sliders_geometry(Evas_Object *page, int *out_x, - int *out_y, int *out_w, int *out_h); -static void __grid_item_resize_drag_cb(void *data, Evas_Object *obj, const char *emission, - const char *source); -static void __grid_item_resize_page_background_clicked_cb(void *data, Evas_Object *obj, - const char *emission, const char *source); - -#ifdef LIVEBOX_RESIZE_ENABLED - static void __grid_item_resize_set_slider_pos(Evas_Object *page, const char *part, - int pos, Eina_Bool is_horizontal); -#endif - - -void grid_item_set_resize_livebox_sliders(Evas_Object *livebox, - Evas_Object *page) -{ -#ifdef LIVEBOX_RESIZE_ENABLED - Evas_Coord x = -1; - Evas_Coord y = -1; - Evas_Coord w = -1; - Evas_Coord h = -1; - - if (!page) { - LOGE("page == NULL"); - return; - } - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - elm_grid_pack_get(livebox, &x, &y, &w, &h); - LOGD("LIVEBOX NEW POS: %d %d %d %d", x, y, w, h); - - __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_UP, y, EINA_FALSE); - __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_DOWN, y + h, EINA_FALSE); - __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_LEFT, x, EINA_TRUE); - __grid_item_resize_set_slider_pos(page, PART_RESIZE_BUTTON_RIGHT, x + w, EINA_TRUE); - - elm_layout_signal_emit(page, SIGNAL_RESIZE_SLIDERS_SHOW, - SIGNAL_LIVEBOX_SOURCE); - -#endif -} - -bool grid_item_init_resize_callbacks(Evas_Object *livebox_container_scroller, - Evas_Object *livebox_container) -{ - Evas_Object *edje = NULL; - - if (!livebox_container_scroller) { - LOGE("livebox_container_scroller == NULL"); - return false; - } - - if (!livebox_container) { - LOGE("livebox_container == NULL"); - return false; - } - - edje = elm_layout_edje_get(livebox_container); - if (!edje) { - LOGE("edje == NULL"); - return false; - } - - edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN, - PART_RESIZE_BUTTON_DOWN, __gird_item_resize_button_pressed_cb, - livebox_container_scroller); - edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN, - PART_RESIZE_BUTTON_LEFT, __gird_item_resize_button_pressed_cb, - livebox_container_scroller); - edje_object_signal_callback_add(edje, SIGNAL_MOUSE_DOWN, - PART_RESIZE_BUTTON_UP, __gird_item_resize_button_pressed_cb, - livebox_container_scroller); - edje_object_signal_callback_add(edje, - SIGNAL_MOUSE_DOWN, PART_RESIZE_BUTTON_RIGHT, - __gird_item_resize_button_pressed_cb, livebox_container_scroller); - edje_object_part_drag_value_set(edje, - PART_RESIZE_BUTTON_DOWN, 0.0, 0.999); - edje_object_part_drag_value_set(edje, - PART_RESIZE_BUTTON_UP, 0.0, 0.001); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZING, PART_RESIZE_BUTTON_DOWN, - __grid_item_resize_drag_cb, livebox_container); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_DOWN, - __grid_item_resize_drag_stop_cb, NULL); - edje_object_signal_callback_add(edje, SIGNAL_RESIZING, - PART_RESIZE_BUTTON_UP, __grid_item_resize_drag_cb, livebox_container); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_UP, __grid_item_resize_drag_stop_cb, NULL); - edje_object_part_drag_value_set(edje, - PART_RESIZE_BUTTON_LEFT, 0.001, 0.0); - edje_object_part_drag_value_set(edje, - PART_RESIZE_BUTTON_RIGHT, 0.999, 0.0); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZING, PART_RESIZE_BUTTON_LEFT, __grid_item_resize_drag_cb, - livebox_container); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_LEFT, - __grid_item_resize_drag_stop_cb, NULL); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZING, PART_RESIZE_BUTTON_RIGHT, - __grid_item_resize_drag_cb, livebox_container); - edje_object_signal_callback_add(edje, - SIGNAL_RESIZE_END, PART_RESIZE_BUTTON_RIGHT, - __grid_item_resize_drag_stop_cb, NULL); - - elm_layout_signal_callback_add(livebox_container, SIGNAL_CLICKED, - PART_PAGE_BG, __grid_item_resize_page_background_clicked_cb, NULL); - - return true; -} - -void grid_item_set_resize_sliders_visibility(Evas_Object *page, bool visible) -{ - if (!page) { - LOGE("page == NULL"); - return; - } - - if (visible) { - elm_object_signal_emit(page, SIGNAL_RESIZE_SLIDERS_SHOW, - SIGNAL_LIVEBOX_SOURCE); - } else { - elm_object_signal_emit(page, SIGNAL_RESIZE_SLIDERS_HIDE, - SIGNAL_LIVEBOX_SOURCE); - } -} - -static void __gird_item_resize_button_pressed_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - Evas_Object *livebox = NULL; - Evas_Object *livebox_scroller = NULL; - - if (!obj || !emission || !source) { - LOGE("Wrong arguments provided: %p %p %p", obj, - emission, source); - return; - } - - livebox_scroller = data; - if (!livebox_scroller) { - LOGE("livebox_scroller == NULL"); - return; - - } - - page_scroller_freeze(livebox_scroller); - - livebox = livebox_utils_selected_livebox_get(); - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - elm_grid_pack_get(livebox, &s_info.x_at_drag_start, - &s_info.y_at_drag_start, - &s_info.w_at_drag_start, - &s_info.h_at_drag_start); - - s_info.is_resizing = EINA_TRUE; - - LOGD("BUTTON PRESSED: %p !!! x = %d; y = %d; w = %d; h = %d", livebox, - s_info.x_at_drag_start, - s_info.y_at_drag_start, - s_info.w_at_drag_start, - s_info.h_at_drag_start); -} - -static int __grid_item_resize_drag_pos_get(Evas_Object *obj, const char *part, - Eina_Bool is_horizontal) -{ - double val; - int pos; - - if (!obj || !part) { - LOGE("Wrong arguments provided: %p %p", obj, part); - return -1; - } - - if (is_horizontal) { - edje_object_part_drag_value_get(obj, part, &val, NULL); - pos = (int)(val * LIVEBOX_GRID_COLUMNS); - } else { - edje_object_part_drag_value_get(obj, part, NULL, &val); - pos = (int)(val * LIVEBOX_GRID_ROWS); - } - - - LOGD("DRAG UP STOP: %f POS: %d", val, pos); - return pos; -} - - -static void __grid_item_resize_finalize(Evas_Object *obj) -{ - LOGD("Resize"); - Evas_Object *lb_scroller = NULL; - if (!obj) { - LOGE("o == NULL"); - return; - } - - edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_OK, - SIGNAL_RESIZE_SLIDER_DRAG_OK); - - s_info.is_resizing = EINA_FALSE; - - lb_scroller = livebox_panel_get(); - if (!lb_scroller) { - LOGE("lb_scroller == NULL"); - return; - } - - page_scroller_unfreeze(lb_scroller); -} - -static Eina_Bool __grid_item_resize_get_available_sizes(Evas_Object *livebox, int w, int h) -{ - int cnt = 0; - int *size_list = NULL; - Evas_Object *widget = NULL; - int test_h = 0; - int test_w = 0; - int i = 0; - - if (!livebox) { - LOGE("livebox == NULL"); - return EINA_FALSE; - } - - widget = elm_layout_content_get(livebox, PART_LIVEBOX); - if (!widget) { - LOGE("widget == NULL"); - return EINA_FALSE; - } - - livebox_widget_get_size_available(widget, &cnt, &size_list); - - LOGD("Size count: %d", cnt); - - if (!size_list) { - LOGE("size_list == NULL"); - return EINA_FALSE; - } - - for (i = 0; i < cnt; ++i) { - livebox_widget_get_dimensions(size_list[i], &test_w, &test_h); - - if (w == test_w * LIVEBOX_GRID_ROWS_CELLS_MULTI && - h == test_h * LIVEBOX_GRID_ROWS_CELLS_MULTI) { - LOGD("RESIZE AVAILABLE SIZE FOUND: %d %d", - test_w, test_h); - free(size_list); - return EINA_TRUE; - } - } - - free(size_list); - return EINA_FALSE; -} - - -static void __grid_item_resize_drag(Evas_Object *livebox, - int new_x, int new_y, int new_w, int new_h) -{ - LOGD("resize2"); - Evas_Object *page = NULL; - Eina_Rectangle *rect = NULL; - Eina_List *list; - int out_x = -1, out_y = -1, out_w = -1, out_h = -1; - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - page = livebox_utils_get_selected_livebox_layout(); - if (!page) { - LOGE("page == NULL"); - return; - } - - list = livebox_utils_get_liveboxes_on_page_list(page); - if (!list) { - LOGE("list == NULL"); - return; - - } - - __grid_item_resize_get_sliders_geometry(page, &out_x, &out_y, &out_w, &out_h); - rect = eina_rectangle_new(out_x, out_y, out_w, out_h); - - if (__grid_item_resize_get_available_sizes(livebox, new_w, new_h) && - !livebox_utils_check_rect_list_grid_interesction(rect, - livebox, list)) { - elm_grid_pack_set(livebox, new_x, new_y, new_w, new_h); - LOGD("RESIZE OK: %d %d %d %d", new_x, new_y, new_w, new_h); - } else { - elm_grid_pack_set(livebox, s_info.x_at_drag_start, - s_info.y_at_drag_start, - s_info.w_at_drag_start, - s_info.h_at_drag_start); - LOGD("RESIZE FAIL: %d %d %d %d; ", new_x, new_y, new_w, new_h); - } - - eina_rectangle_free(rect); -} - -static void _drag_size_new_get(gird_item_resize_dir_t dir, Evas_Object *livebox, - int pos, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) -{ - Evas_Coord x2, y2; - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (!x || !y || !w || !h) { /*Other arguments can be NULL*/ - LOGE("Wrong arguments: x = %p; y = %p; w = %p; h = %p", - x, y, w, h); - return; - } - - elm_grid_pack_get(livebox, x, y, w, h); - - switch (dir) { - case GRID_RESIZE_LEFT: - x2 = *x + *w; - *w = x2 - (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI); - *x = (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI); - break; - case GRID_RESIZE_RIGHT: - *w = (pos - *x) * LIVEBOX_GRID_ROWS_CELLS_MULTI; - break; - case GRID_RESIZE_UP: - y2 = *y + *h; - *h = y2 - (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI); - *y = (pos * LIVEBOX_GRID_ROWS_CELLS_MULTI); - break; - case GRID_RESIZE_DOWN: - *h = (pos - *y) * LIVEBOX_GRID_ROWS_CELLS_MULTI; - break; - } -} - -static void __grid_item_resize_drag_stop_cb(void *data, Evas_Object *obj, const char *emission, - const char *source) -{ - int pos = -1; - Evas_Coord x = -1; - Evas_Coord y = -1; - Evas_Coord w = -1; - Evas_Coord h = -1; - Evas_Object *livebox = NULL; - Tree_node_t *item_node = NULL; - gird_item_resize_dir_t resize_dir; - bool horizontal = false; - - - if (!obj || !emission || !source) { - LOGE("Wrong arguments provided: %p %p %p", - obj, emission, source); - return; - } - - livebox = livebox_utils_selected_livebox_get(); - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - __grid_item_resize_finalize(obj); - - if (!strncmp(PART_RESIZE_BUTTON_DOWN, source, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - horizontal = EINA_FALSE; - resize_dir = GRID_RESIZE_DOWN; - } else if (!strncmp(PART_RESIZE_BUTTON_UP, source, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - horizontal = EINA_FALSE; - resize_dir = GRID_RESIZE_UP; - } else if (!strncmp(PART_RESIZE_BUTTON_LEFT, source, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - horizontal = EINA_TRUE; - resize_dir = GRID_RESIZE_LEFT; - } else if (!strncmp(PART_RESIZE_BUTTON_RIGHT, source, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - horizontal = EINA_TRUE; - resize_dir = GRID_RESIZE_RIGHT; - } else { - LOGE("UNKNOWN PART"); - return; - } - - pos = __grid_item_resize_drag_pos_get(obj, source, horizontal); - _drag_size_new_get(resize_dir, livebox, pos, &x, &y, &w, &h); - - __grid_item_resize_drag(livebox, x, y, w, h); - elm_grid_pack_get(livebox, &x, &y, &w, &h); - - edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_DOWN, 0, - (y + h) * LIVEBOX_RESIZE_POS_MULTI_ROWS); - - edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_UP, 0, - (float) y * LIVEBOX_RESIZE_POS_MULTI_ROWS); - - edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_LEFT, - (float) x * LIVEBOX_RESIZE_POS_MULTI_COLS, 0); - - edje_object_part_drag_value_set(obj, PART_RESIZE_BUTTON_RIGHT, - (float) (x + w) * LIVEBOX_RESIZE_POS_MULTI_COLS, 0); - - item_node = evas_object_data_get(livebox, KEY_ICON_DATA); - if (!item_node) { - LOGE("item_node == NULL"); - return; - } - - data_model_resize_widget(item_node, x, y, w, h); - home_screen_print_tree(); -} - -static void __grid_item_resize_get_sliders_geometry(Evas_Object *page, int *out_x, - int *out_y, int *out_w, int *out_h) -{ - Evas_Object *edje = elm_layout_edje_get(page); - Evas_Object *grid = NULL; - double val = 0; - - if (!edje) { - LOGE("edje == NULL"); - return; - } - - grid = edje_object_part_swallow_get(edje, SIGNAL_CONTENT_SOURCE); - if (!grid) { - LOGE("grid == NULL"); - return; - } - - if (!out_x || !out_y || !out_w || !out_h) { - LOGE("x = %p; y = %p; w = %p; h = %p", - out_x, out_y, out_w, out_h); - return; - } - - edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_LEFT, - &val, NULL); - *out_x = round(val * LIVEBOX_TOTAL_COLUMNS); - - edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_UP, - NULL, &val); - *out_y = round(val * LIVEBOX_TOTAL_ROWS); - - edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_RIGHT, - &val, NULL); - *out_w = round(val * LIVEBOX_TOTAL_COLUMNS - *out_x); - - edje_object_part_drag_value_get(edje, PART_RESIZE_BUTTON_DOWN, - NULL, &val); - *out_h = round(val * LIVEBOX_TOTAL_ROWS - *out_y); -} - -static void __grid_item_resize_drag_cb(void *data, Evas_Object *obj, const char *emission, - const char *source) -{ - int pos = -1; - Evas_Coord x = -1; - Evas_Coord y = -1; - Evas_Coord w = -1; - Evas_Coord h = -1; - Evas_Object *livebox = NULL; - Eina_List *list = NULL; - Eina_Rectangle *rect; - int out_x = -1, out_y = -1, out_w = -1, out_h = -1; - - Evas_Object *page_container = data; - if (!page_container) { - LOGE("page_container == NULL"); - return; - } - - if (!obj || !emission || !source) { - LOGE("Wrong arguments provided: obj == %p; \ - emission == %p; source == %p", obj, emission, source); - return; - } - - livebox = livebox_utils_selected_livebox_get(); - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - list = livebox_utils_get_liveboxes_on_page_list(page_container); - if (!list) { - LOGE("list == NULL"); - return; - - } - - if (!strncmp(source, PART_RESIZE_BUTTON_DOWN, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - pos = __grid_item_resize_drag_pos_get(obj, source, EINA_FALSE); - _drag_size_new_get(GRID_RESIZE_DOWN, livebox, pos, - &x, &y, &w, &h); - - LOGD("pos = %d", pos); - } else if (!strncmp(source, PART_RESIZE_BUTTON_UP, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - pos = __grid_item_resize_drag_pos_get(obj, source, EINA_FALSE); - _drag_size_new_get(GRID_RESIZE_UP, livebox, - pos, &x, &y, &w, &h); - - LOGD("pos = %d", pos); - } else if (!strncmp(source, PART_RESIZE_BUTTON_LEFT, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - pos = __grid_item_resize_drag_pos_get(obj, source, EINA_TRUE); - _drag_size_new_get(GRID_RESIZE_LEFT, livebox, - pos, &x, &y, &w, &h); - } else if (!strncmp(source, PART_RESIZE_BUTTON_RIGHT, - LIVEBOX_MAX_BUTTON_NAME_LENGTH)) { - pos = __grid_item_resize_drag_pos_get(obj, source, EINA_TRUE); - _drag_size_new_get(GRID_RESIZE_RIGHT, livebox, - pos, &x, &y, &w, &h); - } else { - pos = 0; - } - - __grid_item_resize_get_sliders_geometry(page_container, &out_x, - &out_y, &out_w, &out_h); - rect = eina_rectangle_new(out_x, out_y, out_w, out_h); - - if (!__grid_item_resize_get_available_sizes(livebox, w, h) || - livebox_utils_check_rect_list_grid_interesction(rect, - livebox, list)) { - edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_ERR, - SIGNAL_LIVEBOX_SOURCE); - } else { - edje_object_signal_emit(obj, SIGNAL_RESIZE_SLIDER_DRAG_OK, - SIGNAL_LIVEBOX_SOURCE); - } - - eina_rectangle_free(rect); -} - -#ifdef LIVEBOX_RESIZE_ENABLED -static void __grid_item_resize_set_slider_pos(Evas_Object *page, const char *part, - int pos, Eina_Bool is_horizontal) -{ - Evas_Object *edje = NULL; - - if (!page) { - LOGE("page == NULL"); - return; - } - - edje = elm_layout_edje_get(page); - if (!edje) { - LOGE("page == NULL"); - return; - } - - if (!part) { - LOGE("part == NULL"); - return; - } - - if (is_horizontal) { - if (pos < 0 || pos > LIVEBOX_TOTAL_COLUMNS) { - LOGE("Wrong value of pos = %d", pos); - return; - } - - LOGD("NEW POS OF %s is %f", part, - (float)pos / LIVEBOX_TOTAL_COLUMNS); - edje_object_part_drag_value_set(edje, part, - (float)pos / LIVEBOX_TOTAL_COLUMNS, 0); - } else { - if (pos < 0 || pos > LIVEBOX_TOTAL_ROWS) { - LOGE("Wrong value of pos = %d", pos); - return; - } - - LOGD("NEW POS OF %s is %f", part, - (float)pos / LIVEBOX_TOTAL_ROWS); - edje_object_part_drag_value_set(edje, part, 0, - (float)pos / LIVEBOX_TOTAL_ROWS); - } -} -#endif - -static void __grid_item_resize_page_background_clicked_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - if (!obj) { - LOGE("obj == NULL"); - return; - } - - LOGD("Background clicked"); - elm_layout_signal_emit(obj, SIGNAL_RESIZE_SLIDERS_HIDE, - SIGNAL_LIVEBOX_SOURCE); -} - diff --git a/src/livebox/grid_reposition.c b/src/livebox/grid_reposition.c deleted file mode 100644 index 8a7e076..0000000 --- a/src/livebox/grid_reposition.c +++ /dev/null @@ -1,681 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "livebox/grid_reposition.h" - -#include "homescreen-efl.h" -#include "livebox/livebox_utils.h" -#include "livebox/livebox_animator.h" -#include "livebox/livebox_panel.h" -#include "util.h" -#include "conf.h" -#include "data_model.h" - -typedef struct { - Evas_Object *obj; - Eina_Rectangle *pos_in_grid; -} Repositioned_Object_Data_t; - -static struct { - Evas_Object *repositioned_object; - Evas_Object *current_grid; - Evas_Object *origination_grid; - Repositioned_Object_Data_t repositioned_object_data; - Eina_List *repositioned_objects_in_grid; - Anim_Data_t *ad; - int offset_x; - int offset_y; - bool intersection_found; -} s_info = { - .repositioned_object = NULL, - .current_grid = NULL, - .origination_grid = NULL, - .repositioned_object_data = { - .obj = NULL, - .pos_in_grid = NULL - }, - .repositioned_objects_in_grid = NULL, - .ad = NULL, - .offset_x = 0, - .offset_y = 0, - .intersection_found = true -}; - -static void __grid_reposition_drop_anim_cb(Anim_Data_t **ad); -static bool __grid_reposition_check_grid_intersection(Evas_Object *moved_item, - Evas_Object *grid); -static bool __grid_reposition_check_item_intersection(Evas_Object *moved_item, - Evas_Object *grid_item); -static void __grid_reposition_save_item_start_data(Evas_Object *object); -static void __grid_reposition_make_space(void); -static void __grid_reposition_update_item_position(Eina_Rectangle *new_geometry); - -Evas_Object *grid_reposition_get_current_glrid(void) -{ - return s_info.current_grid; -} - -Evas_Object *grid_reposition_get_repositioned_item(void) -{ - return s_info.repositioned_object; -} - -void grid_reposition_init(Evas_Object *grid, Evas_Object *repositioned_item) -{ - int mx = -1; - int my = -1; - int ox = -1; - int oy = -1; - Evas *e = NULL; - - if (!grid) { - LOGE("grid == NULL"); - return; - } - - if (!repositioned_item) { - LOGE("repositioned_item == NULL"); - return; - } - - e = evas_object_evas_get(repositioned_item); - if (!e) { - LOGE("e == NULL"); - return; - } - - evas_pointer_canvas_xy_get(e, &mx, &my); - evas_object_geometry_get(repositioned_item, &ox, &oy, NULL, NULL); - - s_info.offset_x = mx - ox; - s_info.offset_y = my - oy; - - LOGD("MOUSE: (%d, %d); OFFSET: (%d, %d)", mx, my, s_info.offset_x, - s_info.offset_y); - - s_info.current_grid = s_info.origination_grid = grid; - s_info.repositioned_object = repositioned_item; - - __grid_reposition_save_item_start_data(repositioned_item); -} - -void grid_reposition_start(void) -{ - int mx = -1; - int my = -1; - Evas_Object *page = NULL; - Evas_Object *grid = NULL; - - int x = -1, y = -1, w = -1, h = -1; - - page = livebox_utils_get_selected_livebox_layout(); - if (!page) { - LOGE("page == NULL"); - return; - } - - grid = livebox_utils_get_livebox_container_grid(page); - if (!grid) { - LOGE("grid == NULL"); - return; - } - - - elm_grid_unpack(s_info.current_grid, s_info.repositioned_object); - evas_object_geometry_get(s_info.repositioned_object, &x, &y, &w, &h); - LOGD("Packing. Reposition start: %d; %d; %d; %d", x, y, w, h); - - livebox_utils_get_cursor_pos(&mx, &my); - grid_reposition_move(mx, my); - - livebox_utils_repack_grid_object(s_info.repositioned_object, - livebox_utils_get_shadow(), NULL, grid); -} - -void grid_reposition_move(int mouse_x, int mouse_y) -{ - if (!s_info.repositioned_object) { - LOGE("s_info.repositioned_object == NULL"); - return; - } - - if (!s_info.current_grid) { - LOGE("s_info.current_grid == NULL"); - return; - } - - evas_object_move(s_info.repositioned_object, - mouse_x - s_info.offset_x, mouse_y - s_info.offset_y); - s_info.intersection_found = - __grid_reposition_check_grid_intersection(s_info.repositioned_object, - s_info.current_grid); - - - if (livebox_panel_is_add_page_selected()) { - /*no intersection found but we can't drop on 'add page' page */ - s_info.intersection_found = true; - livebox_utils_set_shadow_visibility(false); - } else if (!s_info.intersection_found) { - /*no intersection found so we can show the shadow */ - livebox_utils_set_grid_object_pack(s_info.repositioned_object, - livebox_utils_get_shadow(), s_info.current_grid); - livebox_utils_set_shadow_visibility(true); - } else if (s_info.current_grid != s_info.origination_grid) { - /*intersection found and livebox was moved from diferent grid. - We can hide the shadow*/ - __grid_reposition_make_space(); - livebox_utils_set_shadow_visibility(false); - } else { - /* intersection found and livebox was moved from current grid. - We should display the shadow on the origination position */ - - __grid_reposition_make_space(); - elm_grid_pack_set(livebox_utils_get_shadow(), - s_info.repositioned_object_data.pos_in_grid->x, - s_info.repositioned_object_data.pos_in_grid->y, - s_info.repositioned_object_data.pos_in_grid->w, - s_info.repositioned_object_data.pos_in_grid->h); - - livebox_utils_set_shadow_visibility(true); - } -} - -void grid_reposition_end(void) -{ - Eina_Rectangle *start = NULL; - Eina_Rectangle *end = NULL; - int x = -1; - int y = -1; - int w = -1; - int h = -1; - Evas_Object *destination_grid = NULL; - - if (!s_info.repositioned_object) { - LOGE("s_info.repositioned_object == NULL"); - return; - } - - if (!s_info.current_grid) { - LOGE("s_info.current_grid == NULL"); - return; - } - - if (!s_info.origination_grid) { - LOGE("s_info.origination_grid == NULL"); - return; - } - - s_info.intersection_found = __grid_reposition_check_grid_intersection( - s_info.repositioned_object, s_info.current_grid); - - if (!s_info.intersection_found) { - livebox_utils_convert_size_to_grid_coord(s_info.repositioned_object, - s_info.current_grid, &x, &y, &w, &h); - livebox_utils_normalize_grid_pos(x, y, w, h, &x, &y); - destination_grid = s_info.current_grid; - } else { - x = s_info.repositioned_object_data.pos_in_grid->x; - y = s_info.repositioned_object_data.pos_in_grid->y; - w = s_info.repositioned_object_data.pos_in_grid->w; - h = s_info.repositioned_object_data.pos_in_grid->h; - destination_grid = s_info.origination_grid; - } - - start = livebox_utils_get_widget_rectangle(s_info.repositioned_object); - end = livebox_utils_convert_virtual_grid_geo_to_screen(destination_grid, - x, y, w, h); - - livebox_animator_play_geometry_set(s_info.repositioned_object, - LIVEBOX_REPOSITION_ANIM_TIME, - ECORE_POS_MAP_DECELERATE_FACTOR, 2, 0, - start, end, - __grid_reposition_drop_anim_cb, &s_info.ad); -} - -void grid_reposition_set_current_grid(Evas_Object *grid) -{ - if (grid == NULL) { - LOGE("grid == NULL"); - s_info.current_grid = s_info.origination_grid; - return; - } - - s_info.current_grid = grid; -} - -/* ================================== intersection check =====================*/ - -static Eina_Rectangle *_reposition_grid_item_pos_new_get( - Eina_Rectangle *grid_item, Eina_Rectangle *moved_item) -{ - int new_x = 0; - int new_y = 0; - - if (!grid_item) { - LOGE("grid_item == NULL"); - return NULL; - } - - if (!moved_item) { - LOGE("moved_item == NULL"); - return NULL; - } - - if (moved_item->y - grid_item->h >= 0) { - new_y = moved_item->y - grid_item->h; - } else { - new_y = moved_item->y + grid_item->h; - } - - if (new_y < 0 || new_y > LIVEBOX_TOTAL_ROWS) - return NULL; - - livebox_utils_normalize_grid_pos(grid_item->x, new_y, grid_item->w, - grid_item->h, &new_x, &new_y); - - return eina_rectangle_new(new_x, new_y, grid_item->w, grid_item->h); -} - -static bool _rectangle_containment_check(Eina_Rectangle *outer, - Eina_Rectangle *inner) -{ - if (!outer) { - LOGE("outer == NULL"); - return false; - } - - if (!inner) { - LOGE("inner == NULL"); - return false; - } - - if (inner->x >= outer->x && inner->y >= outer->y && - inner->x + inner->w <= outer->x + outer->w && - inner->y + inner->h <= outer->y + outer->h) { - LOGD("RECTANGLE: [%d, %d - %d, %d] is IN [%d, %d - %d, %d]", - inner->x, inner->y, inner->w, inner->h, - outer->x, outer->y, outer->w, outer->h); - - return true; - } else { - LOGD("RECTANGLE: [%d, %d - %d, %d] is NOT [%d, %d - %d, %d]", - inner->x, inner->y, inner->w, inner->h, - outer->x, outer->y, outer->w, outer->h); - - return false; - } -} - -static void __grid_reposition_make_space(void) -{ - Eina_Rectangle *repo_obj_rec = NULL; - Eina_Rectangle *grid_obj_rec = NULL; - Eina_Rectangle *grid_obj_new_pos = NULL; - Eina_List *items_in_grid = NULL; - Eina_List *l = NULL; - Evas_Object *obj = NULL; - int rx = -1, ry = -1, rw = -1, rh = -1; - bool contaiment = false; - bool intersection_in_grid = false; - bool can_space_make = false; - - if (!s_info.current_grid) { - LOGE("s_info_current_grid == NULL"); - return; - } - - if (!s_info.origination_grid) { - LOGE("s_info.origination_grid == NULL"); - return; - } - - items_in_grid = livebox_utils_get_liveboxes_on_gird( - s_info.current_grid); - if (!items_in_grid) { - LOGE("items_in_grid == NULL"); - return; - } - - livebox_utils_convert_size_to_grid_coord(s_info.repositioned_object, - s_info.current_grid, &rx, &ry, &rw, &rh); - livebox_utils_normalize_grid_pos(rx, ry, rw, rh, &rx, &ry); - - repo_obj_rec = eina_rectangle_new(rx, ry, rw, rh); - if (!repo_obj_rec) { - LOGE("repo_obj_rec == NULL"); - return; - } - - EINA_LIST_FOREACH(items_in_grid, l, obj) { - if (!obj) { - LOGE("obj == NULL"); - continue; - } - - grid_obj_rec = livebox_utils_get_grid_widget_rectangle(obj); - if (!grid_obj_rec) { - LOGE("grid_obj_rec == NULL"); - continue; - } - - contaiment = _rectangle_containment_check(grid_obj_rec, - repo_obj_rec); /*moved obj in grid obj*/ - - if (!contaiment) { - contaiment = _rectangle_containment_check(repo_obj_rec, - grid_obj_rec); /*grid obj in moved obj*/ - } - - if (contaiment) { - grid_obj_new_pos = _reposition_grid_item_pos_new_get( - grid_obj_rec, repo_obj_rec); - - if (grid_obj_new_pos && - !eina_rectangles_intersect(grid_obj_new_pos, - repo_obj_rec)) { - intersection_in_grid = - livebox_utils_check_rect_list_grid_interesction( - grid_obj_new_pos, obj, items_in_grid); - - /*TODO: This call is not required when we assume - that no livebox can be put side by side*/ - if (!intersection_in_grid) { - elm_grid_pack_set(obj, - grid_obj_new_pos->x, - grid_obj_new_pos->y, - grid_obj_new_pos->w, - grid_obj_new_pos->h); - can_space_make = true; - } else { - can_space_make = false; - eina_rectangle_free(grid_obj_new_pos); - eina_rectangle_free(grid_obj_rec); - break; - } - - eina_rectangle_free(grid_obj_new_pos); - } - } - - eina_rectangle_free(grid_obj_rec); - } - - if (can_space_make) - __grid_reposition_update_item_position(repo_obj_rec); - - eina_rectangle_free(repo_obj_rec); - eina_list_free(items_in_grid); -} - -static void __grid_reposition_save_item_start_data(Evas_Object *object) -{ - int x = -1, y = -1, w = -1, h = -1; - - if (!object) { - LOGE("object == NULL"); - return; - } - - s_info.repositioned_object_data.obj = object; - elm_grid_pack_get(object, &x, &y, &w, &h); - - s_info.repositioned_object_data.pos_in_grid = eina_rectangle_new(x, y, - w, h); -} - -static void __grid_reposition_update_item_position(Eina_Rectangle *new_geometry) -{ - if (!new_geometry) { - LOGE("new_geometry == NULL"); - return; - } - - if (!s_info.repositioned_object_data.pos_in_grid) { - LOGE("s_info.repositioned_object_data.pos_in_grid == NULL"); - return; - } - - s_info.repositioned_object_data.pos_in_grid->x = new_geometry->x; - s_info.repositioned_object_data.pos_in_grid->y = new_geometry->y; - s_info.repositioned_object_data.pos_in_grid->w = new_geometry->w; - s_info.repositioned_object_data.pos_in_grid->h = new_geometry->h; -} - -static bool __grid_reposition_check_grid_intersection(Evas_Object *moved_item, - Evas_Object *grid) -{ - Eina_List *grid_items = NULL; - Eina_List *l = NULL; - Evas_Object *grid_item = NULL; - - if (!moved_item) { - LOGE("moved_item == NULL"); - return false; - } - - if (!grid) { - LOGE("grid == NULL"); - return false; - } - - grid_items = livebox_utils_get_liveboxes_on_gird(grid); - if (!grid_items) { - LOGE("grid_items == NULL"); - return false; - } - - EINA_LIST_FOREACH(grid_items, l, grid_item) { - if (!grid_item) { - LOGE("item == NULL"); - continue; - } - - if (__grid_reposition_check_item_intersection(moved_item, - grid_item) == true) { - eina_list_free(grid_items); - return true; - } - } - - eina_list_free(grid_items); - return false; -} - -static Eina_Rectangle *_normalized_rectangle_get(Evas_Object *obj) -{ - int x = -1; - int y = -1; - int w = -1; - int h = -1; - Eina_Rectangle *rect = NULL; - - if (!s_info.current_grid) { - LOGE("s_info.current_grid == NULL"); - return NULL; - } - - if (!obj) { - LOGE("obj == NULL"); - return NULL; - } - - livebox_utils_convert_size_to_grid_coord(obj, s_info.current_grid, - &x, &y, &w, &h); - livebox_utils_normalize_grid_pos(x, y, w, h, &x, &y); - rect = livebox_utils_convert_virtual_grid_geo_to_screen(s_info.current_grid, - x, y, w, h); - - if (!rect) { - LOGE("rect == NULL"); - return NULL; - } - - return rect; -} - -static bool __grid_reposition_check_item_intersection(Evas_Object *moved_item, - Evas_Object *grid_item) -{ - Eina_Rectangle *moved_item_rec = NULL; - Eina_Rectangle *grid_item_rec = NULL; - bool ret = false; - - if (!moved_item) { - LOGE("moved_item == NULL"); - return false; - } - - if (!grid_item) { - LOGE("grid_item == NULL"); - return false; - } - - moved_item_rec = _normalized_rectangle_get(moved_item); - if (!moved_item_rec) { - LOGE("moved_item_rec == NULL"); - return false; - } - - grid_item_rec = livebox_utils_get_widget_rectangle(grid_item); - if (!grid_item_rec) { - LOGE("grid_item_rec == NULL"); - eina_rectangle_free(moved_item_rec); - return false; - } - - ret = eina_rectangle_intersection(moved_item_rec, grid_item_rec); - - eina_rectangle_free(moved_item_rec); - eina_rectangle_free(grid_item_rec); - - return ret; -} - -static void _grid_reposition_update_data_model(Evas_Object *page) -{ - Eina_List *items = NULL; - Tree_node_t *node = NULL; - Tree_node_t *page_node = NULL; - int x = 0, y = 0, w = 0, h = 0; - Eina_List *l; - Evas_Object *livebox; - - LOGI("DATA MODEL REPOSITION START"); - - elm_grid_pack_get(s_info.repositioned_object, &x, &y, &w, &h); - node = evas_object_data_get(s_info.repositioned_object, KEY_ICON_DATA); - if (!node) { - LOGE("node == NULL"); - return; - } - - page_node = evas_object_data_get(page, KEY_ICON_DATA); - if (!page_node) { - LOGE("obj_node == NULL"); - return; - } - - data_model_reposition_widget(page_node, node); - - items = livebox_utils_get_liveboxes_on_page_list(page); - if (!items) { - LOGD("items == NULL"); - return; - } - - EINA_LIST_FOREACH(items, l, livebox) { - if (!livebox) { - LOGE("livebox == NULL"); - continue; - } - - elm_grid_pack_get(livebox, &x, &y, &w, &h); - node = evas_object_data_get(livebox, KEY_ICON_DATA); - if (!node) { - LOGE("node == NULL"); - continue; - } - - data_model_resize_widget(node, x, y, w, h); - } - - home_screen_print_tree(); -} - -static void __grid_reposition_drop_anim_cb(Anim_Data_t **ad) -{ - Evas_Object *page = NULL; - - LOGI("DROP ANIM END"); - - if (!s_info.current_grid || !s_info.origination_grid || - !s_info.repositioned_object) { - LOGE("s_info.current_grid == %p; s_info.origination_grid == %p;\ - s_info.repositioned_object == %p", s_info.current_grid, - s_info.origination_grid, s_info.repositioned_object); - - s_info.repositioned_object = NULL; - s_info.current_grid = NULL; - livebox_animator_del_grid(ad); - s_info.intersection_found = false; - eina_rectangle_free( - s_info.repositioned_object_data.pos_in_grid); - } - - livebox_utils_repack_grid_object(NULL, livebox_utils_get_shadow(), - s_info.current_grid, NULL); - - if (!s_info.intersection_found) { - livebox_utils_repack_grid_object(s_info.repositioned_object, - s_info.repositioned_object, - NULL, - s_info.current_grid); - - page = livebox_scroller_get_page(); - } else { - elm_grid_pack(s_info.origination_grid, - s_info.repositioned_object, - s_info.repositioned_object_data.pos_in_grid->x, - s_info.repositioned_object_data.pos_in_grid->y, - s_info.repositioned_object_data.pos_in_grid->w, - s_info.repositioned_object_data.pos_in_grid->h); - - page = livebox_utils_get_prev_livebox_layout(); - } - - if (!page) { - LOGE("page == NULL"); - s_info.repositioned_object = NULL; - s_info.current_grid = NULL; - - livebox_animator_del_grid(ad); - s_info.intersection_found = false; - eina_rectangle_free( - s_info.repositioned_object_data.pos_in_grid); - return; - } - - _grid_reposition_update_data_model(page); - - s_info.repositioned_object = NULL; - s_info.current_grid = NULL; - - livebox_animator_del_grid(ad); - s_info.intersection_found = false; - eina_rectangle_free(s_info.repositioned_object_data.pos_in_grid); -} diff --git a/src/livebox/livebox_animator.c b/src/livebox/livebox_animator.c deleted file mode 100644 index 96fa58f..0000000 --- a/src/livebox/livebox_animator.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include "livebox/livebox_animator.h" -#include "util.h" -#include "livebox/livebox_panel.h" -#include "homescreen-efl.h" -#include "page_scroller.h" -#include "popup.h" - -#define FRAME (1.0/30.0) -#define FPS 30 - -static Eina_Bool __livebox_animator_set_grid_frame(void *data, double pos); -static Eina_Bool __livebox_animator_set_geometry_frame(void *data, double pos); -static void __livebox_animator_create(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out); - - -void livebox_animator_del_grid(Anim_Data_t **ad) -{ - if (!(*ad)) { - LOGE("(*ad) == NULL"); - return; - } - - (*ad)->on_end = NULL; - ecore_animator_del((*ad)->animator); - (*ad)->animator = NULL; - (*ad)->anim_is_running = false; - eina_rectangle_free((*ad)->geometry_start); - eina_rectangle_free((*ad)->geometry_end); - free((*ad)); - - (*ad) = NULL; -} - -void livebox_animator_play_grid_pack_set(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out) -{ - __livebox_animator_create(obj, anim_time, map, map_var_1, map_var_2, - geometry_start, geometry_end, on_end, ad_out); - - if (!(*ad_out)) { - LOGE("Failed to create animation"); - return; - } - - (*ad_out)->animator = ecore_animator_timeline_add(anim_time, - __livebox_animator_set_grid_frame, ad_out); - - if (!(*ad_out)->animator) { - LOGE("Failed to create animator"); - livebox_animator_del_grid(ad_out); - return; - } -} - -void livebox_animator_play_geometry_set(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out) -{ - __livebox_animator_create(obj, anim_time, map, map_var_1, map_var_2, - geometry_start, geometry_end, on_end, ad_out); - - if (!(*ad_out)) { - LOGE("Failed to create animation"); - return; - } - - (*ad_out)->animator = ecore_animator_timeline_add(anim_time, - __livebox_animator_set_geometry_frame, ad_out); - - if (!(*ad_out)->animator) { - LOGE("Failed to create animator"); - livebox_animator_del_grid(ad_out); - return; - } -} - -static void __livebox_animator_create(Evas_Object *obj, - float anim_time, - Ecore_Pos_Map map, float map_var_1, float map_var_2, - Eina_Rectangle *geometry_start, Eina_Rectangle *geometry_end, - Anim_Grid_End on_end, - Anim_Data_t **ad_out) -{ - *ad_out = (Anim_Data_t *) calloc(1, sizeof(Anim_Data_t)); - if (!*ad_out) { - LOGE("Failed to allocate ad_out"); - return; - } - - (*ad_out)->anim_time = anim_time; - (*ad_out)->obj = obj; - (*ad_out)->map = map; - (*ad_out)->map_var_1 = map_var_1; - (*ad_out)->map_var_2 = map_var_2; - (*ad_out)->geometry_start = geometry_start; - (*ad_out)->geometry_end = geometry_end; - (*ad_out)->on_end = on_end; - (*ad_out)->anim_is_running = true; -} - - -static Eina_Bool __livebox_animator_set_geometry_frame(void *data, double pos) -{ - double frame = pos; - - Anim_Data_t **ad = (Anim_Data_t **)data; - if (!(*ad)) { - LOGE("(*ad) == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - int xs = (*ad)->geometry_start->x; - int ys = (*ad)->geometry_start->y; - int ws = (*ad)->geometry_start->w; - int hs = (*ad)->geometry_start->h; - - int xe = (*ad)->geometry_end->x; - int ye = (*ad)->geometry_end->y; - int we = (*ad)->geometry_end->w; - int he = (*ad)->geometry_end->h; - - int xd = xe - xs; - int yd = ye - ys; - int wd = we - ws; - int hd = he - hs; - - frame = ecore_animator_pos_map(pos, (*ad)->map, (*ad)->map_var_1, - (*ad)->map_var_2); - - evas_object_move((*ad)->obj, xs + xd * frame, ys + yd * frame); - evas_object_resize((*ad)->obj, ws + wd * frame, hs + hd * frame); - - if (pos >= 1.0) { - /*last frame*/ - if ((*ad)->on_end) { - (*ad)->on_end(ad); - } else { - livebox_animator_del_grid(ad); - } - - return ECORE_CALLBACK_CANCEL; - } - - return ECORE_CALLBACK_RENEW; -} - - -static Eina_Bool __livebox_animator_set_grid_frame(void *data, double pos) -{ - double frame = pos; - - Anim_Data_t **ad = (Anim_Data_t **)data; - if (!(*ad)) { - LOGE("(*ad) == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - int xs = (*ad)->geometry_start->x; - int ys = (*ad)->geometry_start->y; - int ws = (*ad)->geometry_start->w; - int hs = (*ad)->geometry_start->h; - - int xe = (*ad)->geometry_end->x; - int ye = (*ad)->geometry_end->y; - int we = (*ad)->geometry_end->w; - int he = (*ad)->geometry_end->h; - - int xd = xe - xs; - int yd = ye - ys; - int wd = we - ws; - int hd = he - hs; - - frame = ecore_animator_pos_map(pos, (*ad)->map, (*ad)->map_var_1, - (*ad)->map_var_2); - - elm_grid_pack_set((*ad)->obj, - xs + xd * frame, - ys + yd * frame, - ws + wd * frame, - hs + hd * frame); - - - if (pos >= 1.0) { - /*last frame*/ - if ((*ad)->on_end) { - (*ad)->on_end(ad); - } else { - livebox_animator_del_grid(ad); - } - - return ECORE_CALLBACK_CANCEL; - } - - return ECORE_CALLBACK_RENEW; -} diff --git a/src/livebox/livebox_panel.c b/src/livebox/livebox_panel.c deleted file mode 100644 index fac2901..0000000 --- a/src/livebox/livebox_panel.c +++ /dev/null @@ -1,1661 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "util.h" -#include "homescreen-efl.h" -#include "page_scroller.h" -#include "option_menu.h" -#include "dynamic_index.h" -#include "data_model.h" - -#include "layout.h" -#include "popup.h" -#include "layout.h" -#include "conf.h" - -#include "livebox/livebox_panel.h" -#include "livebox/livebox_animator.h" -#include "livebox/grid_item_resize.h" -#include "livebox/grid_reposition.h" -#include "livebox/livebox_utils.h" -#include "livebox/livebox_widget.h" - -static Evas_Object *__livebox_panel_create_page(Evas_Object *livebox_scroller); -static void __livebox_panel_freeze_scroller(void); -static bool __livebox_panel_is_page_empty(Evas_Object *page); - -static void __livebox_panel_register_longpress_callbacks(Evas_Object *livebox_scroller, - Evas_Object *page_layout, Evas_Object *livebox); -static void __livebox_panel_scrolled_cb(void *data, Evas_Object *obj, - void *event_info); -static void __livebox_panel_page_changed_cb(void *data, Evas_Object *obj, - void *event_info); -static void __livebox_panel_mouse_down_cb(void *data, Evas *evas, Evas_Object *object, - void *event_info); -static void __livebox_panel_mouse_up_cb(void *data, Evas *evas, Evas_Object *object, - void *event_info); -static Eina_Bool __livebox_panel_longpress_cb(void *data); - -static void __livebox_panel_update_edit_mode_layout(Evas_Object *livebox_scroller_layout); -static void __livebox_panel_add_page_clicked_cb(void *data, Evas_Object *obj, - const char *emission, const char *source); - -static void __libebox_panel_toggle_selected_livebox(Evas_Object *livebox, Evas_Object *page); -static void __livebox_panel_set_remove_buttons_visiblity(Evas_Object *page, bool visible); -static void __livebox_panel_set_reposition_bg_visibility(bool visible); -static void __livebox_panel_del_cb(void *data, Evas_Object *obj, - const char *emission, const char *source); -static Evas_Object *__livebox_panel_get_widget_layout(Evas_Object *obj); - -static void __livebox_panel_scroll_start_cb(void *data, Evas_Object *obj, void *info); -static Eina_Bool __livebox_panel_change_page_timer_start_cb(void *data); - -static void __livebox_panel_page_count_changed_cb(void *data, Evas_Object *obj, - const char *emission, const char *source); -static void __livebox_panel_set_remove_button_visibility(Evas_Object *livebox, - bool visible); -static void __livebox_panel_hide_remove_button(Evas_Object *livebox); - -static bool __livebox_panel_iterate_page_fill_cb(Tree_node_t *parent, - Tree_node_t *page_node, void *data); -static bool __livebox_panel_iterate_node_fill_cb(Tree_node_t *page_node, - Tree_node_t *node, void *data); - -static void __livebox_panel_show_warning_popup(void); -static bool __livebox_panel_find_empty_space(Evas_Object *page, - int span_w, int span_h, int *pos_x, int *pos_y); - -static int __livebox_panel_get_mouse_move_distance_square(int x, int y); - -static struct { - Ecore_Timer *longpress_timer; - int origination_page_num; - Ecore_Timer *page_change_timer; - int page_change; -} livebox_reposition_info_s = { - .longpress_timer = NULL, - .origination_page_num = 0, - .page_change_timer = NULL, - .page_change = LIVEBOX_PAGE_NO_CHANGE, -}; - - -static struct { - Evas_Object *livebox_page_scroller; - Evas_Object *livebox_page_box; - Evas_Object *add_page; - dynamic_index_t *dynamic_index; - - Eina_List *livebox_page_list; - - int pages_count; - int current_page; - - bool edit_mode; - - bool livebox_remove_button_state; - - Eina_Bool is_resizing; - Eina_Bool is_longpress; - - Evas_Object *item_moved; - Eina_Rectangle no_move_pos; - Evas_Point mouse_press_pos; - -} s_info = { - .livebox_page_scroller = NULL, - .livebox_page_box = NULL, - .add_page = NULL, - .dynamic_index = NULL, - - .livebox_page_list = NULL, - - .pages_count = 0, - .current_page = 0, - - .edit_mode = false, - - .livebox_remove_button_state = false, - .is_resizing = false, - - .is_longpress = false, - - .item_moved = NULL, - .no_move_pos.x = 0, - .no_move_pos.y = 0, - .no_move_pos.w = 0, - .no_move_pos.h = 0, - - .mouse_press_pos = {-1, -1}, -}; - -void livebox_panel_update_dynamic_index(void) -{ - if (!s_info.livebox_page_scroller) { - LOGE("s_info.livebox_page_scroller == NULL"); - return; - } - - elm_object_signal_emit(s_info.livebox_page_scroller, - SIGNAL_SCROLLER_PAGE_COUNT_CHANGED, SIGNAL_SOURCE); -} - -void livebox_panel_create_dynamic_index(void) -{ - if (!s_info.livebox_page_scroller) { - LOGE("s_info.livebox_page_scroller == NULL"); - return; - } - - - s_info.dynamic_index = dynamic_index_new(s_info.livebox_page_scroller); - if (!s_info.dynamic_index) { - LOGE("s_info.dynamic_index == NULL"); - return; - } -} - -void livebox_panel_fill(void) -{ - Tree_node_t *home = NULL; - int widget_pos_h = 0; - - home = data_model_get_home(); - if (!home) { - LOGE("home == NULL"); - return; - } - - if (home->count == 0) { - LOGW("home->count == NULL"); - return; - } else { - LOGI("home->count == %d", home->count); - } - - data_model_iterate_pages(home, __livebox_panel_iterate_page_fill_cb, - __livebox_panel_iterate_node_fill_cb, &widget_pos_h); - livebox_panel_create_dynamic_index(); -} - -Evas_Object *livebox_panel_create(Evas_Object *parent) -{ - Evas_Object *liveboxes = NULL; - - if (!parent) { - LOGE("parent == NULL"); - return NULL; - } - - liveboxes = livebox_panel_create_scroller(); - if (!liveboxes) { - LOGE("liveboxes == NULL"); - return NULL; - } - - livebox_widget_init(); - - return liveboxes; -} - -void livebox_panel_set_content(Evas_Object *layout) -{ - if(s_info.dynamic_index->box) - elm_layout_content_set(layout, PART_INDEX, s_info.dynamic_index->box); -} - -void livebox_panel_unset_content(Evas_Object *layout) -{ - Evas_Object *dynamic_index = NULL; - - dynamic_index = elm_object_part_content_unset(layout, PART_INDEX); - - if (!dynamic_index) { - LOGE("dyamic_index == NULL"); - return; - } - - evas_object_hide(dynamic_index); -} - - -Evas_Object *livebox_scroller_get_page(void) -{ - int current_page_number = page_scroller_get_current_page( - s_info.livebox_page_scroller); - return page_scroller_get_page(s_info.livebox_page_scroller, - current_page_number); -} - -void livebox_panel_refresh_content_size(void) -{ - Evas_Object *page_container = NULL; - Evas_Object *item = NULL; - Eina_List *it = NULL; - Eina_List *items_in_grid = NULL; - Evas_Coord container_x = -1; - Evas_Coord container_y = -1; - Evas_Coord container_width = -1; - Evas_Coord container_height = -1; - Evas_Coord x = -1, y = -1, w = -1, h = -1; - - if (!s_info.livebox_page_scroller) { - return; - } - - page_container = page_scroller_get_page( - s_info.livebox_page_scroller, - page_scroller_get_current_page(s_info.livebox_page_scroller)); - - if (!page_container) { - LOGE("page_container == NULL"); - return; - } - - evas_object_geometry_get(s_info.livebox_page_scroller, - &container_x, &container_y, &container_width, - &container_height); - - items_in_grid = livebox_utils_get_liveboxes_on_page_list( - page_container); - - EINA_LIST_FOREACH(items_in_grid, it, item) { - if (!item) { - LOGE("item == NULL"); - continue; - } - - elm_grid_pack_get(item, &x, &y, &w, &h); - evas_object_move(item, - (x*(container_width-LIVEBOX_HORIZONTAL_PADDING) / 100) + - LIVEBOX_HORIZONTAL_PADDING / 2 + container_x, - container_height * y / 100 + container_y); - evas_object_resize(item, - (int)((float) w/100 * (container_width)) - - (w * LIVEBOX_HORIZONTAL_PADDING)/100, - (int)((float)h/100 * (container_height)) - - (y*LIVEBOX_HORIZONTAL_PADDING)/100); - } -} - -Evas_Object *livebox_panel_create_scroller(void) -{ - Evas_Object *livebox_page_scroller = NULL; - Evas_Object *win = home_screen_get_win(); - Evas_Object *box = NULL; - Eina_List *lvb_page_list = NULL; - - int p_count = 0; - int cur_page = 0; - - if (!win) { - LOGE("Window is NULL"); - return NULL; - } - - livebox_page_scroller = - page_scroller_create(home_screen_get_root_width(), - LIVEBOX_PAGE_HEIGHT_REL*home_screen_get_root_height()); - if (!livebox_page_scroller) { - LOGE("Cannot create livebox page scroller"); - return NULL; - } - - box = elm_object_content_get(livebox_page_scroller); - if (!box) { - LOGE("Cannot get the box"); - evas_object_del(livebox_page_scroller); - return NULL; - } - - livebox_utils_create_shadow(livebox_page_scroller); - evas_object_smart_callback_add(livebox_page_scroller, - "scroll,drag,start", __livebox_panel_scroll_start_cb, NULL); - elm_object_signal_callback_add(livebox_page_scroller, - SIGNAL_SCROLLER_PAGE_COUNT_CHANGED, SIGNAL_LAYOUT_SOURCE, - __livebox_panel_page_count_changed_cb, NULL); - - /*After creation empty one empty space should be created.*/ - - s_info.livebox_page_scroller = livebox_page_scroller; - s_info.current_page = cur_page; - s_info.pages_count = p_count; - s_info.livebox_page_list = lvb_page_list; - - return livebox_page_scroller; -} - - -void livebox_panel_destroy(void) -{ - Eina_List *pages = s_info.livebox_page_list; - - Evas_Object *livebox_scroller_page = NULL; - - if (!pages) { - LOGE("Pages pointer is NULL"); - return; - } - - EINA_LIST_FREE(pages, livebox_scroller_page) { - livebox_panel_destroy_page(livebox_scroller_page); - } - - page_scroller_destroy(s_info.livebox_page_scroller); - - livebox_widget_fini(); -} - -void livebox_panel_paused(void) -{ - livebox_widget_viewer_paused(); -} - -void livebox_panel_resumed(void) -{ - livebox_widget_viewer_resumed(); -} - -void livebox_panel_add_livebox(Tree_node_t *node, Evas_Object *page, - const char *livebox_pkgname, int pos_x, int pos_y, - int width, int height, - char *content_info) -{ - Evas_Object *livebox = NULL; - Evas_Object *livebox_layout = NULL; - Evas_Object *grid = NULL; - int ret = 0; - - - livebox_layout = elm_layout_add(s_info.livebox_page_scroller); - if (!livebox_layout) { - evas_object_del(page); - LOGE("livebox_layout is not created"); - return; - } - - if (!node) { - LOGE("node == NULL"); - return; - } - -#ifdef LIVEBOX_RESIZE_TEST - livebox = elm_image_add(livebox_layout); -#else - livebox = livebox_widget_add(livebox_pkgname, livebox_layout, content_info); -#endif - - if (!livebox) { - LOGE("Livebox is not created"); - return; - } - - node->data->layout = livebox_layout; - evas_object_data_set(livebox_layout, KEY_ICON_DATA, node); - - ret = elm_layout_file_set(livebox_layout, util_get_res_file_path(EDJE_LIVEBOX_LAYOUT_FILENAME), - GROUP_LIVEBOX_LAYOUT); - if (ret != EINA_TRUE) { - LOGE("Can not set layout file"); - return; - } - - ret = elm_layout_content_set(livebox_layout, PART_LIVEBOX, livebox); - if (ret != EINA_TRUE) { - LOGE("Can not set layout file"); - return; - } - - evas_object_size_hint_weight_set(livebox_layout, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - - evas_object_show(livebox); - evas_object_show(livebox_layout); - - elm_layout_signal_callback_add(livebox_layout, SIGNAL_CLICKED, - SIGNAL_REMOVE_SOURCE, __livebox_panel_del_cb, NULL); - - grid = elm_object_part_content_get(page, SIGNAL_CONTENT_SOURCE); - if (!grid) { - LOGE("grid == NULL"); - return; - } - - elm_grid_pack(grid, - livebox_layout, pos_x * LIVEBOX_GRID_ROWS_CELLS_MULTI, - pos_y * LIVEBOX_GRID_ROWS_CELLS_MULTI, - width * LIVEBOX_GRID_ROWS_CELLS_MULTI, - height * LIVEBOX_GRID_ROWS_CELLS_MULTI); - - __livebox_panel_register_longpress_callbacks(NULL, page, livebox_layout); - - LOGD("Adding [%s] at: [%d, %d] <>[%d, %d]", - livebox_pkgname, pos_x, pos_y, width, height); -} - - -Evas_Object *livebox_panel_add_page(Tree_node_t *node, - Evas_Object *livebox_scroller) -{ - Evas_Object *page = NULL; - - page = livebox_panel_create_empty_page(node, livebox_scroller); - - if (!page) { - LOGE("page == NULL"); - return NULL; - } - - if (!page_scroller_add_page(livebox_scroller, page)) { - LOGE("Can not create page"); - - livebox_panel_destroy_page(page); - return NULL; - } - - /*update pages list*/ - s_info.livebox_page_list = page_scroller_get_all_pages( - livebox_scroller); - __livebox_panel_freeze_scroller(); - - return page; -} - -bool livebox_panel_add_empty_page(Evas_Object *livebox_scroller) -{ - /*@todo add check if page count will not be over the limit*/ - Evas_Object *page = __livebox_panel_create_page(livebox_scroller); - return page_scroller_add_page(livebox_scroller, page); -} - - -Evas_Object *livebox_panel_create_empty_page(Tree_node_t *node, - Evas_Object *livebox_scroller) -{ - Evas_Object *page = NULL; - - if (!livebox_scroller) { - LOGE("Livebox panel is NULL"); - return NULL; - } - - if (!node) { - LOGE("node == NULL"); - return NULL; - } - - page = __livebox_panel_create_page(livebox_scroller); - if (!page) { - LOGE("page == NULL"); - return NULL; - } - - evas_object_data_set(page, KEY_ICON_DATA, node); - - return page; -} - - -void livebox_panel_change_edit_mode_state(bool close) -{ - Evas_Object *livebox_scroller = s_info.livebox_page_scroller; - if (!livebox_scroller) { - LOGE("Livebox panel is NULL"); - return; - } - - if (!s_info.edit_mode && close) { - /*if edit mode is disabled closing doesn't take any effect*/ - return; - } - - if (s_info.edit_mode && close) { - s_info.edit_mode = false; - /*closing edit mode*/ - __livebox_panel_update_edit_mode_layout(livebox_scroller); - } else if (!s_info.edit_mode) { - s_info.edit_mode = true; - __livebox_panel_update_edit_mode_layout(livebox_scroller); - } -} - -void livebox_panel_destroy_page(Evas_Object *livebox_scroller_page) -{ - Eina_List *lb_layouts_list = NULL; - Eina_List *l = NULL; - Evas_Object *lb_layout = NULL; - Evas_Object *widget = NULL; - Tree_node_t *page_node = NULL; - - if (!livebox_scroller_page) { - LOGE("Livebox panel is NULL"); - return; - } - - page_node = evas_object_data_get(livebox_scroller_page, KEY_ICON_DATA); - if (!page_node) { - LOGE("page_node == NULL"); - return; - } - - data_model_del_item(page_node); - - lb_layouts_list = livebox_utils_get_liveboxes_on_page_list( - livebox_scroller_page); - if (!lb_layouts_list) { - LOGE("pages == NULL"); - evas_object_del(livebox_scroller_page); - home_screen_print_tree(); - return; - } - - EINA_LIST_FOREACH(lb_layouts_list, l, lb_layout) { - widget = __livebox_panel_get_widget_layout(lb_layout); - if (!widget) { - LOGE("widget == NULL"); - continue; - } - - livebox_widget_del(widget); - evas_object_del(lb_layout); - } - - eina_list_free(lb_layouts_list); - evas_object_del(livebox_scroller_page); - - __livebox_panel_freeze_scroller(); - home_screen_print_tree(); -} - -bool livebox_panel_is_add_page_selected(void) -{ - int current_page_number = page_scroller_get_current_page( - s_info.livebox_page_scroller); - Evas_Object *page_container = page_scroller_get_page( - s_info.livebox_page_scroller, current_page_number); - - return (page_container == s_info.add_page && - livebox_panel_check_if_add_page_is_visible()); -} - -void livebox_panel_move_mouse_cb(int x, int y) -{ - int mouse_move_distance = __livebox_panel_get_mouse_move_distance_square(x, y); - - if (mouse_move_distance > LIVEBOX_MIN_MOUSE_MOVE) { - ecore_timer_del(livebox_reposition_info_s.longpress_timer); - livebox_reposition_info_s.longpress_timer = NULL; - - if(!s_info.is_longpress) - page_scroller_unfreeze(s_info.livebox_page_scroller); - } - - if (s_info.is_longpress && - !livebox_reposition_info_s.page_change_timer) { - if (x < LIVEBOX_PAGE_CHANGE_RECT_SIZE) { - livebox_reposition_info_s.page_change_timer = - ecore_timer_add(LIVEBOX_PAGE_CHANGE_PERIOD, - __livebox_panel_change_page_timer_start_cb, (void *)false); - LOGI("PAGE CHANGE TIMER CREATED "); - } else if (x > home_screen_get_root_width() - - LIVEBOX_PAGE_CHANGE_RECT_SIZE) { - livebox_reposition_info_s.page_change_timer = - ecore_timer_add(LIVEBOX_PAGE_CHANGE_PERIOD, - __livebox_panel_change_page_timer_start_cb, (void *)true); - LOGI("PAGE CHANGE TIMER CREATED "); - } - - grid_reposition_move(x, y); - } else if (livebox_reposition_info_s.page_change_timer && - x > LIVEBOX_PAGE_CHANGE_RECT_SIZE && - x < home_screen_get_root_width() - - LIVEBOX_PAGE_CHANGE_RECT_SIZE) { - ecore_timer_del(livebox_reposition_info_s.page_change_timer); - livebox_reposition_info_s.page_change_timer = NULL; - LOGI("PAGE CHANGE TIMER DESTROYED"); - - grid_reposition_move(x, y); - } -} - -Eina_List *livebox_panel_get_pages(void) -{ - return s_info.livebox_page_list; -} - -Evas_Object *livebox_panel_get(void) -{ - return s_info.livebox_page_scroller; -} - -Evas_Object *livebox_panel_get_index(void) -{ - if (!s_info.dynamic_index) { - LOGE("s_info.dynamic_index == NULL"); - return NULL; - } - - if (!s_info.dynamic_index->box) { - LOGE("s_info.dynamic_index->box == NULL"); - return NULL; - } - - return s_info.dynamic_index->box; -} - -bool livebox_panel_check_if_add_page_is_visible(void) -{ - Evas_Object *lvb_scorller = NULL; - Evas_Object *page = NULL; - Evas_Object *page_edje = NULL; - - int p_count = -1; - const char *state = NULL; - - lvb_scorller = s_info.livebox_page_scroller; - if (!lvb_scorller) { - LOGE("Faield to get livebox scroller"); - return false; - } - - p_count = page_scroller_get_page_count(lvb_scorller); - if (p_count < 0) { - LOGE("Failed to get page count"); - return false; - } - - LOGD("p_count is %d ", p_count); - - page = page_scroller_get_page(lvb_scorller, --p_count); - if (!page) { - LOGE("Failed to get page"); - return false; - } - - page_edje = elm_layout_edje_get(page); - if (!page_edje) { - LOGE("Failed to get page edje"); - return false; - } - - state = edje_object_part_state_get(page_edje, - PART_ADD_PAGE_BUTTON, NULL); - - if (!state) { - LOGE("Failed to get state"); - return false; - } - - LOGD("state is : %s ", state); - - return strncmp(state, "default", LIVEBOX_MAX_STATE_LEN); -} - -void livebox_panel_set_edit_mode_layout(bool turn_on) -{ - Evas_Object *lvb_scorller = NULL; - Evas_Object *page = NULL; - char *signal_to_send = NULL; - Eina_List *all_pages = NULL; - Eina_List *it = NULL; - - lvb_scorller = s_info.livebox_page_scroller; - if (!lvb_scorller) { - LOGE("Failed to get livebox scroller"); - return; - } - - all_pages = page_scroller_get_all_pages(lvb_scorller); - if (!all_pages) { - LOGE("Failed to get page"); - return; - } - - if (turn_on) { - signal_to_send = SIGNAL_EDIT_START; - } else { - signal_to_send = SIGNAL_EDIT_STOP; - } - - EINA_LIST_FOREACH(all_pages, it, page) { - if (!page) { - LOGE("page == NULL"); - continue; - } - - elm_object_signal_emit(page, signal_to_send, - SIGNAL_LAYOUT_SOURCE); - } -} - -void livebox_panel_add_page_visible_state_set(bool visible) -{ - Evas_Object *page = NULL; - - page = livebox_scroller_get_last_page(); - if (!page) { - LOGE("page == NULL"); - return; - } - - if (visible) { - s_info.add_page = page; - - elm_object_signal_emit(page, SIGNAL_ADD_SHOW, - SIGNAL_LAYOUT_SOURCE); - elm_object_signal_emit(page, SIGNAL_EDIT_START, - SIGNAL_LAYOUT_SOURCE); - } else { - elm_object_signal_emit(page, SIGNAL_ADD_HIDE, - SIGNAL_LAYOUT_SOURCE); - } -} - -bool livebox_panel_can_add_page(void) -{ - int count = 0; - Eina_List *pages = page_scroller_get_all_pages(livebox_panel_get()); - count = eina_list_count(pages); - - - if (count < LIVEBOX_SCROLLER_MAX_PAGES) { - return true; - } else if (count == LIVEBOX_SCROLLER_MAX_PAGES && - livebox_panel_check_if_add_page_is_visible()) { - return true; - } - - __livebox_panel_show_warning_popup(); - return false; - -} - -int livebox_panel_find_empty_space(int span_w, int span_h, - int *pos_x, int *pos_y) -{ - Evas_Object *current_page = NULL; - Evas_Object *page = NULL; - Eina_List *l = NULL; - int page_index = -1; - - Eina_List *pages = page_scroller_get_all_pages(livebox_panel_get()); - if (!pages) { - LOGE("pages == NULL"); - return -1; - } - - - current_page = livebox_scroller_get_page(); - if (!current_page) { - LOGE("current_page == NULL"); - eina_list_free(pages); - return -1; - } - - if (__livebox_panel_find_empty_space(current_page, - span_w, span_h, pos_x, pos_y)) { - eina_list_free(pages); - return page_scroller_get_current_page(livebox_panel_get()); - } - - EINA_LIST_FOREACH(pages, l, page) { - ++page_index; - - if (!page) { - LOGE("page == NULL"); - continue; - } - - if (page == current_page) - continue; - - if (__livebox_panel_find_empty_space(page, span_w, span_h, - pos_x, pos_y)) { - eina_list_free(pages); - return page_index; - } - } - - eina_list_free(pages); - return -1; -} - -static int __livebox_panel_get_mouse_move_distance_square(int x, int y) -{ - int dx = x - s_info.mouse_press_pos.x; - int dy = y - s_info.mouse_press_pos.y; - - return (dx * dx) + (dy * dy); -} - -static bool __livebox_panel_find_empty_space(Evas_Object *page, int span_w, - int span_h, int *pos_x, int *pos_y) -{ - Evas_Object *livebox; - Eina_List *l; - Eina_List *livebox_list = NULL; - Eina_Rectangle *grid_item_rec = NULL; - int y = 0; - bool ret = true; - - livebox_list = livebox_utils_get_liveboxes_on_page_list(page); - if (!livebox_list) { - LOGE("livebox_list == NULL"); - *pos_y = 0; - *pos_x = 0; - return true; - } - - if (eina_list_count(livebox_list) == 0) { - *pos_y = 0; - *pos_x = 0; - eina_list_free(livebox_list); - return true; - } - - Eina_Rectangle *moved_item_rec = eina_rectangle_new(0, 0, - span_w, span_h); - if (!moved_item_rec) { - LOGE("moved_item_rec == NULL"); - eina_list_free(livebox_list); - return false; - } - - for (y = 0; y + span_h <= LIVEBOX_GRID_ROWS; ++y) { - moved_item_rec->y = y; - - EINA_LIST_FOREACH(livebox_list, l, livebox) { - grid_item_rec = livebox_utils_get_grid_widget_rectangle( - livebox); - if (!grid_item_rec) { - LOGE("grid_item_rec == NULL"); - eina_rectangle_free(grid_item_rec); - continue; - } - - if (eina_rectangle_intersection(moved_item_rec, - grid_item_rec)) { - ret = false; - eina_rectangle_free(grid_item_rec); - break; - } else { - *pos_y = y; - *pos_x = 0; - ret = true; - } - - eina_rectangle_free(grid_item_rec); - } - - if (ret) { - eina_list_free(livebox_list); - eina_rectangle_free(moved_item_rec); - return true; - } - } - - eina_rectangle_free(moved_item_rec); - eina_list_free(livebox_list); - return false; -} - -static void __livebox_panel_show_warning_popup(void) -{ - popup_data_t *data = popup_create_data(); - if (!data) { - LOGE("data == NULL"); - return; - } - - data->orientation = ELM_POPUP_ORIENT_CENTER; - data->popup_cancel_text = NULL; - data->popup_confirm_text = NULL; - data->popup_content_text = strdup(_("IDS_HS_POP_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_REMOVE_SOME_WIDGETS_AND_TRY_AGAIN")); - data->popup_title_text = NULL; - data->type = POPUP_INFO; - data->visible_time = 5.0; - - popup_show(data, NULL, NULL, NULL); -} - -static void __livebox_panel_freeze_scroller(void) -{ - - if (page_scroller_get_page_count(s_info.livebox_page_scroller) > 1) { - page_scroller_unfreeze(s_info.livebox_page_scroller); - } else { - page_scroller_freeze(s_info.livebox_page_scroller); - } -} - -static void __livebox_panel_page_count_changed_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - __livebox_panel_freeze_scroller(); -} - - -static Evas_Object *__livebox_panel_create_page(Evas_Object *livebox_scroller) -{ - Evas_Object *grid = NULL; - Evas_Object *rect = NULL; - - Evas_Object *livebox_container = util_create_edje_layout( - livebox_scroller, util_get_res_file_path(EDJE_LIVEBOX_CONTAINER_FILENAME), - GROUP_LIVEBOX_CONTAINER); - - if (!livebox_container) { - LOGE("Cannot create scroller layout"); - return NULL; - } - - grid = elm_grid_add(livebox_container); - if (!grid) { - LOGE("grid == NULL"); - evas_object_del(livebox_container); - return NULL; - } - - evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, - EVAS_HINT_FILL); - elm_grid_size_set(grid, LIVEBOX_TOTAL_COLUMNS, LIVEBOX_TOTAL_ROWS); - - elm_object_part_content_set(livebox_container, SIGNAL_CONTENT_SOURCE, - grid); - livebox_utils_create_grid_shadow_clipper(livebox_container); - - rect = evas_object_rectangle_add(evas_object_evas_get( - livebox_container)); - if (!rect) { - LOGE("rect == NULL"); - evas_object_del(grid); - evas_object_del(livebox_container); - return NULL; - } - - - evas_object_color_set(rect, 0, 0, 0, 0); - evas_object_size_hint_min_set(rect, home_screen_get_root_width(), - LIVEBOX_SIZE_REL * home_screen_get_root_height() - - (2.0*LIVEBOX_X_MIN * home_screen_get_root_width())); - evas_object_size_hint_max_set(rect, home_screen_get_root_width(), - LIVEBOX_SIZE_REL * home_screen_get_root_height() - - (2.0*LIVEBOX_X_MIN * home_screen_get_root_width())); - - elm_object_part_content_set(livebox_container, PART_PAGE_BG, rect); - - elm_object_signal_emit(livebox_container, SIGNAL_RESIZE_SLIDERS_HIDE, - SIGNAL_LIVEBOX_SOURCE); - elm_object_signal_callback_add(livebox_container, - SIGNAL_ADD_PAGE_CLICKED, SIGNAL_LAYOUT_SOURCE, - __livebox_panel_add_page_clicked_cb, NULL); - - grid_item_init_resize_callbacks(livebox_scroller, livebox_container); - - return livebox_container; -} - - -static void __livebox_panel_update_edit_mode_layout(Evas_Object *livebox_scroller_scroller) -{ - Eina_List *livebox_container_list; - Eina_List *node; - Evas_Object *livebox_container = NULL; - - if (!livebox_scroller_scroller) { - LOGE("Livebox panel layout is NULL"); - return; - } - - livebox_container_list = page_scroller_get_all_pages( - livebox_scroller_scroller); - if (s_info.edit_mode) { - EINA_LIST_FOREACH(livebox_container_list, node, - livebox_container) - { - if (!livebox_container) { - LOGE("livebox_container == NULL"); - continue; - } - - if (!__livebox_panel_is_page_empty(livebox_container)) { - __livebox_panel_set_remove_buttons_visiblity( - livebox_container, true); - } else { - elm_object_signal_emit(livebox_container, - SIGNAL_EMPTY_PAGE_EDIT_START, - SIGNAL_LIVEBOX_SOURCE); - } - elm_object_signal_emit(livebox_container, - SIGNAL_EDIT_START, SIGNAL_LIVEBOX_SOURCE); - } - } else { - EINA_LIST_FOREACH(livebox_container_list, node, - livebox_container) { - if (!livebox_container) { - LOGE("livebox_container == NULL"); - continue; - } - - __livebox_panel_set_remove_buttons_visiblity(livebox_container, - false); - - elm_object_signal_emit(livebox_container, - SIGNAL_EMPTY_PAGE_EDIT_STOP, - SIGNAL_LIVEBOX_SOURCE); - elm_object_signal_emit(livebox_container, - SIGNAL_EDIT_STOP, SIGNAL_LIVEBOX_SOURCE); - - elm_object_signal_emit(livebox_container, - SIGNAL_RESIZE_SLIDERS_HIDE, SIGNAL_LIVEBOX_SOURCE); - } - } - - eina_list_free(livebox_container_list); -} - -static bool __livebox_panel_is_page_empty(Evas_Object *page) -{ - Eina_List *lb_list = NULL; - - if (!page) { - LOGE("page == NULL"); - return true; - } - - if (page == s_info.add_page && - livebox_panel_check_if_add_page_is_visible()) { - return false; - } - - lb_list = livebox_utils_get_liveboxes_on_page_list(page); - if (!lb_list) { - LOGD("lb_list == NULL"); - return true; - } - - if (eina_list_count(lb_list) > 0) { - return false; - } - - return true; -} - - -static void _livebox_remove_button_mouse_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - LOGD("rm btn %s", emission); - - if (!obj) { - LOGE("obj == NULL"); - return; - } - - s_info.livebox_remove_button_state = (bool) strstr(emission, - "mouse,down"); -} - -static void __livebox_panel_register_longpress_callbacks(Evas_Object *livebox_scroller, - Evas_Object *page_layout, Evas_Object *livebox) -{ - Evas_Object *scroller = s_info.livebox_page_scroller; - - evas_object_event_callback_add(livebox, EVAS_CALLBACK_MOUSE_DOWN, - __livebox_panel_mouse_down_cb, page_layout); - evas_object_event_callback_add(livebox, EVAS_CALLBACK_MOUSE_UP, - __livebox_panel_mouse_up_cb, livebox_scroller); - elm_layout_signal_callback_add(livebox, SIGNAL_MOUSE_DOWN, - SIGNAL_REMOVE_SOURCE, _livebox_remove_button_mouse_cb, NULL); - elm_layout_signal_callback_add(livebox, SIGNAL_MOUSE_UP, - SIGNAL_REMOVE_SOURCE, _livebox_remove_button_mouse_cb, NULL); - - if (scroller) { - /*this callback should abort longpress*/ - evas_object_smart_callback_add(scroller, - SIGNAL_SCROLLER_DRAG_START, __livebox_panel_scrolled_cb, - NULL); - evas_object_smart_callback_add(scroller, - SIGNAL_SCROLLER_SCROLL, __livebox_panel_page_changed_cb, - NULL); - } -} - - -static void __livebox_panel_mouse_down_cb(void *data, Evas *evas, - Evas_Object *object, void *event_info) -{ - Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *) event_info; - int current_page_number = page_scroller_get_current_page( - s_info.livebox_page_scroller); - Evas_Object *page_layout = page_scroller_get_page( - s_info.livebox_page_scroller, current_page_number); - int obj_x = 0, obj_y = 0, obj_w = 0, obj_h = 0; - Evas_Object *widget = NULL; - - if (!ev || !page_layout) { - LOGE("Invalid event info"); - return; - } - - page_scroller_freeze(s_info.livebox_page_scroller); - - s_info.mouse_press_pos.x = ev->output.x; - s_info.mouse_press_pos.y = ev->output.y; - - evas_object_geometry_get(object, &obj_x, &obj_y, &obj_w, &obj_h); - - if (s_info.edit_mode) { - - widget = elm_layout_content_get(object, PART_LIVEBOX); - if (!widget) { - LOGE("widget == NULL"); - return; - } - - livebox_widget_set_event_blocking(widget); - } - - if (livebox_reposition_info_s.longpress_timer) { - LOGD("Longpress timer existed - this should not happen"); - ecore_timer_del(livebox_reposition_info_s.longpress_timer); - livebox_reposition_info_s.longpress_timer = NULL; - } - - if (!s_info.livebox_remove_button_state) { - livebox_reposition_info_s.longpress_timer = ecore_timer_add( - LIVEBOX_LONGPRESS_TIME, __livebox_panel_longpress_cb, object); - } else { - LOGD("Remove button pressed"); - } -} - -static void __libebox_panel_toggle_selected_livebox(Evas_Object *livebox, Evas_Object *page) -{ - Evas_Object *prev_selected_page = NULL; - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (!page) { - LOGE("page == NULL"); - return; - } - - livebox_utils_set_selected_livebox(livebox, page); - prev_selected_page = livebox_utils_get_prev_livebox_layout(); - if (prev_selected_page && page != prev_selected_page) { - /*page != prev_selected_page' when page is not change the sliders - should not disappear */ - LOGD("Previous page found"); - elm_object_signal_emit(prev_selected_page, - SIGNAL_RESIZE_SLIDERS_HIDE, SIGNAL_LIVEBOX_SOURCE); - elm_object_signal_emit(prev_selected_page, - SIGNAL_GRID_SHADOW_HIDE, PART_GRID_BG); - } -} - -static void __livebox_panel_mouse_up_cb(void *data, Evas *evas, - Evas_Object *object, void *event_info) -{ - int current_page_number = page_scroller_get_current_page( - s_info.livebox_page_scroller); - Evas_Object *livebox_container = page_scroller_get_page( - s_info.livebox_page_scroller, current_page_number); - - s_info.is_longpress = false; - page_scroller_unfreeze(s_info.livebox_page_scroller); - - __livebox_panel_freeze_scroller(); - - __livebox_panel_set_remove_button_visibility( - grid_reposition_get_repositioned_item(), true); - __livebox_panel_set_reposition_bg_visibility(false); - elm_object_signal_emit(livebox_container, SIGNAL_GRID_SHADOW_HIDE, PART_GRID_BG); - - grid_reposition_end(); - livebox_utils_set_shadow_visibility(false); - - LOGD("PAGE CHANGE TIMER DEL: %p", - livebox_reposition_info_s.page_change_timer); - ecore_timer_del(livebox_reposition_info_s.page_change_timer); - livebox_reposition_info_s.page_change_timer = NULL; - - if (livebox_reposition_info_s.longpress_timer) { - LOGD("NOT LONGPRESS"); - ecore_timer_del(livebox_reposition_info_s.longpress_timer); - - if (home_screen_get_view_type() != HOMESCREEN_VIEW_HOME_EDIT) { - LOGD("No edit mode exiting..."); - return; - } - - livebox_reposition_info_s.longpress_timer = NULL; - __libebox_panel_toggle_selected_livebox(object, livebox_container); - grid_item_set_resize_livebox_sliders(object, livebox_container); - } -} - -static void __livebox_panel_scrolled_cb(void *data, Evas_Object *obj, - void *event_info) -{ - if (livebox_reposition_info_s.longpress_timer) { - ecore_timer_del(livebox_reposition_info_s.longpress_timer); - livebox_reposition_info_s.longpress_timer = NULL; - } -} - -static void __livebox_panel_page_changed_cb(void *data, Evas_Object *obj, - void *event_info) -{ - /*livebox_utils_set_shadow_visibility(false);*/ -} - - -static Eina_Bool _longpress_timer_cb(void *data) -{ - grid_reposition_start(); - __livebox_panel_hide_remove_button( - grid_reposition_get_repositioned_item()); - __livebox_panel_set_reposition_bg_visibility(true); - - return ECORE_CALLBACK_CANCEL; -} - -/*@todo add check to proceed only if edit mode is ON*/ -static Eina_Bool __livebox_panel_longpress_cb(void *data) -{ - LOGD("Longpress!"); - int current_page_number = page_scroller_get_current_page( - s_info.livebox_page_scroller); - Evas_Object *longpressed_page = page_scroller_get_page( - s_info.livebox_page_scroller, current_page_number); - - livebox_reposition_info_s.longpress_timer = NULL; - Evas_Object *livebox = (Evas_Object *) data; - Evas_Object *widget = elm_layout_content_get(livebox, PART_LIVEBOX); - - if (!widget) { - LOGE("widget == NULL"); - return EINA_FALSE; - } - livebox_widget_set_event_blocking(widget); - - if (!longpressed_page) { - LOGE("No longpressed object stored"); - return EINA_FALSE; - } - - if (s_info.is_resizing) - return EINA_FALSE; - - - if (s_info.livebox_remove_button_state) - return EINA_FALSE; - - s_info.is_longpress = true; - - __libebox_panel_toggle_selected_livebox(livebox, longpressed_page); - elm_object_signal_emit(longpressed_page, SIGNAL_GRID_SHADOW_SHOW, PART_GRID_BG); - - grid_item_set_resize_sliders_visibility(longpressed_page, false); - grid_reposition_init(livebox_utils_get_livebox_container_grid( - longpressed_page), livebox); - page_scroller_freeze(s_info.livebox_page_scroller); - - if (home_screen_get_view_type() != HOMESCREEN_VIEW_HOME_EDIT) { - home_screen_set_view_type(HOMESCREEN_VIEW_HOME_EDIT); - livebox_panel_set_edit_mode_layout(true); - livebox_panel_change_edit_mode_state(false); - ecore_timer_add(0.1, _longpress_timer_cb, longpressed_page); - } else { - grid_reposition_start(); - __livebox_panel_hide_remove_button(livebox); - __livebox_panel_set_reposition_bg_visibility(true); - } - - return EINA_FALSE; -} - -static void __livebox_panel_add_page_clicked_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - Evas_Object *lvb_scorller = NULL; - int page_count = -1; - - lvb_scorller = livebox_panel_get(); - if (!lvb_scorller) { - LOGE("Failed to get scroller"); - return; - } - - page_count = page_scroller_get_page_count(lvb_scorller); - - if (page_count < LIVEBOX_SCROLLER_MAX_PAGES) { - /*remove add_page button from last page*/ - livebox_panel_add_page_visible_state_set(false); - - /*add new page*/ - livebox_panel_add_empty_page(lvb_scorller); - - /*show add button on last page*/ - livebox_panel_add_page_visible_state_set(true); - } else { - livebox_panel_add_page_visible_state_set(false); - /*elm_object_signal_emit(dynamic_index->indices[5], - EDJE_SIGNAL_ADD_PAGE_HIDE, EDJE_SIGNAL_LAYOUT_SOURCE);*/ - } - - elm_object_signal_emit(lvb_scorller, SIGNAL_SCROLLER_PAGE_COUNT_CHANGED, - SIGNAL_LAYOUT_SOURCE); -} - -Evas_Object *livebox_scroller_get_last_page(void) -{ - Evas_Object *lvb_scorller = NULL; - Evas_Object *page = NULL; - - Eina_List *all_pages = NULL; - int page_count = -1; - - lvb_scorller = s_info.livebox_page_scroller; - if (!lvb_scorller) { - LOGE("Failed to get livebox scroller"); - return NULL; - } - - all_pages = page_scroller_get_all_pages(lvb_scorller); - if (!all_pages) { - LOGE("Failed to get page"); - return NULL; - } - - page_count = eina_list_count(all_pages); - if (!page_count) { - LOGE("Failed to get page count!"); - return NULL; - } - - page = eina_list_nth(all_pages, --page_count); - if (!page) { - LOGE("Failed to get page"); - return NULL; - } - - return page; -} - -static void __livebox_panel_scroll_start_cb(void *data, Evas_Object *obj, void *info) -{ - Evas_Object *page = livebox_utils_get_selected_livebox_layout(); - if (!page) { - LOGE("page == NULL"); - return; - } - - grid_item_set_resize_sliders_visibility(page, false); -} - - -static Eina_Bool __livebox_panel_change_page_timer_start_cb(void *data) -{ - bool is_right = (bool)data; - int page_count = -1; - int current_page = -1; - Evas_Object *grid = NULL; - Evas_Object *page = NULL; - int mx = -1, my = -1; - - if (!s_info.livebox_page_scroller) { - LOGE("s_info.livebox_page_scroller == NULL"); - return false; - } - - page_count = page_scroller_get_page_count( - s_info.livebox_page_scroller); - current_page = page_scroller_get_current_page( - s_info.livebox_page_scroller); - - LOGD("PAGE CHANGE... %s", is_right ? "Going right" : "Going left"); - - livebox_utils_repack_grid_object(NULL, livebox_utils_get_shadow(), - livebox_utils_get_livebox_container_grid( - livebox_utils_get_selected_livebox_layout()), NULL); - - /*TODO: Check if this can be removed*/ - livebox_utils_repack_grid_object(NULL, - livebox_utils_selected_livebox_get(), - livebox_utils_get_livebox_container_grid( - livebox_utils_get_selected_livebox_layout()), - NULL); - - page_scroller_unfreeze(s_info.livebox_page_scroller); - - if (is_right) { - ++current_page; - } else { - --current_page; - } - - current_page = current_page % page_count; - LOGD("CURRENT PAGE: %d", current_page); - - page = page_scroller_get_page(s_info.livebox_page_scroller, - current_page); - if (!page) { - LOGE("page == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - grid = livebox_utils_get_livebox_container_grid(page); - if (!grid) { - LOGE("grid == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - elm_scroller_page_bring_in(s_info.livebox_page_scroller, - current_page, 0); - - page_scroller_freeze(s_info.livebox_page_scroller); - __libebox_panel_toggle_selected_livebox(livebox_utils_selected_livebox_get(), page); - grid_reposition_set_current_grid(grid); - livebox_utils_repack_grid_object(livebox_utils_selected_livebox_get(), - livebox_utils_get_shadow(), NULL, grid); - - livebox_utils_get_cursor_pos(&mx, &my); - grid_reposition_move(mx, my); - - livebox_utils_set_shadow_visibility(true); - - return ECORE_CALLBACK_RENEW; -} - -static void __livebox_panel_set_remove_button_visibility( - Evas_Object *livebox, bool visible) -{ - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (visible) { - elm_layout_signal_emit(livebox, - SIGNAL_LIVEBOX_REMOVE_BUTTON_SHOW, - SIGNAL_LIVEBOX_SOURCE); - } else { - elm_layout_signal_emit(livebox, - SIGNAL_LIVEBOX_REMOVE_BUTTON_HIDE, - SIGNAL_LIVEBOX_SOURCE); - } -} - -static void __livebox_panel_hide_remove_button(Evas_Object *livebox) -{ - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - elm_layout_signal_emit(livebox, SIGNAL_REMOVE_BUTTON_INSTANT_HIDE, - SIGNAL_LIVEBOX_SOURCE); -} - -static void __livebox_panel_set_remove_buttons_visiblity(Evas_Object *page, bool visible) -{ - Eina_List *l = NULL; - Evas_Object *lb = NULL; - - if (!page) { - LOGE("page == NULL"); - return; - } - - Eina_List *list = livebox_utils_get_liveboxes_on_page_list(page); - - if (!list) { - LOGE("list == NULL"); - return; - } - - EINA_LIST_FOREACH(list, l, lb) { - if (!lb) { - LOGE("lb == NULL"); - continue; - } - __livebox_panel_set_remove_button_visibility(lb, visible); - } -} - -static void __livebox_panel_set_reposition_bg_visibility(bool visible) -{ - Evas_Object *livebox = grid_reposition_get_repositioned_item(); - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (visible) { - elm_object_signal_emit(livebox, - SIGNAL_LIVEBOX_REPOSITION_BG_SHOW, - SIGNAL_LIVEBOX_SOURCE); - } else { - elm_object_signal_emit(livebox, - SIGNAL_LIVEBOX_REPOSITION_BG_HIDE, - SIGNAL_LIVEBOX_SOURCE); - } -} - -static Evas_Object *__livebox_panel_get_widget_layout(Evas_Object* obj) -{ - Evas_Object *widget = elm_layout_content_get(obj, PART_LIVEBOX); - if (!widget) { - LOGE("widget == NULL"); - return NULL; - } - - return widget; -} - -static void __livebox_panel_del_cb(void *data, Evas_Object *obj, const char *emission, - const char *source) -{ - Evas_Object *grid = NULL; - Evas_Object *widget = NULL; - Tree_node_t *node = NULL; - - int current_page_number = - page_scroller_get_current_page(s_info.livebox_page_scroller); - - Evas_Object *page_container = - page_scroller_get_page( - s_info.livebox_page_scroller, current_page_number); - if (!page_container) { - LOGE("page_container == NULL"); - return; - } - elm_object_signal_emit(page_container, SIGNAL_RESIZE_SLIDERS_HIDE, - SIGNAL_LIVEBOX_SOURCE); - - LOGI("DELETE LIVEBOX BUTTON PRESSED"); - - node = evas_object_data_get(obj, KEY_ICON_DATA); - if (!node) { - LOGE("node == NULL"); - return; - } - - widget = __livebox_panel_get_widget_layout(obj); - livebox_widget_del(widget); - data_model_del_item(node); - - evas_object_del(obj); - - grid = livebox_utils_get_livebox_container_grid(page_container); - if (!grid) { - LOGE("page_container == NULL"); - return; - } - - livebox_utils_repack_grid_object(NULL, livebox_utils_get_shadow(), - grid, NULL); - - home_screen_print_tree(); -} - -static bool __livebox_panel_iterate_node_fill_cb(Tree_node_t *page_node, Tree_node_t *node, - void *data) -{ - int *widget_pos_h = (int *)data; - - Evas_Object *page = page_node->data->layout; - if (!page) { - LOGE("page == NULL"); - return false; - } - - livebox_panel_add_livebox(node, page, node->data->appid, - node->data->col, node->data->row, node->data->col_span, - node->data->row_span, - node->data->content_info); - - *widget_pos_h += LIVEBOX_ON_CREATE_SIZE/2; - return true; -} - -static bool __livebox_panel_iterate_page_fill_cb(Tree_node_t *parent, Tree_node_t *page_node, - void *data) -{ - Evas_Object *page = NULL; - Evas_Object *liveboxes = s_info.livebox_page_scroller; - int *widget_pos_h = (int *)data; - *widget_pos_h = 0; - - page = livebox_panel_add_page(page_node, liveboxes); - if (!page) { - LOGE("[FAILED][page]"); - data_model_del_item(page_node); - return false; - } - - page_node->data->layout = page; - return true; -} diff --git a/src/livebox/livebox_utils.c b/src/livebox/livebox_utils.c deleted file mode 100644 index 4d01cdf..0000000 --- a/src/livebox/livebox_utils.c +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "livebox/livebox_utils.h" -#include "homescreen-efl.h" - -static struct -{ - Evas_Object *selected_livebox; - Evas_Object *selected_livebox_layout; - Evas_Object *prev_livebox_layout; - Evas_Object *shadow; -} -s_info = { - .selected_livebox = NULL, - .selected_livebox_layout = NULL, - .prev_livebox_layout = NULL, - .shadow = NULL, -}; - -static Evas_Object *__livebox_utils_create_grid_bg(Evas_Object *parent); -static Eina_Rectangle *__livebox_utils_get_grid_rectangle(Evas_Object *obj); -static bool __livebox_utils_check_intersection(Evas_Object *obj_a, - Eina_Rectangle *rect); - -Eina_Rectangle *livebox_utils_get_widget_rectangle(Evas_Object *obj) -{ - int x = -1; - int y = -1; - int w = -1; - int h = -1; - Eina_Rectangle *rect = NULL; - - if (!obj) { - LOGE("obj == NULL"); - return NULL; - } - evas_object_geometry_get(obj, &x, &y, &w, &h); - - rect = eina_rectangle_new(x, y, w, h); - if (!rect) { - LOGE("rect == NULL"); - return NULL; - } - - return rect; -} - -Eina_Rectangle *livebox_utils_get_grid_widget_rectangle(Evas_Object *obj) -{ - int x = -1; - int y = -1; - int w = -1; - int h = -1; - Eina_Rectangle *rect = NULL; - - if (!obj) { - LOGE("obj == NULL"); - return NULL; - } - elm_grid_pack_get(obj, &x, &y, &w, &h); - - rect = eina_rectangle_new(x, y, w, h); - if (!rect) { - LOGE("rect == NULL"); - return NULL; - } - - return rect; -} - -Eina_Rectangle *livebox_utils_convert_virtual_grid_geo_to_screen(Evas_Object *grid, - int x, int y, int w, int h) -{ - int gx = -1; - int gy = -1; - int gw = -1; - int gh = -1; - - int vw = -1; - int vh = -1; - - Eina_Rectangle *rec = NULL; - - if (!grid) { - LOGE("grid == NULL"); - return NULL; - } - - evas_object_geometry_get(grid, &gx, &gy, &gw, &gh); - elm_grid_size_get(grid, &vw, &vh); - - rec = eina_rectangle_new( - gx + (int)((float)x/vw * gw), - gy + (int)((float)y/vh * gh), - (int)((float)w/vw*gw), - (int)((float)h/vh*gh) - ); - - if (!rec) { - LOGE("rec == NULL"); - return NULL; - } - - return rec; -} - -bool livebox_utils_check_rect_list_grid_interesction(Eina_Rectangle *rect, - Evas_Object *obj, Eina_List *list) -{ - Eina_List *l = NULL; - Evas_Object *list_obj = NULL; - - if (!list) { - LOGE("list == NULL"); - return true; - } - - EINA_LIST_FOREACH(list, l, list_obj) { - if (!list_obj) { - LOGE("list_obj == NULL"); - continue; - } - - if (list_obj != obj && __livebox_utils_check_intersection( - list_obj, rect)) { - LOGD("Intersection found"); - return true; - } - } - - return false; -} - -Eina_List *livebox_utils_get_liveboxes_on_gird(Evas_Object *grid) -{ - Eina_List *livebox_list = NULL; - - if (!grid) { - LOGE("grid == NULL"); - return NULL; - } - - livebox_list = elm_grid_children_get(grid); - if (!livebox_list) { - LOGE("livebox_list == NULL"); - return NULL; - } - livebox_list = eina_list_remove(livebox_list, s_info.shadow); - - return livebox_list; -} - - -Eina_List *livebox_utils_get_liveboxes_on_page_list(Evas_Object *obj) -{ - Evas_Object *grid = NULL; - - if (!obj) { - LOGE("o == NULL"); - return NULL; - } - - grid = elm_layout_content_get(obj, SIGNAL_CONTENT_SOURCE); - if (!grid) { - LOGE("grid == NULL"); - return NULL; - } - - return livebox_utils_get_liveboxes_on_gird(grid); -} -/* ---------------------------------------------------------------------------*/ - -Evas_Object *livebox_utils_get_selected_livebox_layout(void) -{ - return s_info.selected_livebox_layout; -} - -Evas_Object *livebox_utils_get_prev_livebox_layout(void) -{ - return s_info.prev_livebox_layout; -} - -Evas_Object *livebox_utils_selected_livebox_get(void) -{ - return s_info.selected_livebox; -} - -void livebox_utils_set_selected_livebox(Evas_Object *livebox, - Evas_Object *layout) -{ - LOGD("Selected_livebox_layout = %p; prev = %p", - s_info.selected_livebox_layout, s_info.prev_livebox_layout); - - s_info.prev_livebox_layout = s_info.selected_livebox_layout; - s_info.selected_livebox = livebox; - s_info.selected_livebox_layout = layout; -} - -Evas_Object *livebox_utils_get_livebox_container_grid(Evas_Object *container) -{ - Evas_Object *grid = elm_layout_content_get(container, "content"); - if (!grid) { - LOGE("grid == NULL"); - return NULL; - } - - return grid; -} - - -void livebox_utils_set_grid_object_pack(Evas_Object *livebox, - Evas_Object *item_to_pack, Evas_Object *grid) -{ - int x = -1, y = -1, w = -1, h = -1; - int out_x, out_y; - - if (!grid) { - LOGE("grid == NULL"); - return; - } - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (!item_to_pack) { - LOGE("item_to_pack == NULL"); - return; - } - - livebox_utils_convert_size_to_grid_coord(livebox, grid, &x, &y, &w, &h); - livebox_utils_normalize_grid_pos(x, y, w, h, &out_x, &out_y); - elm_grid_pack_set(item_to_pack, out_x, out_y, w, h); -} - -void livebox_utils_repack_grid_object(Evas_Object *livebox, - Evas_Object *item_to_pack, Evas_Object *grid_from, Evas_Object *grid_to) -{ - int x = -1, y = -1, w = -1, h = -1; - int out_x, out_y; - - if (!item_to_pack) { - LOGE("item_to_pack == NULL"); - return; - } - - if (grid_from) { - elm_grid_pack_get(item_to_pack, &x, &y, &w, &h); - LOGD("Unpacking from: %p -> %d %d %d %d", - grid_from, x, y, w, h); - - elm_grid_unpack(grid_from, item_to_pack); - } - - if (livebox && grid_to) { - livebox_utils_convert_size_to_grid_coord(livebox, - grid_to, &x, &y, &w, &h); - livebox_utils_normalize_grid_pos(x, y, w, h, &out_x, &out_y); - elm_grid_pack(grid_to, item_to_pack, out_x, out_y, w, h); - } -} - - -void livebox_utils_convert_size_to_grid_coord(Evas_Object *livebox, Evas_Object *grid, - int *out_x, int *out_y, int *out_w, int *out_h) -{ - int lx = 0, ly, lw = 0, lh = 0; - int gx = 0, gy, gw = 0, gh = 0; - float ratio_x = 0, ratio_y = 0; - - if (!livebox) { - LOGE("livebox == NULL"); - return; - } - - if (!grid) { - LOGE("grid == NULL"); - return; - } - - if (!out_w || !out_h) { - LOGE("output: out_w == %p; out_h == %p", out_w, out_h); - return; - } - - evas_object_geometry_get(livebox, &lx, &ly, &lw, &lh); - evas_object_geometry_get(grid, &gx, &gy, &gw, &gh); - - if (gw == 0 || gh == 0) { - LOGE("Grid wrong size gw == %d; gh == %d", gw, gh); - return; - } - - lx -= gx; - ly -= gy; - - ratio_x = (float)lx / gw; - ratio_y = (float)ly / gh; - - *out_x = round(ratio_x * LIVEBOX_TOTAL_COLUMNS); - *out_y = round(ratio_y * LIVEBOX_TOTAL_ROWS); - - ratio_x = (float)lw / gw; - ratio_y = (float)lh / gh; - - *out_w = round(ratio_x * LIVEBOX_TOTAL_COLUMNS); - *out_h = round(ratio_y * LIVEBOX_TOTAL_ROWS); - - *out_x /= LIVEBOX_GRID_ROWS_CELLS_MULTI; - *out_x *= LIVEBOX_GRID_ROWS_CELLS_MULTI; - - *out_y /= LIVEBOX_GRID_ROWS_CELLS_MULTI; - *out_y *= LIVEBOX_GRID_ROWS_CELLS_MULTI; -} - -void livebox_utils_normalize_grid_pos(int obj_x, int obj_y, int obj_w, - int obj_h, int *out_x, int *out_y) -{ - int dx = obj_x + obj_w; - int dy = obj_y + obj_h; - - if (dx > LIVEBOX_TOTAL_COLUMNS) - obj_x = (LIVEBOX_TOTAL_COLUMNS - obj_w); - - if (dy > LIVEBOX_TOTAL_ROWS) - obj_y = (LIVEBOX_TOTAL_ROWS - obj_h); - - if (obj_x < 0) - obj_x = 0; - - if (obj_y < 0) - obj_y = 0; - - *out_x = obj_x; - *out_y = obj_y; -} - -/* -------------------------------------- SHADOW -----------------------------*/ - -Evas_Object *livebox_utils_get_shadow() -{ - if (!s_info.shadow) { - LOGE("s_info.shadow == NULL"); - return NULL; - } - - return s_info.shadow; -} - -void livebox_utils_shadow_unpack(void) -{ - Evas_Object *page = NULL; - Evas_Object *grid = NULL; - - page = livebox_utils_selected_livebox_get(); - if (!page) { - LOGE("page == NULL"); - return; - } - - grid = livebox_utils_get_livebox_container_grid(page); - if (!grid) { - LOGE("grid == NULL"); - return; - } - - livebox_utils_repack_grid_object(NULL, livebox_utils_get_shadow(), - grid, NULL); -} - -void livebox_utils_create_shadow(Evas_Object *parent) -{ - Evas *e = NULL; - Evas_Object *shadow = NULL; - - if (!parent) { - LOGE("parent == NULL"); - return; - } - - e = evas_object_evas_get(parent); - if (!e) { - LOGE("parent == NULL"); - return; - } - - - shadow = evas_object_rectangle_add(e); - if (!shadow) { - LOGE("shadow == NULL"); - return; - } - - s_info.shadow = shadow; - evas_object_color_set(shadow, LIVEBOX_GRID_BG_ALPHA, - LIVEBOX_GRID_BG_ALPHA, LIVEBOX_GRID_BG_ALPHA, - LIVEBOX_GRID_BG_ALPHA); - evas_object_pass_events_set(shadow, true); -} - -void livebox_utils_set_shadow_visibility(bool visible) -{ - if (!s_info.shadow) { - LOGE("s_info.shadow == NULL"); - return; - } - - if (visible) { - evas_object_color_set(s_info.shadow, LIVEBOX_GRID_BG_ALPHA, - LIVEBOX_GRID_BG_ALPHA, LIVEBOX_GRID_BG_ALPHA, - LIVEBOX_GRID_BG_ALPHA); - evas_object_show(s_info.shadow); - } else { - evas_object_color_set(s_info.shadow, 0, 0, 0, 0); - evas_object_hide(s_info.shadow); - } -} - -void livebox_utils_create_grid_shadow_clipper(Evas_Object *livebox_container) -{ - Evas_Object *grid_bg = NULL; - - if (!livebox_container) { - LOGD("livebox_container == NULL"); - return; - } - - grid_bg = __livebox_utils_create_grid_bg(livebox_container); - if (!grid_bg) { - LOGD("grid_bg == NULL"); - return; - } - - elm_object_part_content_set(livebox_container, PART_GRID_BG, grid_bg); - evas_object_clip_set(grid_bg, s_info.shadow); - - elm_layout_signal_emit(livebox_container, - SIGNAL_GRID_SHADOW_HIDE, PART_GRID_BG); -} - -static Evas_Object *__livebox_utils_create_grid_bg(Evas_Object *parent) -{ - Evas *e = NULL; - Evas_Object *table = NULL; - Evas_Object *item; - int i = 0, j = 0; - int w = -1, h = -1; - - if (!parent) { - LOGE("parent == NULL"); - return NULL; - } - - e = evas_object_evas_get(parent); - if (!e) { - LOGE("parent == NULL"); - return NULL; - } - - table = elm_table_add(parent); - if (!table) { - LOGE("table == NULL"); - return NULL; - } - - w = (LIVEBOX_GRID_BG_PADDING / - (float)ROOT_WIN_W) * home_screen_get_root_width(); - h = (LIVEBOX_GRID_BG_PADDING / - (float)ROOT_WIN_H) * home_screen_get_root_height(); - - elm_table_padding_set(table, w, h); - elm_table_homogeneous_set(table, EINA_TRUE); - - for (i = 0; i < LIVEBOX_GRID_COLUMNS; ++i) { - for (j = 0; j < LIVEBOX_GRID_ROWS; ++j) { - item = evas_object_rectangle_add(e); - if (!item) { - LOGE("item == NULL"); - evas_object_del(table); - return NULL; - } - - evas_object_color_set(item, 0, 0, 0, 30); - evas_object_pass_events_set(item, true); - evas_object_show(item); - evas_object_size_hint_weight_set(item, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_fill_set(item, - EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_table_pack(table, item, i, j, 1, 1); - } - } - - return table; -} - -void livebox_utils_get_cursor_pos(int *mx, int *my) -{ - Evas *e = evas_object_evas_get(home_screen_get_win()); - if (!e) { - LOGE("e == NULL"); - return; - } - evas_pointer_canvas_xy_get(e, mx, my); -} - -static Eina_Rectangle *__livebox_utils_get_grid_rectangle(Evas_Object *obj) -{ - LOGD(""); - Eina_Rectangle *rect; - int x = -1, y = -1, w = -1, h = -1; - if (!obj) { - LOGE("obj == NULL"); - return NULL; - } - - elm_grid_pack_get(obj, &x, &y, &w, &h); - rect = eina_rectangle_new(x, y, w, h); - - if (!rect) { - LOGE("rect == NULL"); - return NULL; - } - - return rect; -} - -static bool __livebox_utils_check_intersection(Evas_Object *obj_a, - Eina_Rectangle *rect) -{ - Eina_Rectangle *rect_o = NULL; - bool out = true; - - if (!obj_a) { - LOGE("obj == NULL"); - return true; - } - - rect_o = __livebox_utils_get_grid_rectangle(obj_a); - - if (!rect_o || !rect) { - LOGE("Rectangle not created: rect_o = %p; rect = %p", - rect_o, rect); - return true; - } - - LOGD("Intersection: <%dx%d - %dx%d> - <%dx%d - %dx%d>", - rect_o->x, rect_o->y, rect_o->w, rect_o->h, - rect->x, rect->y, rect->w, rect->h); - - out = eina_rectangles_intersect(rect_o, rect); - - eina_rectangle_free(rect_o); - - return out; -} diff --git a/src/livebox/livebox_widget.c b/src/livebox/livebox_widget.c deleted file mode 100644 index 7124468..0000000 --- a/src/livebox/livebox_widget.c +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#include "homescreen-efl.h" -#include "livebox/livebox_widget.h" -#include "livebox/livebox_panel.h" -#include "livebox/livebox_utils.h" -#include "util.h" -#include "data_model.h" -#include "page_scroller.h" -#include "popup.h" - - -static int __livebox_widget_get_pkg_list_cb(const char *pkg_id, const char *widget_id, int is_prime, void *data); - -static int request_cb(const char *appid, - const char *name, - int type, - const char *content_info, - const char *icon, - int pid, - double period, - int allow_duplicate, - void *data); - -static void update_content_info(Evas_Object *widget, const char *content_info); - -static struct { - Eina_List *widget_list; -} s_info = { - .widget_list = NULL, -}; - -void livebox_widget_init(void) -{ - int ret = -1; - - ret = widget_service_get_widget_list(__livebox_widget_get_pkg_list_cb, NULL); - - if (ret < 0) { - LOGE("FAILED TO GET PKGLIST. ERROR CODE: %d", ret); - return; - } - - LOGI("SUCCESS TO GET PKGLIST. COUNT: %d", ret); - widget_viewer_evas_init(home_screen_get_win()); - - ret = shortcut_set_request_cb(request_cb, NULL); - if (ret < 0) - LOGE("Failed to add shortcut event listener: 0x%X\n", ret); -} - -Eina_List *livebox_widget_get_list(void) -{ - if (!s_info.widget_list) { - LOGE("s_info.widget_list == NULL"); - return NULL; - } - - return s_info.widget_list; -} - -static void widget_content_info_updated_cb(void *data, Evas_Object *obj, void *event_info) -{ - widget_evas_event_info_s *info = event_info; - const char *content_info; - - if (info->error != WIDGET_ERROR_NONE || !info->widget_app_id) - return; - - content_info = widget_viewer_evas_get_content_info(obj); - LOGD("Content inf is updated [%s] - [%s]\n", info->widget_app_id, content_info); - - update_content_info(obj, content_info); - -} - -Evas_Object *livebox_widget_add(const char *pkg_name, Evas_Object *parent, char *content_info) -{ - Evas_Object *livebox = widget_viewer_evas_add_widget(parent, pkg_name, content_info, WIDGET_VIEWER_EVAS_DEFAULT_PERIOD); - if (!livebox) { - LOGE("livebox == NULL"); - return NULL; - } - - evas_object_smart_callback_add(livebox, WIDGET_SMART_SIGNAL_EXTRA_INFO_UPDATED, widget_content_info_updated_cb, NULL); - - return livebox; -} - -void livebox_widget_del(Evas_Object *widget) -{ - if (!widget) { - LOGE("widget == NULL"); - return; - } - - LOGI("DELETING WIDGET: %s", widget_viewer_evas_get_widget_id(widget)); - widget_viewer_evas_set_permanent_delete(widget, 1); -} - -void livebox_widget_fini(void) -{ - Eina_List *l; - widget_info_t *widget = NULL; - - if (!s_info.widget_list) { - LOGE("s_info.widget_list == NULL"); - return; - } - - EINA_LIST_FOREACH(s_info.widget_list, l, widget) { - if (!widget) { - LOGE("widget == NULL"); - continue; - } - - free(widget->pkg_id); - free(widget->widget_id); - } - - eina_list_free(s_info.widget_list); -} - -void livebox_widget_viewer_paused(void) -{ - int ret; - ret = widget_viewer_evas_notify_paused_status_of_viewer(); - LOGD("Viewer is paused: %d\n", ret); -} - -void livebox_widget_viewer_resumed(void) -{ - Evas_Object *page = NULL; - Eina_List *lb_layouts = NULL; - Eina_List *l = NULL; - Eina_List *l2 = NULL; - Eina_List *pages = NULL; - Evas_Object *widget = NULL; - Evas_Object *lb_layout = NULL; - const char *content_info = NULL; - int ret; - static Eina_Bool app_created = EINA_TRUE; - - ret = widget_viewer_evas_notify_resumed_status_of_viewer(); - LOGD("Viewer is resumed: %d\n", ret); - - if (app_created) { - app_created = EINA_FALSE; - return; - } - - pages = page_scroller_get_all_pages(livebox_panel_get()); - - if (!pages) { - LOGE("pages == NULL"); - return; - } - - EINA_LIST_FOREACH(pages, l, page) { - if (!page) { - LOGE("page == NULL"); - return; - } - - lb_layouts = livebox_utils_get_liveboxes_on_page_list(page); - if (!lb_layouts) { - LOGE("lb_layouts == NULL"); - continue; - } - - EINA_LIST_FOREACH(lb_layouts, l2, lb_layout) { - if (!lb_layout) { - LOGE("lb_layout == NULL"); - continue; - } - - widget = elm_layout_content_get(lb_layout, PART_LIVEBOX); - if (!widget) { - LOGE("widget == NULL"); - return; - } - - content_info = widget_viewer_evas_get_content_info(widget); - update_content_info(widget, content_info); - - LOGD("Content inf is updated [%s] - [%s]\n", - widget_viewer_evas_get_widget_id(widget), - content_info); - } - } -} - -void livebox_widget_get_dimensions(int size, int *x, int *y) -{ - if (!x || !y) { - LOGE("Wrong arguments provided: %p %p", x, y); - return; - } - - switch (size) { - case WIDGET_SIZE_TYPE_1x1: - *x = 1; - *y = 1; - break; - case WIDGET_SIZE_TYPE_2x1: - *x = 2; - *y = 1; - break; - case WIDGET_SIZE_TYPE_2x2: - *x = 2; - *y = 2; - break; - case WIDGET_SIZE_TYPE_4x1: - *x = 4; - *y = 1; - break; - case WIDGET_SIZE_TYPE_4x2: - *x = 4; - *y = 2; - break; - case WIDGET_SIZE_TYPE_4x3: - *x = 4; - *y = 3; - break; - case WIDGET_SIZE_TYPE_4x4: - *x = 4; - *y = 4; - break; - case WIDGET_SIZE_TYPE_4x5: - *x = 4; - *y = 5; - break; - case WIDGET_SIZE_TYPE_4x6: - *x = 4; - *y = 6; - break; - case WIDGET_SIZE_TYPE_EASY_1x1: - *x = 1; - *y = 1; - break; - case WIDGET_SIZE_TYPE_EASY_3x1: - *x = 3; - *y = 1; - break; - case WIDGET_SIZE_TYPE_EASY_3x3: - *x = 3; - *y = 3; - break; - case WIDGET_SIZE_TYPE_FULL: - *x = 4; - *y = 4; - break; - case WIDGET_SIZE_TYPE_UNKNOWN: - *x = -1; - *y = -1; - break; - default: - *x = -1; - *y = -1; - } -} - -void livebox_widget_get_size_available(Evas_Object *widget, int *cnt, int **size_list) -{ - int ret = -1; - const char *widget_id = NULL; - *cnt = 0; - - if (!widget) { - LOGE("widget == NULL"); - return; - } - - if (!size_list) { - LOGE("size_list == NULL"); - return; - } - - if (*size_list) { - free(*size_list); - *size_list = NULL; - } - - widget_id = widget_viewer_evas_get_widget_id(widget); - if (!widget_id) { - LOGE("widget_id == NULL"); - free(*size_list); - *size_list = NULL; - return; - } - - ret = widget_service_get_supported_size_types(widget_id, cnt, size_list); - - if (ret != 0 || *cnt == 0) { - LOGE("RESIZE COULD NOT GET SUPPORTED SIZES"); - *size_list = calloc(WIDGET_NR_OF_SIZE_LIST, sizeof(widget_size_type_e)); - *cnt = 2; - (*size_list)[0] = WIDGET_SIZE_TYPE_4x2; - (*size_list)[1] = WIDGET_SIZE_TYPE_4x4; - } - - LOGD("RESIZE AVAILABLE SIZE COUNT: %d", *cnt); -} - -void livebox_widget_set_event_blocking(Evas_Object *widget) -{ - if (!widget) { - LOGE("widget == NULL"); - return; - } - - widget_viewer_evas_cancel_click_event(widget); - LOGI("BLOCKING: %s", widget_viewer_evas_get_widget_id(widget)); -} - -static int __livebox_widget_get_pkg_list_cb(const char *pkg_id, const char *widget_id, int is_prime, void *data) -{ - widget_info_t *widget = NULL; - int cnt = WIDGET_NR_OF_SIZE_LIST;; - int *size_list = NULL; - int ret = -1; - - LOGI("WIDGET: %s; %s; %d", pkg_id, widget_id, is_prime); - - widget = calloc(1, sizeof(widget_info_t)); - if (!widget) { - LOGE("widget == NULL"); - return 0; - } - - widget->widget_id = strdup(widget_id); - widget->pkg_id = strdup(pkg_id); - widget->is_prime = is_prime; - - ret = widget_service_get_supported_size_types(widget_id, &cnt, &size_list); - - if(ret == 0 && cnt > 0) { - livebox_widget_get_dimensions(size_list[0], &widget->width, &widget->height); - LOGI("SIZE SET [%d, %d] ret == %d; cnt == %d", widget->width, widget->height, ret, cnt); - } else { - LOGE("COULD NOT GET AVAILABLE SiZES ret == %d; cnt == %d; size_list[0] == %d", ret, cnt, size_list[0]); - widget->width = LIVEBOX_ON_CREATE_SIZE; - widget->height = LIVEBOX_ON_CREATE_SIZE; - } - - s_info.widget_list = eina_list_append(s_info.widget_list, widget); - return 0; -} - -static void livebox_widget_new(int widget_width, int widget_height, const char *appid) -{ - int page_index = -1; - int pos_x = 0; - int pos_y = 0; - Tree_node_t *page_node = NULL; - Tree_node_t *item_node = NULL; - Evas_Object *page = NULL; - - page_index = livebox_panel_find_empty_space(widget_width, widget_height, &pos_x, &pos_y); - - if (page_index > -1) - page = page_scroller_get_page(livebox_panel_get(), page_index); - - if (!page) { - pos_x = 0; - pos_y = 0; - - if (!livebox_panel_can_add_page()) { - LOGI("Cannot add new page"); - return; - } - - page_node = data_model_add_widget_page(); - if (!page_node) { - livebox_panel_destroy(); - LOGE("page_node == NULL"); - return; - } - - page = livebox_panel_add_page(page_node, livebox_panel_get()); - if (!page) { - LOGE("page == NULL"); - livebox_panel_destroy(); - data_model_del_item(page_node); - return; - } - - page_index = page_scroller_get_page_count(livebox_panel_get()) - 1; - } else { - page_node = evas_object_data_get(page, KEY_ICON_DATA); - if (!page_node) { - LOGE("obj_node == NULL"); - livebox_panel_destroy(); - return; - } - } - - item_node = data_model_add_widget(page_node, appid, pos_x, pos_y, widget_width, widget_height, NULL); - if (!item_node) { - LOGE("item == NULL"); - return; - } - - elm_scroller_page_bring_in(livebox_panel_get(), page_index, 0); - livebox_panel_add_livebox(item_node, page, appid, pos_x, pos_y, widget_width, widget_height, NULL); - livebox_panel_update_dynamic_index(); -} - -static void _cannot_add_widget_popup_show(void) -{ - popup_data_t *data = popup_create_data(); - if (!data) { - LOGE("data == NULL"); - return; - } - - data->orientation = ELM_POPUP_ORIENT_CENTER; - data->popup_cancel_text = NULL; - data->popup_confirm_text = NULL; - data->popup_content_text = strdup(_("IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB")); - data->popup_title_text = NULL; - data->type = POPUP_INFO; - data->visible_time = 5.0; - - popup_show(data, NULL, NULL, NULL); -} - -static int request_cb(const char *appid, const char *name, int type, - const char *content_info, const char *icon, int pid, double period, - int allow_duplicate, void *data) -{ - int widget_width; - int widget_height; - - LOGI("====== WIDGET REQUEST ======"); - LOGI("Package name: %s\n", appid); - LOGI("Name: %s\n", name); - LOGI("Type: %d\n", type); - LOGI("Content: %s\n", content_info); - LOGI("Icon: %s\n", icon); - LOGI("Requested from: %d\n", pid); - LOGI("Period: %lf\n", period); - LOGI("Allow duplicate: %d\n", allow_duplicate); - LOGI("CBDATA: %p\n", data); - LOGI("============================"); - - switch (type) { - case WIDGET_SIZE_4x2: - widget_width = 4; - widget_height = 2; - break; - case WIDGET_SIZE_4x4: - widget_width = 4; - widget_height = 4; - break; - default: - /* Unsupported */ - LOGE("Unsupported type: %x\n", type); - _cannot_add_widget_popup_show(); - return 0; - } - - LOGI("Widget will be added: %dx%d\n", widget_width, widget_height); - - livebox_widget_new(widget_width, widget_height, appid); - home_screen_print_tree(); - - return 0; /*returns success. */ -} - -static void update_content_info(Evas_Object *widget, const char *content_info) -{ - Evas_Object *parent = NULL; - Tree_node_t *node = NULL; - - if (!widget) { - LOGE("widget == NULL"); - return; - } - - parent = elm_object_parent_widget_get(widget); - if (!parent) { - LOGE("parent == NULL"); - return; - } - - node = evas_object_data_get(parent, KEY_ICON_DATA); - if (!node) { - LOGE("node == NULL"); - return; - } - - data_model_update_content_info(node, content_info); -} diff --git a/src/livebox_all_pages.c b/src/livebox_all_pages.c deleted file mode 100644 index c8c8f86..0000000 --- a/src/livebox_all_pages.c +++ /dev/null @@ -1,1123 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#include -#include -#include - -#include "conf.h" - -#include "livebox_all_pages.h" -#include "homescreen-efl.h" -#include "page_scroller.h" -#include "livebox/livebox_panel.h" -#include "livebox/livebox_utils.h" -#include "util.h" -#include "dynamic_index.h" -#include "mouse.h" -#include "popup.h" -#include "layout.h" -#include "data_model.h" - -static Evas_Object *__livebox_all_pages_create_grid(Evas_Object *parent_layout); -static Evas_Object *__livebox_all_pages_create_thumb(Evas_Object *page, bool is_fake, bool show_remove_button); -static Evas_Object *__livebox_all_pages_create_bg(Evas_Object *parent); -static Evas_Object *__livebox_all_pages_create_add_icon_layout(void); -static Evas_Object *__livebox_all_pages_insert_thumb(void *data, Evas_Object *obj, const char *part); -static Evas_Object *__livebox_all_pages_get_thumb_page(Elm_Object_Item *it); - -static Eina_Bool __livebox_all_pages_item_up_cb(void *data); -static Eina_Bool __livebox_all_pages_get_grid_state(void *data, Evas_Object *obj, const char *part); -static Eina_Bool __livebox_all_pages_new_item_created_cb(void *data); - -static void __livebox_all_pages_del_grid(void *data, Evas_Object *obj); -static void __livebox_all_pages_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei); -static void __livebox_all_pages_grid_item_moved_cb(void *data, Evas_Object *obj, void *ei); -static void __livebox_all_pages_grid_changed_cb(void *data, Evas_Object *obj, void *ei); -static void __livebox_all_pages_hide_remove_button(Elm_Object_Item *it); -static void __livebox_all_pages_realized_cb(void *data, Evas_Object *obj, void *ei); -static void __livebox_all_pages_remove_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __livebox_all_pages_remove_button_clicked_liveboxes_cb(void *data); -static void __livebox_all_pages_add_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __livebox_all_pages_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void __libebox_all_pages_grid_item_pressed_cb(void *data, Evas_Object *obj, void *ei); - -static char *__livebox_all_pages_get_grid_text(void *data, Evas_Object *obj, const char *part); -static bool __livebox_all_pages_fill_grid(Evas_Object *grid); -static bool __livebox_all_pages_check_add_page(Elm_Object_Item *it); -static bool __livebox_all_pages_is_page_empty(Evas_Object *page); -static Eina_List *__livebox_all_pages_unpack_grid(void); -static Elm_Gengrid_Item_Class *__livebox_all_pages_create_grid_item_class(void); - - -static struct { - Evas_Object *item; - Elm_Object_Item *g_item; - - int cur_x; - int cur_y; - - bool is_created; -} s_info_reposition = { - .item = NULL, - .g_item = NULL, - - .cur_x = -1, - .cur_y = -1, - - .is_created = false, -}; - -static struct { - Evas_Object *grid; - Evas_Object *layout; - Elm_Gengrid_Item_Class *gic; - Elm_Object_Item *add_page_item; - bool is_add_page_visible; - int current_page; - int pressed_item; - bool is_item_longpressed; -} s_info = { - .grid = NULL, - .layout = NULL, - .gic = NULL, - .add_page_item = NULL, - .is_add_page_visible = true, - .current_page = -1, - .pressed_item = -1, - .is_item_longpressed = false, -}; - -/*======================================== PUBLIC FUNCTIONS IMPLEMENTATION ======================================*/ -HAPI Evas_Object *livebox_all_pages_show(void) -{ - Evas_Object *all_pages_layout = NULL; - Evas_Object *win = home_screen_get_win(); - Evas_Object *bg = NULL; - Evas_Object *grid = NULL; - - - int g_count; - int w = home_screen_get_root_width(); - int h = home_screen_get_root_height(); - - if (!win) { - LOGE("[INVALID_STATE][win='%p']", win); - return NULL; - } - - all_pages_layout = util_create_edje_layout(win, util_get_res_file_path(EDJE_DIR"/page_edit.edj"), GROUP_ALL_PAGES); - if (!all_pages_layout) { - LOGE("[FAILED][util_edje_layout_create]"); - return NULL; - } - - evas_object_size_hint_min_set(all_pages_layout, w, h); - evas_object_size_hint_max_set(all_pages_layout, w, h); - evas_object_resize(all_pages_layout, w, h); - evas_object_layer_set(all_pages_layout, EVAS_LAYER_MAX-1); - evas_object_move(all_pages_layout, ALL_PAGES_X, ALL_PAGES_Y); - - bg = __livebox_all_pages_create_bg(all_pages_layout); - if (!bg) { - LOGE("[FAILED][__livebox_all_pages_create_bg]"); - evas_object_del(all_pages_layout); - return NULL; - } - - grid = __livebox_all_pages_create_grid(all_pages_layout); - if (!grid) { - LOGE("[FAILED][__livebox_all_pages_create_grid]"); - evas_object_del(all_pages_layout); - return NULL; - } - - __livebox_all_pages_fill_grid(grid); - - s_info.grid = grid; - s_info.layout = all_pages_layout; - g_count = elm_gengrid_items_count(grid); - - if (g_count == MAX_ITEMS) - s_info.is_add_page_visible = false; - - evas_object_smart_callback_add(grid, "realized", __livebox_all_pages_realized_cb, NULL); - - return all_pages_layout; -} - -HAPI void livebox_all_pages_hide(void) -{ - Evas_Object *all_pages_layout = s_info.layout; - Evas_Object *lvb_scroller = NULL; - - Eina_List *page_list = NULL; - int page_count = 0; - - if (!all_pages_layout) { - LOGE("[FAILED][all_pages_layout]"); - return; - } - - lvb_scroller = livebox_panel_get(); - if (!lvb_scroller) { - LOGE("[FAILED][livebox_panel_get]"); - return; - } - - page_list = __livebox_all_pages_unpack_grid(); - if (!page_list) { - LOGE("[FAILED][__livebox_all_pages_unpack_grid]"); - return; - } - - page_scroller_pack_pages(lvb_scroller, page_list); - eina_list_free(page_list); - evas_object_del(all_pages_layout); - elm_gengrid_item_class_free(s_info.gic); - - page_count = page_scroller_get_page_count(lvb_scroller); - - if (s_info.current_page >= page_count) - s_info.current_page = page_count - 1; - - if (s_info.pressed_item >= 0) - s_info.current_page = s_info.pressed_item - 1; - - LOGI("CURRENT : [%d] PRESSED_PAGE: [%d]", s_info.current_page, s_info.pressed_item); - - page_scroller_show_page(lvb_scroller, s_info.current_page); - - dynamic_index_reload(evas_object_data_get(lvb_scroller, KEY_INDEX), s_info.current_page, - page_count); - - - s_info.layout = NULL; - s_info.grid = NULL; - s_info.gic = NULL; -} - -HAPI void livebox_all_pages_move_item(int x, int y) -{ - int xp, yp; - int m_idx = -1; /*moved item index*/ - int d_idx = -1; /*destination index*/ - - Elm_Object_Item *it = NULL; - Elm_Object_Item *n_it = NULL; - - Evas_Object *empty_ly = NULL; - - if (!s_info_reposition.item) - return; - - xp = x - OFFSET; - yp = y - OFFSET; - evas_object_move(s_info_reposition.item, xp, yp); - - it = elm_gengrid_at_xy_item_get(s_info.grid, x, y, NULL, NULL); - if (!it || (it == s_info_reposition.g_item) || !s_info_reposition.g_item || s_info_reposition.is_created) - return; - - /*check if item is add page*/ - if (__livebox_all_pages_check_add_page(it)) - return; - - m_idx = elm_gengrid_item_index_get(s_info_reposition.g_item); - d_idx = elm_gengrid_item_index_get(it); - - empty_ly = __livebox_all_pages_create_thumb(NULL, false, true); - if (!empty_ly) { - LOGE("[FAILED][__livebox_all_pages_create_thumb]"); - return; - } - - if (d_idx > m_idx) { - /*insert after*/ - s_info_reposition.is_created = true; - n_it = elm_gengrid_item_insert_after(s_info.grid, s_info.gic, empty_ly, it, NULL, NULL); - } else { - /*insert before*/ - s_info_reposition.is_created = true; - n_it = elm_gengrid_item_insert_before(s_info.grid, s_info.gic, empty_ly, it, NULL, NULL); - } - - evas_object_smart_callback_add(s_info.grid, "index,update", __livebox_all_pages_grid_changed_cb, n_it); - elm_object_item_del(s_info_reposition.g_item); - s_info_reposition.g_item = n_it; -} - -HAPI void livebox_all_pages_up_item(void) -{ - if (!s_info_reposition.item) - return; - - ecore_timer_add(0.05, __livebox_all_pages_item_up_cb, NULL); -} - -/*====================================== PRIVATE FUNCTIONS IMPLEMENTATION =======================================*/ -static void __livebox_all_pages_remove_button_clicked_liveboxes_cb(void *data) -{ - Elm_Object_Item *clicked_item = (Elm_Object_Item *) data; - Evas_Object *add_page = NULL; - Eina_List *g_items = NULL; - Elm_Object_Item *g_item = NULL; - Eina_List *last_node = NULL; - Evas_Object *clicked_page = NULL; - int g_count = 0; - - if (!clicked_item) { - LOGE("[FAILED][__livebox_all_pages_remove_button_clicked_liveboxes_cb]"); - return; - } - - clicked_page = __livebox_all_pages_get_thumb_page(clicked_item); - if (!clicked_page) { - LOGE("[FAILED][__livebox_all_pages_get_thumb_page]"); - return; - } - - g_items = elm_gengrid_realized_items_get(s_info.grid); - last_node = eina_list_last(g_items); - if (last_node) - g_item = eina_list_data_get(last_node); - eina_list_free(g_items); - - /*is this the correct order ? :*/ - livebox_panel_destroy_page(clicked_page); - elm_object_item_del(clicked_item); - g_count = elm_gengrid_items_count(s_info.grid); - - - if (g_count < MAX_ITEMS && !(__livebox_all_pages_check_add_page(g_item))) { - add_page = __livebox_all_pages_create_add_icon_layout(); - if (!add_page) { - LOGE("[FAILED][__livebox_all_pages_create_add_icon_layout]"); - return; - } - - s_info.add_page_item = elm_gengrid_item_append(s_info.grid, s_info.gic, add_page, NULL, NULL); - if (!s_info.add_page_item) { - LOGE("[FAILED][elm_gengrid_item_append]"); - evas_object_del(add_page); - return; - } - - s_info.is_add_page_visible = true; - } - - if (g_count == 2) - __livebox_all_pages_hide_remove_button(elm_gengrid_first_item_get(s_info.grid)); - - s_info.pressed_item = -1; - popup_destroy(); -} - -static bool __livebox_all_pages_is_page_empty(Evas_Object *page) -{ - Eina_List *lb_list = NULL; - - if (!page) { - LOGE("[INVALID_PARAM][page='%p']", page); - return true; - } - - lb_list = livebox_utils_get_liveboxes_on_page_list(page); - if (!lb_list) { - LOGE("[FAILED][livebox_utils_liveboxes_on_page_list_get]"); - return true; - } - - if (eina_list_count(lb_list) > 0) { - LOGE("[FAILED][eina_list_count]"); - eina_list_free(lb_list); - return false; - } - - eina_list_free(lb_list); - return true; -} - -static void __livebox_all_pages_add_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Tree_node_t *page_node = NULL; - - Elm_Object_Item *first_item = NULL; - - Evas_Object *layout = s_info.layout; - Evas_Object *grid = s_info.grid; - Evas_Object *new_page = NULL; - Evas_Object *thumb = NULL; - Evas_Object *first_item_layout = NULL; - - - int g_count = 0; /*gengrid items count*/ - - Elm_Gengrid_Item_Class *gic = s_info.gic; - Elm_Object_Item *add_item = s_info.add_page_item; - - int w = home_screen_get_root_width(); - int h = home_screen_get_root_height(); - - w = THUMB_W_REL * w; - h = THUMB_H_REL * h; - - if (!gic || !layout || !grid || !add_item) { - LOGE("[INVALID_PARAM][gic='%p'][layout='%p'][grid='%p'][add_item='%p']", gic, layout, grid, add_item); - return; - } - - g_count = elm_gengrid_items_count(grid); - - page_node = data_model_add_widget_page(); - if (!page_node) { - LOGE("page_node == NULL"); - return; - } - - new_page = livebox_panel_create_empty_page(page_node, livebox_panel_get()); - if (!new_page) { - LOGE("[FAILED][livebox_panel_empty_page_create]"); - data_model_del_item(page_node); - return; - } - - home_screen_print_tree(); - - thumb = __livebox_all_pages_create_thumb(new_page, true, true); - if (!thumb) { - LOGE("[FAILED][__livebox_all_pages_create_thumb]"); - evas_object_del(new_page); - return; - } - - - if (g_count < MAX_ITEMS) { - elm_gengrid_item_insert_before(grid, gic, thumb, add_item, NULL, NULL); - s_info.is_add_page_visible = true; - } else if (g_count == MAX_ITEMS) { - elm_object_item_del(s_info.add_page_item); - s_info.add_page_item = NULL; - - elm_gengrid_item_append(grid, gic, thumb, NULL, NULL); - s_info.is_add_page_visible = false; - } - - /*Show remove button on first page*/ - first_item = elm_gengrid_first_item_get(s_info.grid); - if (!first_item) { - return; - } - - first_item_layout = elm_object_item_part_content_get(first_item, GENGRID_ITEM_CONTENT); - if (!first_item_layout) - return; - /*WHAT HAPPENS to previously allocated thumb (g_count > MAX_ITEMS)??*/ - thumb = elm_object_part_content_get(first_item_layout, PART_GRID_ITEM_CONTENT); - if (!thumb) - return; - - elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_SHOW, SIGNAL_SOURCE); -} - -static Evas_Object *__livebox_all_pages_create_bg(Evas_Object *parent) -{ - LOGI(""); - - Evas_Object *bg = NULL; - const char *bg_path = util_get_res_file_path(IMAGE_DIR"/default_bg.png"); - char *buf = NULL; - int ret = -1; - - if (!parent) { - LOGE("[FAILED][__livebox_all_pages_create_bg]"); - return NULL; - } - - bg = elm_bg_add(parent); - if (!bg) { - LOGE("[FAILED][elm_bg_add]"); - return NULL; - } - - ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf); - - if (!buf || ret != SYSTEM_SETTINGS_ERROR_NONE || !ecore_file_exists(buf) - || !ecore_file_can_read(buf)) { - LOGE("[FAILED][failed to get bg path, use default]"); - - ret = elm_bg_file_set(bg, bg_path, NULL); - } else - ret = elm_bg_file_set(bg, buf, NULL); - - if (!ret) { - LOGE("[FAILED][failed to set bg]"); - evas_object_del(bg); - free(buf); - return NULL; - } - - evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(bg); - elm_object_part_content_set(parent, "bg", bg); - free(buf); - return bg; -} - -static Evas_Object *__livebox_all_pages_create_grid(Evas_Object *parent_layout) -{ - Evas_Object *grid = NULL; - - if (!parent_layout) { - LOGE("[INVALID_PARAM][parent_layout='%p']", parent_layout); - return NULL; - } - - grid = elm_gengrid_add(parent_layout); - if (!grid) { - LOGE("Failed to create gengrid"); - return NULL; - } - - elm_gengrid_item_size_set(grid, (ITEM_W_REL * home_screen_get_root_width()), (ITEM_H_REL * home_screen_get_root_height())); - elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE); - elm_gengrid_filled_set(grid, EINA_TRUE); - elm_gengrid_horizontal_set(grid, EINA_FALSE); - - /* elm_gengrid_reorder_mode_set(grid, EINA_TRUE);*/ - elm_gengrid_align_set(grid, 0.5, 0.5); - - evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_part_content_set(parent_layout, PART_LAYOUT_CONTENT, grid); - evas_object_show(grid); - - evas_object_smart_callback_add(grid, "longpressed", __livebox_all_pages_grid_item_longpressed_cb, NULL); - evas_object_smart_callback_add(grid, "moved", __livebox_all_pages_grid_item_moved_cb, NULL); - evas_object_smart_callback_add(grid, "pressed", __libebox_all_pages_grid_item_pressed_cb, NULL); - - __livebox_all_pages_create_grid_item_class(); - - return grid; -} - -static Elm_Gengrid_Item_Class *__livebox_all_pages_create_grid_item_class(void) -{ - Elm_Gengrid_Item_Class *gic = s_info.gic; - if (!s_info.gic) { - gic = elm_gengrid_item_class_new(); - if (!gic) { - LOGE("Failed to create gengrid item class"); - return NULL; - } - - gic->item_style = "default"; - gic->func.text_get = __livebox_all_pages_get_grid_text; - gic->func.content_get = __livebox_all_pages_insert_thumb; - gic->func.state_get = __livebox_all_pages_get_grid_state; - gic->func.del = __livebox_all_pages_del_grid; - - s_info.gic = gic; - } - - return gic; -} - -static Evas_Object *__livebox_all_pages_create_thumb(Evas_Object *page, bool is_fake, bool show_remove_button) -{ - Evas_Object *win = NULL; - Evas_Object *thumb = NULL; - Evas_Object *ly_grid_item = NULL; - Evas_Object *ly_thumb = NULL; - Evas *e = NULL; - - win = home_screen_get_win(); - if (!win) { - LOGE("[FAILED][home_screen_win_get]"); - return NULL; - } - - int w = home_screen_get_root_width(); - int h = home_screen_get_root_height(); - - w = THUMB_W_REL * w; - h = THUMB_H_REL * h; - - ly_grid_item = util_create_edje_layout(win, util_get_res_file_path(EDJE_DIR"/page_edit.edj"), GROUP_GRID_ITEM); - if (!ly_grid_item) { - LOGE("[FAILED][util_edje_layout_create]"); - return NULL; - } - - ly_thumb = util_create_edje_layout(win, util_get_res_file_path(EDJE_DIR"/page_edit.edj"), GROUP_THUMB); - if (!ly_thumb) { - LOGE("[FAILED][util_edje_layout_create]"); - evas_object_del(ly_grid_item); - return NULL; - } - - elm_object_signal_callback_add(ly_thumb, SIGNAL_THUMBNAIL_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_page_clicked_cb, NULL); - - if (page && !is_fake) { - thumb = page_scroller_get_page_thumbnail(page, w, h); - if (!thumb) { - LOGE("[FAILED][page_scroller_page_thumbnail_get]"); - evas_object_del(ly_grid_item); - evas_object_del(ly_thumb); - return NULL; - } - - evas_object_resize(thumb, w, h); - evas_object_size_hint_max_set(thumb, w, h); - evas_object_data_set(thumb, KEY_THUMB_DATA, page); - } else if (page) { - e = evas_object_evas_get(win); - if (!e) { - LOGE("[FAILED][evas_object_evas_get]"); - return NULL; - } - - thumb = evas_object_rectangle_add(e); - if (!thumb) { - LOGE("[FAILED][Failed to create thumb]"); - evas_object_del(ly_grid_item); - evas_object_del(ly_thumb); - return NULL; - } - - evas_object_color_set(thumb, 0, 0, 0, 0); - evas_object_resize(thumb, w, h); - evas_object_size_hint_max_set(thumb, w, h); - evas_object_data_set(thumb, KEY_THUMB_DATA, page); - } - - if (!page && !is_fake) { - elm_object_signal_emit(ly_thumb, SIGNAL_BG_HIDE, SIGNAL_SOURCE); - elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE); - } - elm_object_signal_callback_add(ly_thumb, SIGNAL_REMOVE_BUTTON_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_remove_button_clicked_cb, ly_thumb); - - elm_object_part_content_set(ly_thumb, PART_THUMB_CONTENT, thumb); - elm_object_part_content_set(ly_grid_item, PART_GRID_ITEM_CONTENT, ly_thumb); - - if (!show_remove_button) - elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE_INSTANT, SIGNAL_SOURCE); - - return ly_grid_item; -} - -static Evas_Object *__livebox_all_pages_create_add_icon_layout(void) -{ - Evas_Object *win = NULL; - Evas *e = NULL; - Evas_Object *add_icon = NULL; - Evas_Object *ly_grid_item = NULL; - Evas_Object *ly_thumb = NULL; - int w = home_screen_get_root_width(); - int h = home_screen_get_root_height(); - - win = home_screen_get_win(); - if (!win) { - LOGE("[FAILED][home_screen_win_get]"); - return NULL; - } - - e = evas_object_evas_get(win); - if (!e) { - LOGE("[FAILED][evas_object_evas_get]"); - return NULL; - } - - add_icon = evas_object_rectangle_add(e); - if (!add_icon) { - LOGE("[FAILED][evas_object_rectangle_add]"); - return NULL; - } - evas_object_color_set(add_icon, 0, 0, 0, 0); - - ly_grid_item = util_create_edje_layout(win, util_get_res_file_path(EDJE_DIR"/page_edit.edj"), GROUP_GRID_ITEM); - if (!ly_grid_item) { - LOGE("[FAILED][util_edje_layout_create]"); - evas_object_del(add_icon); - return NULL; - } - - ly_thumb = util_create_edje_layout(win, util_get_res_file_path(EDJE_DIR"/page_edit.edj"), GROUP_THUMB); - if (!ly_thumb) { - LOGE("[FAILED][util_edje_layout_create]"); - evas_object_del(add_icon); - evas_object_del(ly_grid_item); - return NULL; - } - - w = THUMB_W_REL * w; - h = THUMB_H_REL * h; - evas_object_size_hint_max_set(add_icon, w, h); - - elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE_INSTANT, SIGNAL_SOURCE); - elm_object_part_content_set(ly_grid_item, PART_GRID_ITEM_CONTENT, ly_thumb); - elm_object_part_content_set(ly_thumb, PART_THUMB_CONTENT, add_icon); - - evas_object_data_set(add_icon, KEY_THUMB_DATA, ly_thumb); /*if pointer returned from the data_key will be the same it would mean that we have add page.*/ - elm_object_signal_callback_add(ly_thumb, SIGNAL_THUMBNAIL_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_add_page_clicked_cb, (void *) index); - elm_object_signal_emit(ly_thumb, SIGNAL_ADD_ICON_SHOW, SIGNAL_SOURCE); - - return ly_grid_item; -} - -static bool __livebox_all_pages_fill_grid(Evas_Object *grid) -{ - Eina_List *pages = NULL; - Eina_List *it = NULL; - - Evas_Object *lvb_scroller = NULL; - Evas_Object *page = NULL; - Evas_Object *t_page = NULL; - Evas_Object *add_page = NULL; - - bool show_remove_page = false; - - Elm_Gengrid_Item_Class *gic = s_info.gic; - - int g_count = 0; - - if (!grid) { - LOGE("[INVALID_PARAM][grid='%p']", grid); - return false; - } - - lvb_scroller = livebox_panel_get(); - if (!lvb_scroller) { - LOGE("[FAILED][lvb_scroller='%p']", lvb_scroller); - return false; - } - - s_info.current_page = page_scroller_get_current_page(lvb_scroller); - - LOGI("[%s]", evas_object_type_get(lvb_scroller)); - - pages = page_scroller_unpack_pages(lvb_scroller); - if (!pages) { - LOGE("[FAILED][page_scroller_unpack_pages]"); - return false; - } - - show_remove_page = (eina_list_count(pages) > 1); - - EINA_LIST_FOREACH(pages, it, page) { - if (!page) - continue; - - t_page = __livebox_all_pages_create_thumb(page, false, show_remove_page); - if (!t_page) { - LOGE("[FAILED][__livebox_all_pages_create_thumb]"); - /*TODO: livebox implementer, free pages + think of the way to do something with ui data inside the nodes !*/ - elm_gengrid_clear(grid); - return false; - } - - elm_gengrid_item_append(grid, gic, t_page, NULL, NULL); - } - - eina_list_free(pages); - - g_count = elm_gengrid_items_count(grid); - if (g_count < MAX_ITEMS) { - add_page = __livebox_all_pages_create_add_icon_layout(); - if (!add_page) { - LOGE("[FAILED][__livebox_all_pages_create_add_icon_layout]"); - elm_gengrid_clear(grid); - return false; - } - - s_info.add_page_item = elm_gengrid_item_append(grid, gic, add_page, NULL, NULL); - if (!s_info.add_page_item) { - LOGE("[FAILED][elm_gengrid_item_append]"); - evas_object_del(add_page); - elm_gengrid_clear(grid); - return false; - } - - s_info.is_add_page_visible = true; - } - - return true; -} - -static Evas_Object *__livebox_all_pages_insert_thumb(void *data, Evas_Object *obj, const char *part) -{ - Evas_Object *thumb = (Evas_Object *) data; - - if (!thumb) { - LOGE("[INVALID_DATA][__livebox_all_pages_insert_thumb]"); - return NULL; - } - - if (!strncmp(part, GENGRID_ITEM_CONTENT, strlen(GENGRID_ITEM_CONTENT))) { - return thumb; - } - - return NULL; -} - -static Eina_List *__livebox_all_pages_unpack_grid(void) -{ - Evas_Object *page = NULL; - - Elm_Object_Item *g_item = NULL; - - Eina_List *p_list = NULL; - Eina_List *g_items = NULL; /*list of elm_gengrid items.*/ - Eina_List *it = NULL; - - if (!s_info.grid) { - LOGE("[FAILED][s_info.grid='%p']", s_info.grid); - return NULL; - } - - g_items = elm_gengrid_realized_items_get(s_info.grid); - if (!g_items) { - LOGE("[FAILED][elm_gengrid_realized_items_get]"); - return NULL; - } - - EINA_LIST_FOREACH(g_items, it, g_item) { - if (!g_item) - continue; - - page = __livebox_all_pages_get_thumb_page(g_item); - if (!page) { - LOGE("[FAILED][__livebox_all_pages_get_thumb_page]"); - eina_list_free(p_list); - eina_list_free(g_items); - return NULL; - } - - if (!__livebox_all_pages_check_add_page(g_item)) { - p_list = eina_list_append(p_list, page); - if (!p_list) { - LOGE("[FAILED][eina_list_append]"); - eina_list_free(g_items); - return NULL; - } - } - } - eina_list_free(g_items); - - return p_list; -} - -static void __livebox_all_pages_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei) -{ - s_info.is_item_longpressed = true; - s_info.pressed_item = -1; - - Elm_Object_Item *it = (Elm_Object_Item *) ei; - - if (__livebox_all_pages_check_add_page(it)) - return; - - Evas_Object *thumb_layout = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT); - Evas_Object *thumb = elm_object_part_content_unset(thumb_layout, PART_GRID_ITEM_CONTENT); - - evas_object_layer_set(thumb, EVAS_LAYER_MAX); - - elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE); - elm_object_signal_emit(thumb, SIGNAL_BG_REPOSITON, SIGNAL_SOURCE); - - s_info_reposition.item = thumb; - s_info_reposition.g_item = it; -} - -static void __livebox_all_pages_grid_item_moved_cb(void *data, Evas_Object *obj, void *ei) -{ - LOGD("item moved"); -} - -static void __livebox_all_pages_grid_changed_cb(void *data, Evas_Object *obj, void *ei) -{ - ecore_timer_add(ITEM_CREATE_TIME, __livebox_all_pages_new_item_created_cb, NULL); - evas_object_smart_callback_del(obj, "index,update", __livebox_all_pages_grid_changed_cb); - return; -} - -/** - * @brief Block new item creation during reposition process - */ -static Eina_Bool __livebox_all_pages_new_item_created_cb(void *data) -{ - s_info_reposition.is_created = false; - return EINA_FALSE; -} - -/** - * @details Function check if elm_object item contain add page layout - */ -static bool __livebox_all_pages_check_add_page(Elm_Object_Item *it) -{ - Evas_Object *page = NULL; - Evas_Object *ly = NULL; - Evas_Object *ly_content = NULL; - - if (!it) { - LOGE("[INVALID_PARAM][it='%p']", it); - return false; - } - - ly = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT); - if (!ly) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - return false; - } - - ly_content = elm_object_part_content_get(ly, PART_GRID_ITEM_CONTENT); - if (!ly_content) { - LOGE("[FAILED][elm_object_part_content_get]"); - return false; - } - - page = __livebox_all_pages_get_thumb_page(it); - if (!page) { - LOGE("[FAILED][__livebox_all_pages_get_thumb_page]"); - return false; - } - - if (page == ly_content) - return true; - - return false; -} - -static Evas_Object *__livebox_all_pages_get_thumb_page(Elm_Object_Item *it) -{ - Evas_Object *ly = NULL; - Evas_Object *ly_content = NULL; - Evas_Object *thumb = NULL; - Evas_Object *page = NULL; - - if (!it) { - LOGE("[INVALID_PARAM][it='%p']", it); - return NULL; - } - - ly = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT); - if (!ly) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - return NULL; - } - - ly_content = elm_object_part_content_get(ly, PART_GRID_ITEM_CONTENT); - if (!ly_content) { - LOGE("[FAILED][elm_object_part_content_get]"); - return NULL; - } - - thumb = elm_object_part_content_get(ly_content, PART_THUMB_CONTENT); - if (!thumb) { - LOGE("[FAILED][elm_object_part_content_get]"); - return NULL; - } - - page = (Evas_Object *) evas_object_data_get(thumb, KEY_THUMB_DATA); - - return page; -} - -static Eina_Bool __livebox_all_pages_item_up_cb(void *data) -{ - int gengrid_items = 0; - Evas_Object *page = NULL; - Evas_Object *prev_page = NULL; - Elm_Object_Item *prev_it = NULL; - Tree_node_t *page_node = NULL; - Tree_node_t *prev_node = NULL; - - Elm_Object_Item *d_it = s_info_reposition.g_item; /*destination item;*/ - if (!d_it) { - LOGE("[FAILED][__livebox_all_pages_item_up_cb]"); - return ECORE_CALLBACK_CANCEL; - } - - Evas_Object *ly_container = elm_object_item_part_content_get(d_it, GENGRID_ITEM_CONTENT); - if (!ly_container) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - return ECORE_CALLBACK_CANCEL; - } - - elm_object_part_content_set(ly_container, PART_GRID_ITEM_CONTENT, s_info_reposition.item); - elm_object_signal_emit(s_info_reposition.item, SIGNAL_BG_NORMAL, SIGNAL_SOURCE); - - gengrid_items = elm_gengrid_items_count(s_info.grid); - if (gengrid_items > 2) - elm_object_signal_emit(s_info_reposition.item, SIGNAL_REMOVE_BUTTON_SHOW, SIGNAL_SOURCE); - - page = __livebox_all_pages_get_thumb_page(d_it); - if (!page) { - LOGE("page == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - page_node = evas_object_data_get(page, KEY_ICON_DATA); - if (!page_node) { - LOGE("page_node == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - prev_it = elm_gengrid_item_prev_get(d_it); - if (prev_it) { - LOGD("prev_it != NULL"); - - prev_page = __livebox_all_pages_get_thumb_page(prev_it); - - if (!prev_page) { - LOGE("prev_page == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - prev_node = evas_object_data_get(prev_page, KEY_ICON_DATA); - if (!prev_node) { - LOGE("prev_node == NULL"); - return ECORE_CALLBACK_CANCEL; - } - - data_model_insert_after(prev_node, page_node); - } else { - LOGD("prev_it == NULL"); - - data_model_insert_after(NULL, page_node); - } - - s_info_reposition.cur_x = -1; - s_info_reposition.cur_y = -1; - s_info_reposition.g_item = NULL; - s_info_reposition.item = NULL; - s_info_reposition.is_created = false; - s_info.is_item_longpressed = false; - - home_screen_print_tree(); - - return ECORE_CALLBACK_CANCEL; -} - -/*Gengrid Class item functions*/ -static char *__livebox_all_pages_get_grid_text(void *data, Evas_Object *obj, const char *part) -{ - return NULL; -} - -static Eina_Bool __livebox_all_pages_get_grid_state(void *data, Evas_Object *obj, const char *part) -{ - return EINA_FALSE; -} - -static void __livebox_all_pages_del_grid(void *data, Evas_Object *obj) -{ -} - -static void __livebox_all_pages_hide_remove_button(Elm_Object_Item *it) -{ - Evas_Object *thumb_layout = NULL; - Evas_Object *thumb = NULL; - - if (!it) - LOGE("[INVALID_PARAM][it='%p']", it); - - thumb_layout = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT); - thumb = elm_object_part_content_get(thumb_layout, PART_GRID_ITEM_CONTENT); - elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE); -} - -static void __livebox_all_pages_realized_cb(void *data, Evas_Object *obj, void *ei) -{ - int g_count = 0; - g_count = elm_gengrid_items_count(obj); - - if (g_count == 2) - __livebox_all_pages_hide_remove_button(elm_gengrid_first_item_get(obj)); -} - -static void __livebox_all_pages_remove_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Elm_Object_Item *clicked_item = NULL; - Evas_Object *clicked_page = NULL; - Evas_Object *lvb = (Evas_Object *) data; - - if (!lvb) { - LOGE("[FAILED][lvb='%p']", lvb); - return; - } - - int x = -1, y = -1; - evas_object_geometry_get(lvb, &x, &y, NULL, NULL); - - clicked_item = elm_gengrid_at_xy_item_get(s_info.grid, x, y, NULL, NULL); - if (!clicked_item) { - LOGE("[FAILED][elm_gengrid_at_xy_item_get]"); - return; - } - - clicked_page = __livebox_all_pages_get_thumb_page(clicked_item); - if (!clicked_page) { - LOGE("[FAILED][__livebox_all_pages_get_thumb_page]"); - return; - } - if (__livebox_all_pages_is_page_empty(clicked_page)) { - __livebox_all_pages_remove_button_clicked_liveboxes_cb(clicked_item); - } else { - popup_data_t *p_data = popup_create_data(); - if (!p_data) { - LOGE("[FAILED][failed to create popup data]"); - return; - } - - p_data->type = POPUP_TWO_BUTTONS; - p_data->popup_title_text = strdup(_("IDS_HS_HEADER_DELETE_PAGE_ABB2")); - p_data->popup_content_text = strdup(_("IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED")); - p_data->popup_confirm_text = strdup(_("IDS_HS_OPT_DELETE")); - p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL")); - p_data->orientation = ELM_POPUP_ORIENT_CENTER; - - popup_show(p_data, __livebox_all_pages_remove_button_clicked_liveboxes_cb, NULL, - (void *) clicked_item); - } -} - -static void __livebox_all_pages_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Evas_Object *lvb_scroller = NULL; - - if (s_info.is_item_longpressed) - return; - - lvb_scroller = livebox_panel_get(); - if (!lvb_scroller) { - LOGE("Failed to get scroller"); - return; - } - - livebox_all_pages_hide(); - home_screen_set_view_type(HOMESCREEN_VIEW_HOME); - s_info.pressed_item = -1; -} - -static void __libebox_all_pages_grid_item_pressed_cb(void *data, Evas_Object *obj, void *ei) -{ - s_info.pressed_item = elm_gengrid_item_index_get(ei); -} - diff --git a/src/menu.c b/src/menu.c new file mode 100755 index 0000000..1d29b23 --- /dev/null +++ b/src/menu.c @@ -0,0 +1,102 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "homescreen-efl.h" +#include "menu.h" +#include "conf.h" + +static struct { + Evas_Object *menu; + bool is_visible; +} menu_info = { + .menu = NULL, + .is_visible = false +}; + +/* menu_item_t */ +static const char menu_text[MENU_MAX][PATH_MAX_LEN] = { + "IDS_HS_OPT_EDIT", + "IDS_HS_HEADER_ADD_WIDGET", + "IDS_HS_OPT_CHANGE_WALLPAPER_ABB", + "IDS_HS_OPT_ALL_PAGES", + "IDS_HS_OPT_EDIT", + "IDS_HS_OPT_CREATE_FOLDER_OPT_TTS" +}; + +static void __menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info) +{ + menu_info.is_visible = false; + + if (menu_info.menu) { + evas_object_del(menu_info.menu); + menu_info.menu = NULL; + } +} + +void menu_show(Eina_Hash* hash_table) +{ + int menu_id; + if (menu_info.is_visible) { + return ; + } + + menu_info.is_visible = true; + + menu_info.menu = elm_ctxpopup_add(homescreen_efl_get_win()); + elm_object_style_set(menu_info.menu, "more/default"); + elm_ctxpopup_horizontal_set(menu_info.menu, EINA_FALSE); + elm_ctxpopup_auto_hide_disabled_set(menu_info.menu, EINA_TRUE); + elm_ctxpopup_direction_priority_set(menu_info.menu, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN); + + evas_object_smart_callback_add(menu_info.menu, "dismissed", __menu_dismissed_cb, NULL); + + for (menu_id = MENU_DEFAULT+1; menu_id < MENU_MAX; menu_id++) { + void *data = eina_hash_find(hash_table, &menu_id); + if (data) { + elm_ctxpopup_item_append(menu_info.menu, _(menu_text[menu_id]), NULL, data, NULL); + } + } + + evas_object_move(menu_info.menu, 0, WINDOW_H); + evas_object_show(menu_info.menu); +} + +void menu_hide(void) +{ + if (!menu_info.is_visible) { + return ; + } + + menu_info.is_visible = false; + + evas_object_hide(menu_info.menu); + evas_object_del(menu_info.menu); + menu_info.menu = NULL; +} + +bool menu_is_show(void) +{ + return menu_info.is_visible; +} + +void menu_change_state_on_hw_menu_key(Eina_Hash* hash_table) +{ + if (menu_info.is_visible) { + menu_hide(); + } else { + menu_show(hash_table); + } +} diff --git a/src/mouse.c b/src/mouse.c deleted file mode 100644 index 3471d8c..0000000 --- a/src/mouse.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#include "livebox/livebox_panel.h" -#include "util.h" -#include "livebox_all_pages.h" -#include "folder_panel.h" - - -static struct { - Ecore_Event_Handler *mouse_down; - Ecore_Event_Handler *mouse_up; - Ecore_Event_Handler *mouse_move; - bool pressed; - Evas_Coord pre_x; - Evas_Coord pre_y; - bool is_initialized; - Evas_Coord down_x; - Evas_Coord down_y; - Evas_Coord move_x; - Evas_Coord move_y; - Evas_Coord up_x; - Evas_Coord up_y; -} mouse_info = { - .mouse_down = NULL, - .mouse_up = NULL, - .mouse_move = NULL, - .pressed = false, - .pre_x = 0, - .pre_y = 0, - .is_initialized = false, - .down_x = 0, - .down_y = 0, - .move_x = 0, - .move_y = 0, - .up_x = 0, - .up_y = 0, -}; - - -static Eina_Bool __mouse_down_cb(void *data, int type, void *event); -static Eina_Bool __mouse_up_cb(void *data, int type, void *event); -static Eina_Bool __mouse_move_cb(void *data, int type, void *event); - - -HAPI void mouse_register(void) -{ - mouse_info.mouse_down = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __mouse_down_cb, NULL); - if (!mouse_info.mouse_down) - LOGD("Failed to register the mouse down event callback"); - - mouse_info.mouse_move = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, __mouse_move_cb, NULL); - if (!mouse_info.mouse_move) { - LOGD("Failed to register the mouse move event callback"); - ecore_event_handler_del(mouse_info.mouse_down); - mouse_info.mouse_down = NULL; - } - - mouse_info.mouse_up = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, __mouse_up_cb, NULL); - if (!mouse_info.mouse_up) { - LOGD("Failed to register the mouse up event callback"); - ecore_event_handler_del(mouse_info.mouse_down); - ecore_event_handler_del(mouse_info.mouse_move); - - mouse_info.mouse_down = NULL; - mouse_info.mouse_move = NULL; - } -} - - -HAPI void mouse_unregister(void) -{ - if (mouse_info.mouse_down) { - ecore_event_handler_del(mouse_info.mouse_down); - mouse_info.mouse_down = NULL; - } - - if (mouse_info.mouse_up) { - ecore_event_handler_del(mouse_info.mouse_up); - mouse_info.mouse_up = NULL; - } - - if (mouse_info.mouse_move) { - ecore_event_handler_del(mouse_info.mouse_move); - mouse_info.mouse_move = NULL; - } -} - - -static Eina_Bool __mouse_down_cb(void *data, int type, void *event) -{ - Ecore_Event_Mouse_Button *move = event; - - if (mouse_info.pressed) - return ECORE_CALLBACK_RENEW; - - mouse_info.pressed = true; - mouse_info.is_initialized = false; - - mouse_info.down_x = move->root.x; - mouse_info.down_y = move->root.y; - - return ECORE_CALLBACK_RENEW; -} - - -static Eina_Bool __mouse_up_cb(void *data, int type, void *event) -{ - Ecore_Event_Mouse_Button *move = event; - - if (!mouse_info.pressed) - return ECORE_CALLBACK_RENEW; - - mouse_info.pressed = false; - mouse_info.pre_x = 0; - mouse_info.pre_y = 0; - - mouse_info.up_x = move->root.x; - mouse_info.up_y = move->root.y; - - livebox_all_pages_up_item(); - - return ECORE_CALLBACK_RENEW; -} - -static Eina_Bool __mouse_move_cb(void *data, int type, void *event) -{ - Ecore_Event_Mouse_Move *move = event; - - mouse_info.move_x = move->root.x; - mouse_info.move_y = move->root.y; - - if (mouse_info.pressed == false) - return ECORE_CALLBACK_RENEW; - - livebox_all_pages_move_item(move->root.x, move->root.y); - livebox_panel_move_mouse_cb(move->root.x, move->root.y); - - return ECORE_CALLBACK_RENEW; -} - - - - diff --git a/src/option_menu.c b/src/option_menu.c deleted file mode 100644 index 7af4cbf..0000000 --- a/src/option_menu.c +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "option_menu.h" -#include "homescreen-efl.h" -#include "app_grid.h" -#include "all_apps.h" - - -#include "livebox/livebox_panel.h" -#include "util.h" -#include "app_icon.h" -#include "folder_panel.h" -#include "popup.h" -#include "data_model.h" -#include "layout.h" -#include "livebox_all_pages.h" - -static struct { - Evas_Object *option_menu; - Evas_Object *option_menu_background; - bool is_visible; -} s_info; - -/*Create the background with the clicked callback under the menu*/ -static void __option_menu_create_background(void); -static void __option_menu_background_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void __option_menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info); - -/*All Apps callbacks*/ -static void __option_menu_entry_all_apps_edit_apps_cb(void *data, Evas_Object *obj, void *event_info); -static void __option_menu_entry_all_apps_create_folder_cb(void *data, Evas_Object *obj, void *event_info); - -/*Home callback*/ -static void __option_menu_entry_all_apps_edit_home_cb(void *data, Evas_Object *obj, void *event_info); - -/*Wallpapers callbacks*/ -static void __option_menu_entry_all_apps_wallpaper_cb(void *data, Evas_Object *obj, void *event_info); - -/*Add widget*/ -static void __option_menu_entry_all_apps_add_widget_cb(void *data, Evas_Object *obj, void *event_info); - -/*View all pages*/ -static void __option_menu_entry_all_apps_view_all_pages_cb(void *data, Evas_Object *obj, void *event_info); - -static void __option_menu_update_caption_menu_state_update(void); - -HAPI bool option_menu_show(void) -{ - Evas_Object *option_menu = NULL; - homescreen_view_t view = home_screen_get_view_type(); - - __option_menu_create_background(); - - option_menu = elm_ctxpopup_add(home_screen_get_win()); - if (!option_menu) { - LOGE("Could not create all apps option menu"); - evas_object_del(s_info.option_menu_background); - return false; - } - - elm_ctxpopup_horizontal_set(option_menu, EINA_FALSE); - elm_ctxpopup_direction_priority_set(option_menu, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN); - - evas_object_smart_callback_add(option_menu, "dismissed", __option_menu_dismissed_cb, NULL); - - evas_object_layer_set(option_menu, EVAS_LAYER_MAX); - evas_object_move(option_menu, 0, home_screen_get_root_height()-(BUTTONS_AREA*home_screen_get_root_height())); - evas_object_size_hint_min_set(option_menu, home_screen_get_root_width(), -1); - - if (view == HOMESCREEN_VIEW_HOME) { - elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_EDIT"), NULL, __option_menu_entry_all_apps_edit_home_cb, NULL); - elm_ctxpopup_item_append(option_menu, _("IDS_HS_HEADER_ADD_WIDGET"), NULL, __option_menu_entry_all_apps_add_widget_cb, NULL); - elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_CHANGE_WALLPAPER_ABB"), NULL, __option_menu_entry_all_apps_wallpaper_cb, NULL); - elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_ALL_PAGES"), NULL, __option_menu_entry_all_apps_view_all_pages_cb, NULL); - } else if (view == HOMESCREEN_VIEW_HOME_ALL_PAGES) { - LOGD("All pages view type"); - } else if (view == HOMESCREEN_VIEW_ALL_APPS) { - elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_EDIT"), NULL, __option_menu_entry_all_apps_edit_apps_cb, NULL); - elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_CREATE_FOLDER_OPT_TTS"), NULL, __option_menu_entry_all_apps_create_folder_cb, NULL); - - } else if (view == HOMESCREEN_VIEW_UNKNOWN) { - LOGD("Unknown view type"); - } else { - LOGE("Failed to get view type"); - return false; - } - - evas_object_show(option_menu); - - s_info.is_visible = true; - s_info.option_menu = option_menu; - - return true; -} - -HAPI void option_menu_hide(void) -{ - if (s_info.option_menu) { - evas_object_hide(s_info.option_menu); - evas_object_del(s_info.option_menu); - s_info.option_menu = NULL; - } - - if (s_info.option_menu_background) { - evas_object_hide(s_info.option_menu_background); - evas_object_del(s_info.option_menu_background); - s_info.option_menu_background = NULL; - } - s_info.is_visible = false; -} - -HAPI void option_menu_update_on_item_selected(void) -{ - __option_menu_update_caption_menu_state_update(); -} - -HAPI void option_menu_change_state_on_hw_menu_key(void) -{ - if (s_info.is_visible) { - option_menu_hide(); - } else { - option_menu_show(); - } -} - -static void __option_menu_create_background(void) -{ - Evas_Object *background = NULL; - - if (s_info.option_menu_background) { - evas_object_show(s_info.option_menu_background); - - return; - } - - background = evas_object_rectangle_add(evas_object_evas_get(home_screen_get_win())); - evas_object_color_set(background, 255, 255, 255, 0); - evas_object_size_hint_min_set(background, INDEX_HEIGHT, home_screen_get_root_height()); - evas_object_size_hint_max_set(background, INDEX_HEIGHT, home_screen_get_root_height()); - evas_object_resize(background, INDEX_HEIGHT, home_screen_get_root_height()); - evas_object_show(background); - - evas_object_event_callback_add(background, EVAS_CALLBACK_MOUSE_UP, __option_menu_background_clicked_cb, NULL); - - s_info.option_menu_background = background; -} - -static void __option_menu_background_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - option_menu_hide(); -} - -static void __option_menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info) -{ - option_menu_hide(); -} - -static void __option_menu_entry_all_apps_edit_apps_cb(void *data, Evas_Object *obj, void *event_info) -{ - option_menu_hide(); - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_EDIT); -} - -static void __option_menu_entry_all_apps_edit_home_cb(void *data, Evas_Object *obj, void *event_info) -{ - home_screen_set_view_type(HOMESCREEN_VIEW_HOME_EDIT); - option_menu_hide(); -} - - -static void __option_menu_entry_all_apps_create_folder_cb(void *data, Evas_Object *obj, void *event_info) -{ - option_menu_hide(); - home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_CHOOSE); - __option_menu_update_caption_menu_state_update(); -} - -static void _launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data) -{ - switch (result) { - case APP_CONTROL_RESULT_CANCELED: - LOGE("[APP_CONTROL_RESULT_CANCELED]"); - break; - case APP_CONTROL_RESULT_FAILED: - LOGE("[APP_CONTROL_RESULT_FAILED]"); - break; - case APP_CONTROL_RESULT_SUCCEEDED: - LOGD("[APP_CONTROL_RESULT_SUCCEEDED]"); - break; - default: - LOGE("UNKNOWN ERROR"); - break; - } -} - -static void __option_menu_entry_all_apps_add_widget_cb(void *data, Evas_Object *obj, void *event_info) -{ - LOGD("__option_menu_entry_all_apps_add_widget_cb"); - - home_screen_set_view_type(HOMESCREEN_VIEW_HOME_ADD_VIEWER); - - option_menu_hide(); -} - -static void __option_menu_entry_all_apps_wallpaper_cb(void *data, Evas_Object *obj, void *event_info) -{ - LOGD("__option_menu_entry_all_apps_wallpaper_cb"); - - const char *appid = OPTION_MENU_SETTINGS; - app_control_h app_control_handle = NULL; - - if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_create]"); - return; - } - - app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl"); - app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup"); - app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen"); - - if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_set_app_id]"); - app_control_destroy(app_control_handle); - return; - } - - if (app_control_send_launch_request(app_control_handle, _launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_send_launch_request]"); - app_control_destroy(app_control_handle); - return; - } - - app_control_destroy(app_control_handle); - option_menu_hide(); -} - -static void __option_menu_entry_all_apps_view_all_pages_cb(void *data, Evas_Object *obj, void *event_info) -{ - home_screen_set_view_type(HOMESCREEN_VIEW_HOME_ALL_PAGES); - option_menu_hide(); -} - -static void __option_menu_update_caption_menu_state_update(void) -{ - int selected_count = -1; - char trbuf[CAPTION_MENU_CENTER_LABEL_TEXT_LEN_MAX]; - homescreen_view_t view = home_screen_get_view_type(); - - switch (view) { - case HOMESCREEN_VIEW_HOME: - break; - case HOMESCREEN_VIEW_ALL_APPS: - break; - case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: - selected_count = data_model_get_app_check_state(); - snprintf(trbuf, sizeof(trbuf), _("IDS_MEMO_HEADER_PD_SELECTED_ABB2"), selected_count); - layout_main_caption_set_menu_texts(trbuf, - _("IDS_TPLATFORM_ACBUTTON_CANCEL_ABB"), - _("IDS_TPLATFORM_ACBUTTON_DONE_ABB")); - break; - case HOMESCREEN_VIEW_ALL_APPS_EDIT: - layout_main_caption_set_menu_texts(_("IDS_HS_HEADER_EDIT"), "", ""); - break; - default: - break; - } -} - diff --git a/src/page_indicator.c b/src/page_indicator.c new file mode 100755 index 0000000..66c7d3c --- /dev/null +++ b/src/page_indicator.c @@ -0,0 +1,235 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "page_indicator.h" +#include "homescreen-efl.h" +#include "conf.h" +#include "edc_conf.h" +#include "util.h" + +static void __page_indicator_scroll_cb(void *data, Evas_Object *obj, void *event_info); +static void __page_indicator_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info); +static void __page_indicator_set_current_page(page_indicator_t *page_indicator); +static void __page_indicator_unit_rotate(Evas_Object *unit, double angle, double alpha); + +page_indicator_t * page_indictor_create(Evas_Object *scroller) +{ + int i; + char edj_path[PATH_MAX] = {0, }; + page_indicator_t *page_indicator = NULL; + + snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/page_indicator_unit.edj")); + + if (scroller == NULL) + return NULL; + page_indicator = (page_indicator_t *)malloc(sizeof(page_indicator_t)); + page_indicator->scroller = scroller; + page_indicator->page_count = 0; + page_indicator->current_page = -1; + + page_indicator->box = elm_box_add(homescreen_efl_get_win()); + if (!page_indicator->box) { + LOGE("page_index->box==NULL"); + free(page_indicator); + return NULL; + } + elm_box_homogeneous_set(page_indicator->box, EINA_TRUE); + elm_box_horizontal_set(page_indicator->box, EINA_TRUE); + + evas_object_size_hint_weight_set(page_indicator->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_align_set(page_indicator->box, 0.5, 0.5); + elm_box_padding_set(page_indicator->box, PAGE_INDICATOR_GAP, 0); + evas_object_show(page_indicator->box); + evas_object_move(page_indicator->box, page_indicator->x, page_indicator->y); + + evas_object_smart_callback_add(scroller, "scroll", __page_indicator_scroll_cb, page_indicator); + evas_object_smart_callback_add(scroller, "scroll,anim,stop", __page_indicator_scroll_anim_stop_cb, page_indicator); + + for (i = 0; i < PAGE_INDICATOR_MAX_PAGE_COUNT; i++) { + page_indicator->unit[i] = elm_layout_add(homescreen_efl_get_win()); + elm_layout_file_set(page_indicator->unit[i], edj_path, GROUP_PAGE_INDICATOR_UNIT); + evas_object_size_hint_weight_set(page_indicator->unit[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(page_indicator->unit[i], PAGE_INDICATOR_UNIT, PAGE_INDICATOR_UNIT); + + Evas_Object *rect = evas_object_rectangle_add(homescreen_efl_get_win()); + evas_object_color_set(rect, 255, 255, 255, 0); + evas_object_size_hint_min_set(rect, PAGE_INDICATOR_UNIT, PAGE_INDICATOR_UNIT); + evas_object_size_hint_max_set(rect, PAGE_INDICATOR_UNIT, PAGE_INDICATOR_UNIT); + evas_object_resize(rect, PAGE_INDICATOR_UNIT, PAGE_INDICATOR_UNIT); + evas_object_show(rect); + elm_object_part_content_set(page_indicator->unit[i], SIZE_SETTER, rect); + } + + return page_indicator; +} + +void page_indicator_set_page_count(page_indicator_t *page_indicator, int count) +{ + if (page_indicator == NULL) { + LOGE("page indicator is NULL."); + return ; + } + + int i; + int width = count * PAGE_INDICATOR_UNIT + (PAGE_INDICATOR_GAP * (count-1)); + if (page_indicator->page_count == count) { + return ; + } + elm_box_unpack_all(page_indicator->box); + for (i = 0 ; i < PAGE_INDICATOR_MAX_PAGE_COUNT; i++) { + if (i < count) { + elm_box_pack_end(page_indicator->box, page_indicator->unit[i]); + evas_object_show(page_indicator->unit[i]); + } else { + evas_object_move(page_indicator->unit[i], 0, -100); + } + + } + + page_indicator->x = (WINDOW_W - width) / 2; + page_indicator->y = WINDOW_H - PAGE_INDICATOR_H - PAGE_INDICATOR_PADDING_BOTTON; + page_indicator->page_count = count; + + evas_object_resize(page_indicator->box, width, PAGE_INDICATOR_H); + evas_object_move(page_indicator->box, page_indicator->x, page_indicator->y); +} + +void page_indicator_scroller_resize(page_indicator_t *page_indicator, int width, int height) +{ + LOGD("w:%d h:%d", width, height); + page_indicator->w = width; + page_indicator->h = height; +} + +void page_indicator_set_current_page(page_indicator_t *page_indicator, int page_number) +{ + if (page_indicator == NULL) { + LOGE("page indicator is NULL."); + return ; + } + + LOGD("Set Current :%d, old : %d", page_number, page_indicator->current_page); + + page_indicator->current_page = page_number; + + __page_indicator_set_current_page(page_indicator); +} + +static void __page_indicator_scroll_cb(void *data, Evas_Object *obj, void *event_info) +{ + int x = 0; + int current_x = 0; + double angle = 0.0; + double color = 0.0; + int next_page = -1; + + page_indicator_t *page_indicator = (page_indicator_t*) data; + if (!page_indicator) { + LOGE("Invalid page_indicator"); + return; + } + elm_scroller_region_get(obj, &x, NULL, NULL, NULL); + + current_x = page_indicator->current_page * page_indicator->w; + angle = (double)(x - current_x) / page_indicator->w * 90.0; + + if (fabs((float)(x - current_x)) <= page_indicator->w) { + next_page = x > current_x ? (page_indicator->current_page+1) % page_indicator->page_count : page_indicator->current_page-1; + color = fabs(angle) * 2; + } else { + if (x > current_x) { + next_page = page_indicator->page_count-1; + color = (double)(page_indicator->w*page_indicator->page_count - x)/page_indicator->w * 180.0; + } else { + next_page = 0; + color = 180.0; + } + } + + if (next_page == page_indicator->page_count - 1 && page_indicator->current_page == 0 && page_indicator->page_count % 2 == 1) { + angle = angle - 270.0; + } + + __page_indicator_unit_rotate(page_indicator->unit[page_indicator->current_page], 90.0 + angle, 255.0 - color); + __page_indicator_unit_rotate(page_indicator->unit[next_page], angle, 75.0 + color); +} + +static void __page_indicator_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (data == NULL) { + LOGE("Invalid data"); + return ; + } + + page_indicator_t *page_indicator = (page_indicator_t*) data; + + elm_scroller_current_page_get(obj, &page_indicator->current_page, NULL); + + __page_indicator_set_current_page(page_indicator); +} + +static void __page_indicator_set_current_page(page_indicator_t *page_indicator) +{ + int i; + for (i = 0; i < page_indicator->page_count && i < PAGE_INDICATOR_MAX_PAGE_COUNT; i++) { + Evas_Object *edje = NULL; + edje = elm_layout_edje_get(page_indicator->unit[i]); + if (i == page_indicator->current_page) { + edje_object_signal_emit(edje, SIGNAL_PAGE_IDICATOR_CURRENT, SIGNAL_SOURCE); + } + //else if { } // i == center_circle + else { + edje_object_signal_emit(edje, SIGNAL_PAGE_IDICATOR_DEFAULT, SIGNAL_SOURCE); + } + } +} + +static void __page_indicator_unit_rotate(Evas_Object *unit, double angle, double alpha) +{ + Evas_Object *edje = NULL; + + if (!unit) { + LOGE("Invalid argument : unit is NULL"); + return; + } + + edje = elm_layout_edje_get(unit); + if (!edje) { + LOGE("Failed to get edje from layout"); + return; + } + + Edje_Message_Float_Set *msg = malloc(sizeof(*msg) + 2 * sizeof(double)); + msg->count = 2; + msg->val[0] = angle; + msg->val[1] = alpha; + + edje_object_message_send(edje, EDJE_MESSAGE_FLOAT_SET, 1, msg); + edje_object_signal_emit(edje, SIGNAL_PAGE_IDICATOR_ROTATION_CHANGE, SIGNAL_SOURCE); + + free(msg); +} + +void page_indicator_show(page_indicator_t *page_indicator) +{ + evas_object_show(page_indicator->box); +} + +void page_indicator_hide(page_indicator_t *page_indicator) +{ + evas_object_hide(page_indicator->box); +} + diff --git a/src/page_scroller.c b/src/page_scroller.c deleted file mode 100644 index 308f9ba..0000000 --- a/src/page_scroller.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#include "util.h" -#include "homescreen-efl.h" -#include "page_scroller.h" - -#define PAGE_SCROLLER_WIDTH 272 -#define PAGE_SCROLLER_HEIGHT 272 - -#define EDJE_PAGE_SCROLLER_FILENAME "/usr/apps/com.samsung.home-lite/res/edje/page_scroller.edj" -#define EDJE_PAGE_SCROLLER_LIVEBOX_GROUP_NAME "page_scroller_livebox" -#define EDJE_PAGE_SCROLLER_ALL_APPS_GROUP_NAME "page_scroller_all_apps" -#define EDJE_PAGE_SCROLLER_CONTENT_GROUP_NAME "page_scroller_content" - - -static Evas_Object *__page_scroller_create_scroller(void); -static void __page_scroller_change_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static Eina_Bool __page_scroller_blocker_cb(void *data); - -static struct { - Ecore_Timer *blocker; -} s_info = { - .blocker = NULL, -}; - - -HAPI Evas_Object *page_scroller_create(int page_width, int page_height) -{ - Evas_Object *scroller = NULL; - - scroller = __page_scroller_create_scroller(); - if (!scroller) { - LOGE("Failed to create scroller"); - return NULL; - } - - elm_scroller_page_size_set(scroller, page_width, page_height); - elm_scroller_loop_set(scroller, EINA_TRUE, EINA_FALSE); - elm_object_signal_callback_add(scroller, "*", SIGNAL_SOURCE, __page_scroller_change_cb, NULL); - - return scroller; -} - - -HAPI void page_scroller_destroy(Evas_Object *scroller) -{ - LOGD("Destroy page scroller"); - - if (!scroller) { - LOGE("Invalid param : scroller is NULL"); - return; - } - - evas_object_del(scroller); -} - -HAPI bool page_scroller_add_page(Evas_Object *scroller, Evas_Object *page) -{ - LOGD("Add page"); - - Evas_Object *box = NULL; - - if (!page || !scroller) { - LOGE("Invalid parameters : page or scroller is NULL"); - return false; - } - - box = elm_object_content_get(scroller); - if (!box) { - LOGE("Failed to obtain box from scroller"); - return false; - } - - elm_box_pack_end(box, page); - - return true; -} - -HAPI void page_scroller_remove_page(Evas_Object *scroller, Evas_Object *page) -{ - LOGD("Remove page"); - Evas_Object *box = NULL; - - if (!page || !scroller) { - LOGE("Page or scroller is NULL"); - return; - } - - box = elm_object_content_get(scroller); - if (!box) { - LOGE("Failed to get scroller"); - return; - } - - elm_box_unpack(box, page); - evas_object_del(page); - return; -} - -HAPI Eina_List* page_scroller_get_all_pages(Evas_Object *scroller) -{ - Evas_Object *box = NULL; - Eina_List *pages = NULL; - - if (!scroller) { - LOGE("Invalid parameter : scroller is NULL"); - return NULL; - } - - box = elm_object_content_get(scroller); - if (!box) { - LOGE("Failed to get box"); - return NULL; - } - - pages = elm_box_children_get(box); - if (!pages) { - LOGE("Failed to get pages list"); - return NULL; - } - - return pages; -} - - -HAPI Evas_Object* page_scroller_get_page(Evas_Object *scroller, int n) -{ - Eina_List *pages = NULL; - Evas_Object *page = NULL; - - pages = page_scroller_get_all_pages(scroller); - if (!pages) { - LOGE("Failed to get page"); - return NULL; - } - - page = (Evas_Object*) eina_list_nth(pages, n); - - eina_list_free(pages); - - return page; -} - - -HAPI bool page_scroller_freeze(Evas_Object *scroller) -{ - if (!scroller) { - LOGE("Page Scroller is NULL"); - return false; - } - - elm_scroller_movement_block_set(scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); - - return true; -} - -HAPI bool page_scroller_unfreeze(Evas_Object *scroller) -{ - if (!scroller) { - LOGE("Page Scroller is NULL"); - return false; - } - - elm_scroller_movement_block_set(scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK); - - return true; -} - -HAPI int page_scroller_get_page_count(Evas_Object *scroller) -{ - Eina_List *page_list = NULL; - int page_count = 0; - - if (!scroller) { - LOGE("invalid param : scroller is NULL"); - return -1; - } - - page_list = page_scroller_get_all_pages(scroller); - page_count = eina_list_count(page_list); - - eina_list_free(page_list); - - return page_count; -} - - -HAPI Eina_List* page_scroller_unpack_pages(Evas_Object *scroller) -{ - Evas_Object *box = NULL; - Eina_List *page_list = NULL; - - if (!scroller) { - LOGE("Page scroller is NULL"); - return NULL; - } - - page_list = page_scroller_get_all_pages(scroller); - - if (!page_list) { - LOGE("Failed to get m_page list"); - return NULL; - } - - box = elm_object_content_get(scroller); - elm_box_unpack_all(box); ///@todo better content unset? - - return page_list; -} - - -HAPI void page_scroller_pack_pages(Evas_Object *scroller, Eina_List *page_list) -{ - LOGD(""); - Eina_List *item = NULL; - Evas_Object *page = NULL; - Evas_Object *box = NULL; - - if (!scroller || !page_list) { - LOGE("Invalid parameters : scroller [%p] page_list [%p]", scroller, page_list); - return; - } - - box = elm_object_content_get(scroller); - if (!box) { - LOGE("Cannot obtain box, pages will remain unpacked"); - return; - } - - EINA_LIST_FOREACH(page_list, item, page) { - if (!page) { - LOGE("Failed to get page"); - continue; - } - elm_box_pack_end(box, page); - evas_object_size_hint_weight_set(page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(page, EVAS_HINT_FILL, EVAS_HINT_FILL); - } - elm_box_recalculate(box); -} - - -HAPI Evas_Object* page_scroller_get_page_thumbnail(Evas_Object *page, unsigned int w, unsigned int h) -{ - LOGD(""); - Evas_Object *image = NULL; - - if (!page) { - LOGE("Invalid page number"); - return NULL; - } - - image = evas_object_image_filled_add(evas_object_evas_get(home_screen_get_win())); - if (!image) { - LOGE("Could not create image proxy object"); - return NULL; - } - - /*set image proxy*/ - if (!evas_object_image_source_set(image, page)) { - evas_object_del(image); - LOGE("Could not set proxy image source"); - return NULL; - } - - evas_object_image_fill_set(image, 0, 0, w, h); - evas_object_move(image, 0, 0); - evas_object_show(image); - - return image; -} - -HAPI int page_scroller_get_current_page(Evas_Object *page_scroller) -{ - int h_page = -1; - - if (!page_scroller) { - LOGE("Invalid param : page_scroller is NULL"); - return -1; - } - - elm_scroller_current_page_get(page_scroller, &h_page, NULL); - - return h_page; -} - -HAPI bool page_scroller_set_current_page(Evas_Object *page_scroller, int idx) -{ - if (!page_scroller || idx < 0) { - LOGE("[INVALID_PARAM][page_scroller='%p'][idx='%d']", page_scroller, idx); - return false; - } - - - elm_scroller_page_bring_in(page_scroller, idx, 0); - return true; -} - -HAPI void page_scroller_show_page(Evas_Object *page_scroller, int idx) -{ - if (!page_scroller || idx < 0) { - LOGE("[INVALID_PARAM][page_scroller='%p'][idx='%d']", page_scroller, idx); - return; - } - - elm_scroller_page_show(page_scroller, idx, 0); -} - -static Evas_Object* __page_scroller_create_scroller(void) -{ - Evas_Object *win = home_screen_get_win(); - Evas_Object *scroller = NULL; - Evas_Object *box = NULL; - - if (!win) { - LOGE("Window doesn't exist"); - return NULL; - } - - scroller = elm_scroller_add(win); - if (!scroller) { - LOGE("Cannot create scroller"); - return NULL; - } - - elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE); - elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE); - elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_scroller_page_scroll_limit_set(scroller, 1, 1); - - evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - box = elm_box_add(scroller); - if (!box) { - LOGE("Cannot create box"); - evas_object_del(scroller); - return NULL; - } - elm_box_horizontal_set(box, EINA_TRUE); - elm_box_align_set(box, 0.5, 0.5); - evas_object_show(scroller); - elm_object_content_set(scroller, box); - - return scroller; -} - -static void __page_scroller_change_cb(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - int cnt = -1, curr = -1, dest = -1; - - cnt = page_scroller_get_page_count(obj); - curr = page_scroller_get_current_page(obj); - - if (s_info.blocker) - return; - - if (!strncmp(emission, SIGNAL_NEXT_PAGE_CHANGE, strlen(emission))) { - if (curr == cnt - 1) { - dest = 0; - } else { - dest = ++curr; - } - page_scroller_set_current_page(obj, dest); - } else if (!strncmp(emission, SIGNAL_PREV_PAGE_CHANGE, strlen(emission))) { - if (curr == 0) { - dest = cnt - 1; - } else { - dest = --curr; - } - page_scroller_set_current_page(obj, dest); - } - - s_info.blocker = ecore_timer_add(0.5, __page_scroller_blocker_cb, NULL); -} - -static Eina_Bool __page_scroller_blocker_cb(void *data) -{ - s_info.blocker = NULL; - return ECORE_CALLBACK_CANCEL; -} diff --git a/src/popup.c b/src/popup.c old mode 100644 new mode 100755 index 6131f43..aa5e398 --- a/src/popup.c +++ b/src/popup.c @@ -14,224 +14,102 @@ * limitations under the License. */ -#include "popup.h" - -#include +#include #include #include "homescreen-efl.h" +#include "popup.h" +#include "conf.h" #include "util.h" -#include "livebox_all_pages.h" -#include "app_icon.h" -#define EDJE_LAYOUT_PATH "/usr/apps/com.samsung.home-lite/res/edje/popup.edj" -#define UNABLE_PART "unable_to_add_items" -#define UNABLE_POPUP_TITLE "Unable to add" -#define SORTED_POPUP " Unable to rearrange icons
sorted by name (A-Z). " +static struct { + Evas_Object *popup; + bool is_visible; +} popup_info = { + .popup = NULL, + .is_visible = false +}; -#define POPUP_DATA_KEY "cb_data" +/* popup_t + * 0 : POPUP_CLUSTER_PAGE_FULL + * 1 : POPUP_CLUSTER_DELETE_PAGE + */ +static const char popup_title_text[POPUP_MAX][PATH_MAX_LEN] = { + "IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB", + "IDS_HS_HEADER_DELETE_PAGE_ABB2", +}; -static struct -{ - Evas_Object *opened_popup; -} s_info = { - .opened_popup = NULL +static const char popup_text[POPUP_MAX][PATH_MAX_LEN] = { + "IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG", + "IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED", }; -typedef struct _cb_data_t { - popup_confirm_cb cb_ok; - popup_cancel_cb cb_cancel; - void *data; -} cb_data_t; - -/*==========================PRIVATE FUNCTIONS DEFINITIONS======================================*/ -static void __popup_init_two_buttons(Evas_Object *popup, popup_confirm_cb confirm_cb, - popup_cancel_cb cancel_cb, popup_data_t *p_data, void *cb_data); -static void __popup_init_info(Evas_Object *popup, popup_data_t *p_data); -/*==========================POPUP CALLBACKS DEFINITIONS========================================*/ -static void __popup_btn_ok_clicked_cb(void *data, Evas_Object *obj, void *ei); -static void __popup_btn_cancel_clicked_cb(void *data, Evas_Object *obj, void *ei); - -/*==========================PUBLIC FUNCTIONS IMPLEMENTATION===================================*/ -HAPI popup_data_t *popup_create_data(void) -{ - popup_data_t *data = (popup_data_t *) calloc(1, sizeof(popup_data_t)); - return data; -} +static const char popup_button_text[POPUP_MAX][3][PATH_MAX_LEN] = { + { "IDS_CAM_SK_OK", "", "" }, + { "IDS_HS_OPT_DELETE", "IDS_CAM_SK_CANCEL", "" } +}; -HAPI void popup_data_free(popup_data_t *p_data) -{ - if (!p_data) { - LOGE("[INVALID_PARAM]"); - return; - } - - if (p_data->popup_title_text) - free(p_data->popup_title_text); - if (p_data->popup_content_text) - free(p_data->popup_content_text); - if (p_data->popup_confirm_text) - free(p_data->popup_confirm_text); - if (p_data->popup_cancel_text) - free(p_data->popup_cancel_text); - - free(p_data); -} +static void __popup_default_cb(void *data, Evas_Object *obj, void *event_info); +static void __popup_dismissed_cb(void *data, Evas_Object *obj, void *event_info); -HAPI void popup_show(popup_data_t *p_data, popup_confirm_cb confirm_cb, popup_cancel_cb cancel_cb, - void *cb_data) +void popup_show(popup_t type, int btn_count, Evas_Smart_Cb btn_func[3], void *func_data[3]) { - Evas_Object *popup = NULL; - - if (!p_data) { - LOGE("[INVALID_DATA]"); - return; - } - - popup = elm_popup_add(home_screen_get_win()); - if (!popup) { - LOGE("[FAILED][elm_popup_add]"); - evas_object_del(popup); - popup_data_free(p_data); - return; - } - - elm_popup_orient_set(popup, p_data->orientation); - - switch (p_data->type) { - case POPUP_TWO_BUTTONS: - __popup_init_two_buttons(popup, confirm_cb, cancel_cb, p_data, cb_data); - break; - case POPUP_INFO: - __popup_init_info(popup, p_data); - } - - s_info.opened_popup = popup; - evas_object_layer_set(popup, EVAS_LAYER_MAX); - evas_object_show(popup); + if (popup_info.is_visible) { + return ; + } + + char part[3][10] = { "button1", "button2", "button3" }; + + popup_info.is_visible = true; + + popup_info.popup = elm_popup_add(homescreen_efl_get_win()); + elm_popup_align_set(popup_info.popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + evas_object_size_hint_weight_set(popup_info.popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(popup_info.popup, "title,text", _(popup_title_text[type])); + elm_object_part_text_set(popup_info.popup, "default", _(popup_text[type])); + evas_object_smart_callback_add(popup_info.popup, "dismissed", __popup_dismissed_cb, NULL); + + int idx = 0; + for (idx = 0; idx < btn_count; idx++) { + Evas_Object *btn; + btn = elm_button_add(popup_info.popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, _(popup_button_text[type][idx])); + elm_object_part_content_set(popup_info.popup, part[idx], btn); + evas_object_smart_callback_add(btn, "clicked", + (btn_func[idx] == NULL ? __popup_default_cb : btn_func[idx]), func_data[idx]); + } + evas_object_show(popup_info.popup); } -HAPI Eina_Bool popup_destroy(void) +void popup_hide(void) { - if (s_info.opened_popup) { - evas_object_del(s_info.opened_popup); - s_info.opened_popup = NULL; - return EINA_TRUE; - } + if (!popup_info.is_visible) { + return ; + } - return EINA_FALSE; -} -/*==========================PRIVATE FUNCTIONS IMPLEMENTATION==================================*/ -static void __popup_init_two_buttons(Evas_Object *popup, popup_confirm_cb confirm_cb, - popup_cancel_cb cancel_cb, popup_data_t *p_data, void *cb_data) -{ - Evas_Object *btn_ok = NULL; - Evas_Object *btn_cancel = NULL; - cb_data_t *data = NULL; - - if (!p_data) { - LOGE("[INVALID_PARAM][p_data=NULL]"); - return; - } - - if (!popup) { - LOGE("[INVALID_PARAM]"); - popup_data_free(p_data); - return; - } - - data = (cb_data_t *) malloc(sizeof(cb_data_t)); - if (!data) { - LOGE("[FAILED][malloc]"); - popup_data_free(p_data); - return; - } - - btn_ok = elm_button_add(popup); - if (!btn_ok) { - LOGE("[FAILED][elm_button_add]"); - evas_object_del(popup); - popup_data_free(p_data); - free(data); - return; - } - - btn_cancel = elm_button_add(popup); - if (!btn_cancel) { - LOGE("[FAILED][elm_button_add]"); - evas_object_del(popup); - popup_data_free(p_data); - free(data); - return; - } - - /*setting popup properties.*/ - elm_object_part_text_set(popup, "title,text", p_data->popup_title_text); - elm_object_part_text_set(popup, "default", p_data->popup_content_text); - - elm_object_part_text_set(btn_ok, "default", p_data->popup_confirm_text); - elm_object_part_text_set(btn_cancel, "default", p_data->popup_cancel_text); - - elm_object_part_content_set(popup, "button1", btn_cancel); - elm_object_part_content_set(popup, "button2", btn_ok); - - data->cb_cancel = cancel_cb; - data->cb_ok = confirm_cb; - data->data = cb_data; - - evas_object_smart_callback_add(btn_ok, "clicked", __popup_btn_ok_clicked_cb, data); - evas_object_smart_callback_add(btn_cancel, "clicked", __popup_btn_cancel_clicked_cb, data); - - popup_data_free(p_data); + popup_info.is_visible = false; + + evas_object_hide(popup_info.popup); + evas_object_del(popup_info.popup); + popup_info.popup = NULL; } -static void __popup_init_info(Evas_Object *popup, popup_data_t *p_data) +bool popup_is_show(void) { - if (!p_data) { - LOGE("[INVALID_PARAM][p_data=NULL]"); - return; - } - - if (!popup) { - LOGE("[INVALID_PARAM]"); - popup_data_free(p_data); - return; - } - - elm_object_style_set(popup, "toast"); - elm_object_part_text_set(popup, "default", p_data->popup_content_text); - elm_popup_timeout_set(popup, p_data->visible_time); - - popup_data_free(p_data); + return popup_info.is_visible; } -/*==================================POPUP CALLBACKS IMPLEMENTATION============================*/ -static void __popup_btn_ok_clicked_cb(void *data, Evas_Object *obj, void *ei) +static void __popup_default_cb(void *data, Evas_Object *obj, void *event_info) { - LOGI("__popup_btn_ok_clicked_cb"); - cb_data_t *cb_data = (cb_data_t *) data; - - if (!cb_data) { - LOGE("[INVALID_CB_DATA]"); - return; - } - - if (cb_data->cb_ok) cb_data->cb_ok(cb_data->data); - - popup_destroy(); + popup_hide(); } -static void __popup_btn_cancel_clicked_cb(void *data, Evas_Object *obj, void *ei) +static void __popup_dismissed_cb(void *data, Evas_Object *obj, void *event_info) { - LOGI("__popup_btn_cancel_clicked_cb"); - cb_data_t *cb_data = (cb_data_t *) data; - - if (!data) { - LOGE("[INVALID_CB_DATA]"); - return; - } - - if (cb_data->cb_cancel) cb_data->cb_cancel(cb_data->data); - - popup_destroy(); + popup_info.is_visible = false; + if (popup_info.popup) { + evas_object_del(popup_info.popup); + popup_info.popup = NULL; + } } diff --git a/src/tree.c b/src/tree.c deleted file mode 100644 index 9582d33..0000000 --- a/src/tree.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include "tree.h" -#include "db/db.h" - -const db_item_t __tree_node_convert(Tree_node_t *node); - -HAPI bool tree_node_new(Tree_node_t **node) -{ - *node = (Tree_node_t *)calloc(1, sizeof(Tree_node_t)); - - return (*node) != NULL; -} - -/* - * detatch node - */ -HAPI bool tree_node_detatch(Tree_node_t *node) -{ - if (!node) - return false; - - if (node->prev) { - node->prev->next = node->next; - db_update_apps(__tree_node_convert(node->prev), true); - } else { - node->parent->first = node->next; - db_update_apps(__tree_node_convert(node->parent), true); - } - - if (node->next) { - node->next->prev = node->prev; - } else { - node->parent->last = node->prev; - } - - if (node->parent) - node->parent->count--; - - node->next = NULL; - node->prev = NULL; - node->parent = NULL; - - db_update_apps(__tree_node_convert(node), true); - - return true; -} - -HAPI bool tree_node_append(Tree_node_t *parent, Tree_node_t *node) -{ - if (!node || !parent) - return false; - - if (!parent->last) { - parent->first = node; - node->prev = NULL; - db_update_apps(__tree_node_convert(parent), true); - } else { - parent->last->next = node; - node->prev = parent->last; - db_update_apps(__tree_node_convert(parent->last), true); - } - - parent->last = node; - node->parent = parent; - node->parent->count++; - node->next = NULL; - - db_update_apps(__tree_node_convert(node), true); - - return true; -} - -HAPI bool tree_node_append_relative(Tree_node_t *node, Tree_node_t *relative) -{ - if (!relative->next) - return tree_node_append(relative->parent, node); - - node->parent = relative->parent; - node->parent->count++; - relative->next->prev = node; - node->next = relative->next; - relative->next = node; - node->prev = relative; - - db_update_apps(__tree_node_convert(node), true); - db_update_apps(__tree_node_convert(relative), true); - - return true; -} - -HAPI bool tree_node_prepend(Tree_node_t *parent, Tree_node_t *node) -{ - if (!node || !parent) - return false; - - if (!parent->first) { - /*No elements in parent*/ - parent->last = node; - node->next = NULL; - } else { - parent->first->prev = node; - node->next = parent->first; - db_update_apps(__tree_node_convert(parent), true); - } - - parent->first = node; - node->parent = parent; - node->parent->count++; - node->prev = NULL; - - db_update_apps(__tree_node_convert(node), true); - - return true; -} - -HAPI bool tree_node_prepend_relative(Tree_node_t *node, Tree_node_t *relative) -{ - if (!relative->prev) - return tree_node_prepend(relative->parent, node); - - node->parent = relative->parent; - node->parent->count++; - relative->prev->next = node; - node->prev = relative->prev; - relative->prev = node; - node->next = relative; - - db_update_apps(__tree_node_convert(node), true); - db_update_apps(__tree_node_convert(node->prev), true); - - return true; -} - -HAPI bool tree_in_depth_browse(Tree_node_t *node, tree_browse_cb_t func_cb, void *data) -{ - if (!node) - return false; - - if (func_cb) { - if (!func_cb(NULL, node, data)) - return false; - } - - Tree_node_t *it; - TREE_NODE_FOREACH(node, it) { - if (!tree_in_depth_browse(it, func_cb, data)) - return false; - } - - return true; -} - -void tree_node_update(Tree_node_t *node) -{ - if (!node) { - LOGE("node == NULL"); - return; - } - - db_update_apps(__tree_node_convert(node), true); -} - -HAPI void tree_node_free(Tree_node_t *node, Tree_node_t **first_child, Tree_node_t **last_child, int *child_count) -{ - Tree_node_t *it = NULL; - - if (!node) - return; - - db_update_apps(__tree_node_convert(node), false); - - if (first_child) - *first_child = node->first; - - if (last_child) - *last_child = node->last; - - if (child_count) - *child_count = node->count; - - if (node->parent) { - node->parent->count--; - - if (node->parent->first == node) - node->parent->first = node->next; - - if (node->parent->last == node) - node->parent->last = node->prev; - } - - if (node->prev) - node->prev->next = node->next; - - if (node->next) - node->next->prev = node->prev; - - for (it = node->first; it; it = it->next) - it->parent = NULL; - - app_item_free(node->data); - free(node); -} - -HAPI const db_item_t __tree_node_convert(Tree_node_t *node) -{ - db_item_t item = { - id : node->data->unique_id, - type : node->data->type, - appid : node->data->appid ? (char *)node->data->appid : (char *)"", - first_id : node->first ? node->first->data->unique_id : -1, - next_id : node->next ? node->next->data->unique_id : -1, - x : node->data->col, - y : node->data->row, - w : node->data->col_span, - h : node->data->row_span, - content_info : node->data->content_info, - }; - return item; -} diff --git a/src/util.c b/src/util.c old mode 100644 new mode 100755 index c63a21c..22cdc78 --- a/src/util.c +++ b/src/util.c @@ -15,197 +15,53 @@ */ #include -#include +#include -#include "homescreen-efl.h" #include "util.h" -#include "data_model.h" - -HAPI Evas_Object *util_create_edje_layout(Evas_Object *parent, const char *edje_filename, const char *edje_group) -{ - Evas_Object *layout = NULL; - - if (!edje_filename || !edje_group) { - LOGE("Filename or groupname is NULL"); - return NULL; - } - - if (!parent) { - LOGE("Parent is NULL"); - return NULL; - } - - layout = elm_layout_add(parent); - if (!layout) { - LOGE("Cannot create layout"); - return NULL; - } - - if (!elm_layout_file_set(layout, edje_filename, edje_group)) { - evas_object_del(layout); - LOGE("Cannot load layout"); - return NULL; - } - - evas_object_show(layout); - - return layout; -} - -/* TEST FUNCTIONS : TO BE REMOVED*/ -HAPI void tst_resize_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - Evas_Coord x, y, w, h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - LOGD("Obj_Type[%s] %d %d %d %d", evas_object_type_get(obj), x, y, w, h); -} - -HAPI void tst_show_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - LOGD("MSZ "); - -} - -HAPI void tst_hide_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - LOGD("MSZ "); -} - -HAPI void tst_move_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - Evas_Coord x, y, w, h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - LOGD("MSZ %d %d %d %d", x, y, w, h); -} - -HAPI void tst_del_cb(void *data, Evas *e, Evas_Object *obj, void *ei) -{ - LOGD("tst_del_cb: obj type [%s]", evas_object_type_get(obj)); - - Tree_node_t *t_data = evas_object_data_get(obj, KEY_ICON_DATA); - if (t_data) - LOGI("[obtained data [%s]]", t_data->data->label); -} - -HAPI Eina_List *elm_gengrid_get_evas_objects_from_items(Evas_Object *gengrid) -{ - Eina_List *items = NULL; - Eina_List *it = NULL; - Elm_Object_Item *data = NULL; - - Eina_List *tmp = NULL; - Evas_Object *obj = NULL; - - if (!gengrid) { - LOGE("[INVALID_PARAM][gengrid='%p']", gengrid); - return NULL; - } - - tmp = elm_gengrid_realized_items_get(gengrid); - if (!tmp) { - LOGE("[FAILED][elm_gengrid_realized_items_get]"); - return NULL; - } - - EINA_LIST_FOREACH(tmp, it, data) { - if (!data) - continue; - - obj = elm_object_item_part_content_get(data, GRID_CONTENT); - if (!obj) { - LOGE("[FAILED][elm_object_item_part_content_get]"); - eina_list_free(tmp); - eina_list_free(items); - return NULL; - } - - items = eina_list_append(items, obj); - - if (!items) { - LOGE("[FAILED][eina_list_append]"); - eina_list_free(tmp); - return NULL; - } - } - - eina_list_free(tmp); - - return items; -} - -HAPI Elm_Object_Item *elm_gengrid_get_item_at_index(Evas_Object *gengrid, int idx) -{ - Eina_List *items = NULL; - Elm_Object_Item *found = NULL; - - if (!gengrid || idx < 0) { - LOGE("[INVALID_PARAM][gengrid='%p'][idx='%d']", gengrid, idx); - return NULL; - } - - items = elm_gengrid_realized_items_get(gengrid); - if (!items) { - LOGE("[FAILED][elm_gengrid_realized_items_get]"); - return NULL; - } - - if (idx > eina_list_count(items)) { - LOGE("[INVALID_INDEX]"); - eina_list_free(items); - return NULL; - } - - found = eina_list_nth(items, idx); - eina_list_free(items); - - return found; -} const char *util_get_file_path(enum app_subdir dir, const char *relative) { - static char buf[PATH_MAX]; - char *prefix; - - switch (dir) { - case APP_DIR_DATA: - prefix = app_get_data_path(); - break; - case APP_DIR_CACHE: - prefix = app_get_cache_path(); - break; - case APP_DIR_RESOURCE: - prefix = app_get_resource_path(); - break; - case APP_DIR_SHARED_DATA: - prefix = app_get_shared_data_path(); - break; - case APP_DIR_SHARED_RESOURCE: - prefix = app_get_shared_resource_path(); - break; - case APP_DIR_SHARED_TRUSTED: - prefix = app_get_shared_trusted_path(); - break; - case APP_DIR_EXTERNAL_DATA: - prefix = app_get_external_data_path(); - break; - case APP_DIR_EXTERNAL_CACHE: - prefix = app_get_external_cache_path(); - break; - case APP_DIR_EXTERNAL_SHARED_DATA: - prefix = app_get_external_shared_data_path(); - break; - default: - LOGE("Not handled directory type."); - return NULL; - } - size_t res = eina_file_path_join(buf, sizeof(buf), prefix, relative); - free(prefix); - if (res > sizeof(buf)) { - LOGE("Path exceeded PATH_MAX"); - return NULL; - } - - return &buf[0]; + static char buf[PATH_MAX]; + char *prefix; + + switch (dir) { + case APP_DIR_DATA: + prefix = app_get_data_path(); + break; + case APP_DIR_CACHE: + prefix = app_get_cache_path(); + break; + case APP_DIR_RESOURCE: + prefix = app_get_resource_path(); + break; + case APP_DIR_SHARED_DATA: + prefix = app_get_shared_data_path(); + break; + case APP_DIR_SHARED_RESOURCE: + prefix = app_get_shared_resource_path(); + break; + case APP_DIR_SHARED_TRUSTED: + prefix = app_get_shared_trusted_path(); + break; + case APP_DIR_EXTERNAL_DATA: + prefix = app_get_external_data_path(); + break; + case APP_DIR_EXTERNAL_CACHE: + prefix = app_get_external_cache_path(); + break; + case APP_DIR_EXTERNAL_SHARED_DATA: + prefix = app_get_external_shared_data_path(); + break; + default: + LOGE("Not handled directory type."); + return NULL; + } + size_t res = eina_file_path_join(buf, sizeof(buf), prefix, relative); + free(prefix); + if (res > sizeof(buf)) { + LOGE("Path exceeded PATH_MAX"); + return NULL; + } + + return &buf[0]; } diff --git a/src/widget_viewer.c b/src/widget_viewer.c new file mode 100755 index 0000000..d678725 --- /dev/null +++ b/src/widget_viewer.c @@ -0,0 +1,80 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +#include "widget_viewer.h" +#include "util.h" +#include "conf.h" +#include "edc_conf.h" + +static void __widget_viewer_delete_btn_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +void widget_viewer_init(Evas_Object *win) +{ + widget_viewer_evas_init(win); +} + +void widget_viewer_fini(void) +{ + widget_viewer_evas_fini(); +} + +Evas_Object *widget_viewer_add_widget(Evas_Object *parent, widget_data_t *item, int *widget_width, int *widget_height) +{ + Evas_Object *widget_layout; + + widget_layout = elm_layout_add(parent); + elm_layout_file_set(widget_layout, util_get_res_file_path(EDJE_DIR"/widget.edj"), GROUP_WIDGET_LY); + evas_object_size_hint_weight_set(widget_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + widget_service_get_size(item->type, widget_width, widget_height); + + Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(widget_layout)); + evas_object_size_hint_min_set(rect, CLUSTER_W / 4, CLUSTER_H / 4); + evas_object_size_hint_align_set(rect, 0, 0); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(rect); + elm_object_part_content_set(widget_layout, SIZE_SETTER, rect); + +#if 1 + Evas_Object *widget = widget_viewer_evas_add_widget(widget_layout, item->pkg_name, NULL, item->period); + evas_object_size_hint_min_set(widget, *widget_width, *widget_height); + evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(widget, 255, 255, 255, 255); +#else // for TEST + Evas_Object *widget = evas_object_rectangle_add(evas_object_evas_get(widget_layout)); + evas_object_size_hint_min_set(widget, *widget_width, *widget_height); + evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(widget, 0, 0, 255, 255); + evas_object_show(widget); +#endif + elm_object_part_content_set(widget_layout, WIDGET_CONTENT, widget); + + elm_object_signal_callback_add(widget_layout, SIGNAL_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE, __widget_viewer_delete_btn_clicked_cb, (void *)item); + + evas_object_show(widget); + evas_object_show(widget_layout); + + return widget_layout; +} + +static void __widget_viewer_delete_btn_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + widget_data_t *item = (widget_data_t *)data; + cluster_data_delete(item); +} diff --git a/tizen-manifest.xml b/tizen-manifest.xml old mode 100644 new mode 100755 index 94c97a9..03aa533 --- a/tizen-manifest.xml +++ b/tizen-manifest.xml @@ -1,8 +1,9 @@ - + + Homescreen Application - + homescreen-efl.png @@ -10,9 +11,8 @@ http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/packagemanager.admin http://tizen.org/privilege/shortcut - http://tizen.org/privilege/notification - http://tizen.org/privilege/display http://tizen.org/privilege/packagemanager.info http://tizen.org/privilege/widget.viewer -- 2.7.4 From dd8fc18cf763e9020486037098b0c47980831561 Mon Sep 17 00:00:00 2001 From: YoungHun Cho Date: Wed, 18 May 2016 17:22:24 +0900 Subject: [PATCH 08/16] bug fix : delete folder data on db & folder popup display issue Signed-off-by: YoungHun Cho Change-Id: I36c7bdfafd699b362d365d356c4b1b1abd9b2e57 --- res/edje/apps_folder_popup.edc | 7 +++++-- src/apps_db.c | 4 ++-- src/apps_view.c | 16 +++++----------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/res/edje/apps_folder_popup.edc b/res/edje/apps_folder_popup.edc index d1f3c83..bdf76dc 100755 --- a/res/edje/apps_folder_popup.edc +++ b/res/edje/apps_folder_popup.edc @@ -210,8 +210,11 @@ collections { name: "hide_plus_icon"; signal: SIGNAL_APPS_FOLDER_HIDE_PLUS_ICON; source: SIGNAL_SOURCE; - action: STATE_SET "hide" 0.0; - target: APPS_FOLDER_PLUS_ICON; + script { + custom_state(PART:APPS_FOLDER_PLUS_ICON, "default", 0.0); + set_state_val(PART:APPS_FOLDER_PLUS_ICON, STATE_VISIBLE, 0); + set_state(PART:APPS_FOLDER_PLUS_ICON, "custom", 0.0); + } } } } diff --git a/src/apps_db.c b/src/apps_db.c index 093120f..922090d 100755 --- a/src/apps_db.c +++ b/src/apps_db.c @@ -83,7 +83,7 @@ enum { iconPath) VALUES(%d,'%s',%d,%d,'%s','%s','%s',%d,%d,%d,'%s')" #define SELECT_ITEM "SELECT * FROM apps;" -#define SELECT_APP_ITEM "SELECT * FROM apps WHERE type=0;" +#define SELECT_APP_ITEM "SELECT * FROM apps WHERE type=0 AND isFolder=0;" static bool __apps_db_open(void); @@ -160,7 +160,7 @@ bool apps_db_get_list(Eina_List **apps) str = (const char *) sqlite3_column_text(stmt, COL_PACKAGE_STR); item->pkg_str = (!str || !strlen(str)) ? NULL : strdup(str); str = (const char *) sqlite3_column_text(stmt, COL_LABEL); - item->label_str = (!str || !strlen(str)) ? NULL : strdup(str); + item->label_str = (!str) ? NULL : strdup(str); str = (const char *) sqlite3_column_text(stmt, COL_URI); item->uri = (!str || !strlen(str)) ? NULL : strdup(str); item->type = sqlite3_column_int(stmt, COL_TYPE); diff --git a/src/apps_view.c b/src/apps_view.c index 90a4d07..3455eb6 100755 --- a/src/apps_view.c +++ b/src/apps_view.c @@ -343,21 +343,14 @@ Evas_Object* apps_view_create_icon(app_data_t *item) elm_object_signal_emit(item->app_layout, SIGNAL_CHOOSER_MODE_ON, SIGNAL_SOURCE); } __apps_view_badge_update_icon(item); + evas_object_show(icon_image); } elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, __apps_view_icon_clicked_cb, (void *)item); elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE, __apps_view_icon_uninstall_btn_clicked_cb, (void *)item); elm_object_signal_callback_add(icon_layout, SIGNAL_CHANGED_CHECK_BOX, SIGNAL_SOURCE, __apps_view_icon_check_changed_cb, (void *)item); - /* - elm_object_signal_callback_add(icon_layout, SIGNAL_DEFAULT_TOUCH_DOWN , APPS_ICON_CONTENT_TOUCH, _all_apps_icon_touch_down_cb, (void *)item); - elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, _all_apps_icon_clicked_cb, (void *)item); - elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE, _all_apps_icon_uninstall_button_clicked_cb, (void *)item); - elm_object_signal_callback_add(icon_layout, SIGNAL_CHANGED_CHECK_BOX, SIGNAL_SOURCE, _all_apps_icon_checkbox_changed, (void *)item); -*/ - //icon label elm_object_part_text_set(icon_layout, APPS_ICON_NAME, item->label_str); - evas_object_show(icon_image); evas_object_show(icon_layout); LOGD("icon [%s] create", item->pkg_str); @@ -874,12 +867,10 @@ static void __apps_view_open_folder_popup(app_data_t *item) evas_object_size_hint_weight_set(apps_view_s.folder_popup_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_resize(apps_view_s.folder_popup_ly, apps_view_s.width, apps_view_s.height); - evas_object_show(apps_view_s.folder_popup_ly); - Evas_Object *entry = elm_entry_add(apps_view_s.folder_popup_ly); apps_view_s.folder_title_entry = entry; evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_entry_single_line_set(entry, EINA_FALSE); + elm_entry_single_line_set(entry, EINA_TRUE); elm_entry_scrollable_set(entry, EINA_TRUE); evas_object_show(entry); @@ -894,6 +885,8 @@ static void __apps_view_open_folder_popup(app_data_t *item) apps_view_s.animator = ecore_animator_timeline_add(HOME_FOLDR_ANIMATION_TIME, __apps_view_show_folder_anim, NULL); elm_object_signal_callback_add(apps_view_s.folder_popup_ly, SIGNAL_APPS_FOLDER_HIDE, SIGNAL_SOURCE, __apps_view_hide_folder_cb, NULL); + + evas_object_show(apps_view_s.folder_popup_ly); } static Eina_Bool __apps_view_show_folder_anim(void *data, double pos) @@ -951,6 +944,7 @@ static void __apps_view_close_folder_popup_done(void) apps_view_s.folder_popup_ly = NULL; apps_view_s.opened_folder = NULL; } + static void __apps_view_hide_folder_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { if (apps_view_s.opened_folder) -- 2.7.4 From fd9957ef5ec6cc4d3c9c374856827ef05c6965fb Mon Sep 17 00:00:00 2001 From: YoungHun Cho Date: Mon, 23 May 2016 13:44:03 +0900 Subject: [PATCH 09/16] add long press on cluster view Change-Id: Ifdb020319040056271425c5cc5cf8379ebbd8601 Signed-off-by: YoungHun Cho --- .sdk_delta.info | Bin 30517 -> 21031 bytes .sign/.manifest.tmp | 208 +++++++++++-------------- .sign/author-signature.xml | 376 ++++++++++++++------------------------------ .sign/signature1.xml | 378 ++++++++++++++------------------------------- inc/mouse.h | 1 + inc/widget_viewer.h | 1 + res/edje/cluster_page.edc | 2 - src/apps_view.c | 5 +- src/cluster_data.c | 2 +- src/cluster_view.c | 184 ++++++++++++++++++---- src/page_indicator.c | 2 +- src/widget_viewer.c | 12 +- 12 files changed, 484 insertions(+), 687 deletions(-) diff --git a/.sdk_delta.info b/.sdk_delta.info index d99572355c07a107c7de9148bfca687035b95451..a4d9800a0fc8ab7785508a3ad66fab4d5f03183e 100644 GIT binary patch literal 21031 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 TAKnkRkW29IoboSCyIT8K7@7x0 diff --git a/.sign/.manifest.tmp b/.sign/.manifest.tmp index 151acc1..ddb5d60 100644 --- a/.sign/.manifest.tmp +++ b/.sign/.manifest.tmp @@ -1,131 +1,95 @@ -bin/homescreen-efl__DEL__jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= -res/edje/app_grid.edj__DEL__NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= -res/edje/color_classes.edj__DEL__dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= -res/edje/folder.edj__DEL__2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= -res/edje/folder_entry.edj__DEL__4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= -res/edje/home.edj__DEL__d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= -res/edje/icon.edj__DEL__fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= -res/edje/index_element.edj__DEL__GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= -res/edje/livebox_container.edj__DEL__D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= -res/edje/livebox_layout.edj__DEL__gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= -res/edje/page_edit.edj__DEL__Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= -res/edje/page_edit_util.edj__DEL__MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= -res/edje/preview.edj__DEL__MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= -res/images/00_scroll_bar_h.png__DEL__YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= -res/images/00_scroll_bar_v.png__DEL__69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= -res/images/1x1 preview shortcut.png__DEL__3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= -res/images/all_apps_icon_menu.png__DEL__nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= -res/images/app_icon_checkbox_bg.png__DEL__uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= -res/images/app_icon_checkbox_border.png__DEL__y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= -res/images/app_icon_checkbox_on.png__DEL__rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= -res/images/app_icon_downloadable.png__DEL__4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= +bin/homescreen-efl__DEL__tcjOCyj2e5XIByWhdkzRhfral3e6DLHgJYsUX3aYsH0= +res/edje/add_widget_viewer.edj__DEL__kxOp0/9NM7zavtZCS/aRtK4J/kktpjndyqxWi/ctNCE= +res/edje/app_icon.edj__DEL__hSuSQ3hQZXps9VqOx+iF5a8yxxuQYp1pX8X7o+zOiFY= +res/edje/apps_chooser_btn.edj__DEL__LpSthYUiusXGKzPufc1Z+UrTWOcLQtBTkbFqj1P0Z/w= +res/edje/apps_folder_icon.edj__DEL__nt1/iw823ktobTD7tCkH8qF3ECx+dJzZ4nhbFEzV9jY= +res/edje/apps_folder_popup.edj__DEL__XwzpTRnEBagQ/fjveMIUJHywQjJJw9UiTHHANjYTL38= +res/edje/apps_view.edj__DEL__LnTRhc7GKMlwBkLDmKWjbkAGAym388rXL5di6GR1SoI= +res/edje/apps_view_bg.edj__DEL__en0euIjmeqdudjs19LBKC38zGl7+NWMHWAnof7DBcKA= +res/edje/cluster_allpage.edj__DEL__uqDmQIugV+cL0AvTbyrB+Vx/rEpBthwIPPVP5xsuyGQ= +res/edje/cluster_allpage_thumbnail.edj__DEL__Ejp60/SrY0CZmR5dThP9k+Q0+z1EL3ZW7zABqM2TVI0= +res/edje/cluster_page.edj__DEL__FOWNwnM9qfTbXB3POm08kHT9/FUpGFRlu5RiVBSGV5c= +res/edje/home.edj__DEL__Ej7R8hosaLip//gef8JFzUOv97yfsNfh5QUODTJS7ug= +res/edje/home_btn.edj__DEL__whmDKsbXwSg4lQiqqXqwmOJgWvMMi1m9eN1B4uXngPY= +res/edje/page_indicator_unit.edj__DEL__shG/CpjlVPg1oMMerjnmv23B0QJal0wm55XhQi3+cxs= +res/edje/widget.edj__DEL__nvh3Lst1qzLtEA92yDXQFcUgsYwQXVHDEpNLw/pjiOg= +res/images/add_page_nor.png__DEL__hqnpwU7y0026fePoeHQUHiIsQkQkE6YMrEOLgWmi24s= +res/images/add_page_press.png__DEL__FeY8xIiCwRls8AYZLRxOVUNJqWCB85HWNvWcSibOOhE= +res/images/all_page_add.png__DEL__NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= +res/images/all_page_add_press.png__DEL__nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= +res/images/all_page_drag.png__DEL__QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= res/images/app_press_117.png__DEL__E0bg/oVwC1pn7GMC+aZdkXgJFEXghqC3BrLkLWgt9Ko= -res/images/btn_add_nor.png__DEL__ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= -res/images/btn_add_press.png__DEL__Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= +res/images/btn_add_nor.png__DEL__yXmN6gPaInzPqMnnvZy6EGtYkGEG9yxPC29xjSSOZnw= +res/images/btn_add_press.png__DEL__Rp80WWmWlHdOMKUD28T+RwUiyKpO0W+ITPmDk0qgLLo= res/images/btn_delete_nor.png__DEL__87nZJ0uJhX3Kx2dv6BMUmHDw/4xagceKslZ7bML7hvo= res/images/btn_delete_press.png__DEL__y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= -res/images/btn_input_clear.png__DEL__kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= -res/images/core_page_indicator_on.png__DEL__HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= -res/images/core_page_indicator_on_horizontal.png__DEL__0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= -res/images/default.png__DEL__Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= +res/images/core_check_bg.png__DEL__HCpFQAsWha3GigpGWrubNVXVShl0PT5o7LxsThAkhI0= +res/images/core_check_bg_stroke.png__DEL__5XLz72s6yi/KOjCLocZJ/WrWgwYlAlGxDvJO90k3JPM= +res/images/core_check_icon.png__DEL__rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= +res/images/default_app_icon.png__DEL__Y9zRuA/OXInxUgtMSp1QJqrh999tKjpCQ7YPsMcF8Kk= res/images/default_bg.png__DEL__0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= -res/images/edit_all_page_add.png__DEL__NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= -res/images/edit_all_page_add_press.png__DEL__nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= -res/images/edit_all_page_bg.png__DEL__UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= -res/images/edit_all_page_create.png__DEL__wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= -res/images/edit_all_page_drag.png__DEL__QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= -res/images/edit_page.png__DEL__0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= -res/images/edit_page_current.png__DEL__nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= -res/images/folder_appicon_bg.png__DEL__SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= +res/images/folder_appicon_bg.png__DEL__noOZYNOHHOiWJijd4qawld1rsQZ12oYwz7PsgZybiZ8= res/images/folder_appicon_bg_impossible.png__DEL__zsCUAlXZcgZpTpvNM8pwzCCvzQxDtltJf7V6YA0DT4I= res/images/folder_appicon_bg_possible.png__DEL__z5iytDrt/KDlOXhLpUdQYzzujZE6edmRR6lasSQewHw= -res/images/folder_appicon_empty_bg.png__DEL__Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= +res/images/folder_appicon_empty_bg.png__DEL__IHPVIyyHM+Xr16lKSzHDDHqflN4mg4RLjaEKhSe4w7s= res/images/folder_popup_bg.png__DEL__APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= -res/images/frame.png__DEL__gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= -res/images/home_button_bg.png__DEL__l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= -res/images/home_edit_bg.#.png__DEL__TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= -res/images/home_icon_home.png__DEL__+tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= -res/images/home_icon_menu.png__DEL__H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= -res/images/home_icon_reorder.png__DEL__zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= +res/images/home_button_apps.png__DEL__NpjsIH4S1p/IhdqXCsHoNKNILPtXfeAfzacXL+giMA4= +res/images/home_button_bg.png__DEL__gv8sVrOYti1vU2kcRO8xmD0KF8U1BsQ8xbXXCea5HDQ= +res/images/home_button_home.png__DEL__7SZnhNb1SQmaKs2YuWz9x8wxiG04DRVpr+ZqzMncM8s= +res/images/home_button_menu.png__DEL__buZftpza+NBOtEcuDVxbYeMZ/zDK0wFhnvpzpV02zu4= res/images/icon_badge_container.png__DEL__jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= -res/images/icon_drawer_search.png__DEL__JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= -res/images/icon_list_close.png__DEL__3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= -res/images/icon_list_open.png__DEL__Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= -res/images/icon_shadow.png__DEL__4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= -res/images/livebox/preview_FMradio.png__DEL__AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= -res/images/livebox/preview_alarm.png__DEL__P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= -res/images/livebox/preview_calendar.png__DEL__JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= -res/images/livebox/preview_contact_4x2.png__DEL__EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= -res/images/livebox/preview_contact_4x4.png__DEL__z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= -res/images/livebox/preview_dual_clock.png__DEL__nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= -res/images/livebox/preview_gallery.png__DEL__MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= -res/images/livebox/preview_internet_4x4.png__DEL__L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= -res/images/livebox/preview_music.png__DEL__6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= -res/images/livebox/preview_singel_clock.png__DEL__H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= -res/images/livebox/preview_weather_4x2.png__DEL__A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= -res/images/livebox/preview_weather_4x4.png__DEL__ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= -res/images/preview_bg_1x1.png__DEL__HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= -res/images/preview_bg_2x1.png__DEL__IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= -res/images/preview_bg_2x2.png__DEL__xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= -res/images/preview_bg_4x1.png__DEL__QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= -res/images/preview_bg_4x2.png__DEL__mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= -res/images/preview_bg_4x3.png__DEL__+Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= -res/images/preview_bg_4x4.png__DEL__o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= -res/images/reposition_bg.png__DEL__bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= -res/images/reposition_bg_shadow.png__DEL__Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= -res/images/resize_button.png__DEL__geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= -res/images/scroll_bar.9.png__DEL__1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= -res/images/unknown.png__DEL__wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= -res/locale/ar/LC_MESSAGES/homescreen-efl.mo__DEL__qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= -res/locale/az/LC_MESSAGES/homescreen-efl.mo__DEL__SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= -res/locale/bg/LC_MESSAGES/homescreen-efl.mo__DEL__Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= -res/locale/ca/LC_MESSAGES/homescreen-efl.mo__DEL__69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= -res/locale/cs/LC_MESSAGES/homescreen-efl.mo__DEL__7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= -res/locale/da/LC_MESSAGES/homescreen-efl.mo__DEL__j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= -res/locale/de/LC_MESSAGES/homescreen-efl.mo__DEL__nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= -res/locale/el_GR/LC_MESSAGES/homescreen-efl.mo__DEL__+XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= -res/locale/en/LC_MESSAGES/homescreen-efl.mo__DEL__QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= -res/locale/en_PH/LC_MESSAGES/homescreen-efl.mo__DEL__q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= -res/locale/en_US/LC_MESSAGES/homescreen-efl.mo__DEL__GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= -res/locale/es_ES/LC_MESSAGES/homescreen-efl.mo__DEL__L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= -res/locale/es_US/LC_MESSAGES/homescreen-efl.mo__DEL__hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= -res/locale/et/LC_MESSAGES/homescreen-efl.mo__DEL__2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= -res/locale/eu/LC_MESSAGES/homescreen-efl.mo__DEL__KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= -res/locale/fi/LC_MESSAGES/homescreen-efl.mo__DEL__AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= -res/locale/fr/LC_MESSAGES/homescreen-efl.mo__DEL__cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= -res/locale/fr_CA/LC_MESSAGES/homescreen-efl.mo__DEL__NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= -res/locale/ga/LC_MESSAGES/homescreen-efl.mo__DEL__W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= -res/locale/gl/LC_MESSAGES/homescreen-efl.mo__DEL__uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= -res/locale/hi/LC_MESSAGES/homescreen-efl.mo__DEL__XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= -res/locale/hr/LC_MESSAGES/homescreen-efl.mo__DEL__Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= -res/locale/hu/LC_MESSAGES/homescreen-efl.mo__DEL__TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= -res/locale/hy/LC_MESSAGES/homescreen-efl.mo__DEL__SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= -res/locale/is/LC_MESSAGES/homescreen-efl.mo__DEL__JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= -res/locale/it_IT/LC_MESSAGES/homescreen-efl.mo__DEL__x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= -res/locale/ja_JP/LC_MESSAGES/homescreen-efl.mo__DEL__3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= -res/locale/ka/LC_MESSAGES/homescreen-efl.mo__DEL__R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= -res/locale/kk/LC_MESSAGES/homescreen-efl.mo__DEL__FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= -res/locale/ko_KR/LC_MESSAGES/homescreen-efl.mo__DEL__r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= -res/locale/lt/LC_MESSAGES/homescreen-efl.mo__DEL__zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= -res/locale/lv/LC_MESSAGES/homescreen-efl.mo__DEL__XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= -res/locale/mk/LC_MESSAGES/homescreen-efl.mo__DEL__c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= -res/locale/nb/LC_MESSAGES/homescreen-efl.mo__DEL__Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= -res/locale/nl/LC_MESSAGES/homescreen-efl.mo__DEL__q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= -res/locale/pl/LC_MESSAGES/homescreen-efl.mo__DEL__XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= -res/locale/pt_BR/LC_MESSAGES/homescreen-efl.mo__DEL__IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= -res/locale/pt_PT/LC_MESSAGES/homescreen-efl.mo__DEL__aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= -res/locale/ro/LC_MESSAGES/homescreen-efl.mo__DEL__RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= -res/locale/ru_RU/LC_MESSAGES/homescreen-efl.mo__DEL__Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= -res/locale/sk/LC_MESSAGES/homescreen-efl.mo__DEL__4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= -res/locale/sl/LC_MESSAGES/homescreen-efl.mo__DEL__Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= -res/locale/sr/LC_MESSAGES/homescreen-efl.mo__DEL__x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= -res/locale/sv/LC_MESSAGES/homescreen-efl.mo__DEL__3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= -res/locale/tr_TR/LC_MESSAGES/homescreen-efl.mo__DEL__uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= -res/locale/uk/LC_MESSAGES/homescreen-efl.mo__DEL__w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= -res/locale/uz/LC_MESSAGES/homescreen-efl.mo__DEL__1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= -res/locale/zh_CN/LC_MESSAGES/homescreen-efl.mo__DEL__dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= -res/locale/zh_HK/LC_MESSAGES/homescreen-efl.mo__DEL__6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= -res/locale/zh_TW/LC_MESSAGES/homescreen-efl.mo__DEL__LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= +res/images/page_indicator_current.png__DEL__HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= +res/images/page_indicator_unit.png__DEL__0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= +res/locale/ar/LC_MESSAGES/homescreen-efl.mo__DEL__ibnLSm8JGIo5UjVKQql8slRiGOWa82qiiJPJY5vuZek= +res/locale/az/LC_MESSAGES/homescreen-efl.mo__DEL__GzPOUx1zzTz6bhIuf8r9d7oXy/sV1nRXWKZ5btoVRPI= +res/locale/bg/LC_MESSAGES/homescreen-efl.mo__DEL__0S9duKaLJFBEXDZpVNKiapv7jRHNZ2YIdzrdgZZ0n7Y= +res/locale/ca/LC_MESSAGES/homescreen-efl.mo__DEL__iz/7dxAP0L4yBmJMByeowbhIEpucBqcK5GJacKtuJmU= +res/locale/cs/LC_MESSAGES/homescreen-efl.mo__DEL__tDeQdJ+xC98GlCKTApleYaH9HyxPyDfHt0g1Oj6QKTs= +res/locale/da/LC_MESSAGES/homescreen-efl.mo__DEL__A4lQ15pkmbb54FahN0njXRIA0nv95olfbX2zEUkMsRs= +res/locale/de/LC_MESSAGES/homescreen-efl.mo__DEL__c1Y2E3rFnvxwGaqWVzrqdxdx7u1ciELljaOcbSK6Ofk= +res/locale/el_GR/LC_MESSAGES/homescreen-efl.mo__DEL__+swN5kVV1P54WCjD50HrJokTyorUIo7BczsE9rMBtxI= +res/locale/en/LC_MESSAGES/homescreen-efl.mo__DEL__gu5LsFomEKn5zDthQ79Pq00l7lNTPwpWmfc8DGvCdNI= +res/locale/en_PH/LC_MESSAGES/homescreen-efl.mo__DEL__tXgXXEhmbLn0AxD/MWNw8mFAWBElGh2Pgmn4VjRiH6A= +res/locale/en_US/LC_MESSAGES/homescreen-efl.mo__DEL__pPmkr267A8TmCbznNyz7ngQXBG3Kq8X9nBWvo05qrqY= +res/locale/es_ES/LC_MESSAGES/homescreen-efl.mo__DEL__qkjALrQWoRk39CZdSoOg77SZhs3g6TOzDPauojV3s8c= +res/locale/es_US/LC_MESSAGES/homescreen-efl.mo__DEL__BMWnX1L36IlipJsskB76AAE3Ijq3k6O5W85syPDTGOw= +res/locale/et/LC_MESSAGES/homescreen-efl.mo__DEL__MEr/xeDQBlrRY3KZUWHrrwGIqOjOzcLM6gxWX07M5bc= +res/locale/eu/LC_MESSAGES/homescreen-efl.mo__DEL__sat+2O/zZMlEIQ6HZyWIS3E2RFC/C3h82p0jkiSfXR8= +res/locale/fi/LC_MESSAGES/homescreen-efl.mo__DEL__py2C9x3kxqwOQD/w0XfVwCij7UykPjfJcNpPaYrL/4o= +res/locale/fr/LC_MESSAGES/homescreen-efl.mo__DEL__3w7W8u64bBfu03NiAdPUZuTxQ69DykBj8J1oW2DjYn8= +res/locale/fr_CA/LC_MESSAGES/homescreen-efl.mo__DEL__Nvdus943mCM8IWbIseBnGtDKO33HqFtQfpKNQ5r5BXM= +res/locale/ga/LC_MESSAGES/homescreen-efl.mo__DEL__+niA3/OBbBtCIjmZG9tFcowLo32CnV44MnSnSCjrBqI= +res/locale/gl/LC_MESSAGES/homescreen-efl.mo__DEL__vGkr5Tlj9qSunxS9gO2KQm5IwxbxzD1bLW1qEzeWhsE= +res/locale/hi/LC_MESSAGES/homescreen-efl.mo__DEL__WpVjXKJ5C28pXq2nRFFpFozLB4yHuG14Hf66RJgdYvk= +res/locale/hr/LC_MESSAGES/homescreen-efl.mo__DEL__AHz+NWh8DdiZlhlpt6HWSP/V7OMPTsV58onsK+s7WuA= +res/locale/hu/LC_MESSAGES/homescreen-efl.mo__DEL__SrzqXXl2lHwQtmtQ+FlHLGmB2NTU71U894GWFMm4/PY= +res/locale/hy/LC_MESSAGES/homescreen-efl.mo__DEL__AZV+SSlvQXHMN6d/4YVNB5aUvPR0jFHo/SLHvm6oikA= +res/locale/is/LC_MESSAGES/homescreen-efl.mo__DEL__zh1QJJAZQpSJn26UNJumB87DT42bj/CWyurMpHg9Ynw= +res/locale/it_IT/LC_MESSAGES/homescreen-efl.mo__DEL__zoYrYjZG8DrwCJMHHc5Adf7CqGKMHsSeKn5P+eUiXWs= +res/locale/ja_JP/LC_MESSAGES/homescreen-efl.mo__DEL__68NceM+wgJTiDr9KLFNwKHEWokXmqZyYP8FcDu/I5XM= +res/locale/ka/LC_MESSAGES/homescreen-efl.mo__DEL__oXznH37kzPA8fB2mc0U1HA/LV3kZ4mslpvOdAaNfDRw= +res/locale/kk/LC_MESSAGES/homescreen-efl.mo__DEL__v7d3w1h5B+ZehwYWsVRELZY278R6rgDKPPeDA+Z+sOg= +res/locale/ko_KR/LC_MESSAGES/homescreen-efl.mo__DEL__q2CHGLpi9nuAAPPYsYGXHxJ6V0hb32KbXj8EqxlIjaA= +res/locale/lt/LC_MESSAGES/homescreen-efl.mo__DEL__h1CtHiv/VcyqBeUTQoju4K289eyR+9iLbvCNyRboQCI= +res/locale/lv/LC_MESSAGES/homescreen-efl.mo__DEL__HgRJYnB3rCmV6MYT93LVG4dIrTdUaJMUXHJ+U7Cr99Y= +res/locale/mk/LC_MESSAGES/homescreen-efl.mo__DEL__T7TTKYVEXjmGWVruFXlPeGI0WvRtWiHdbVVz2Qgd5Jw= +res/locale/nb/LC_MESSAGES/homescreen-efl.mo__DEL__edmzo3YuUKbxOlrfAWaZMDGvRFG7lV50nQJvtB+7X1Q= +res/locale/nl/LC_MESSAGES/homescreen-efl.mo__DEL__RWxv0Ow+mBFyuonGadQio/KDxzoY5K53VLZtqOiU7rs= +res/locale/pl/LC_MESSAGES/homescreen-efl.mo__DEL__stpxGiwDfSseoI5lpKWEH1jaPbmH8pRpG4n1nsVau4Y= +res/locale/pt_BR/LC_MESSAGES/homescreen-efl.mo__DEL__ECccZWVv5eiiVH8ukv3GAps1GjQf+FjAQbxJIqnxoX8= +res/locale/pt_PT/LC_MESSAGES/homescreen-efl.mo__DEL__TqFfxXKPwFxR9GrOoBg21CK/3gucGfZfNEc2UBO4Bgk= +res/locale/ro/LC_MESSAGES/homescreen-efl.mo__DEL__y0MNvjYNAAkXjeb5RtRxHjK630n9flnXSL7Cgl+NtGA= +res/locale/ru_RU/LC_MESSAGES/homescreen-efl.mo__DEL__pgTvV2t3cHsfRDHzgSqfIeFlgAb1IUx0U6WVxpPAxlU= +res/locale/sk/LC_MESSAGES/homescreen-efl.mo__DEL__cDWKpiXOL6/ed7abaGpzMy15NreKea3F/nA2qOTeWUQ= +res/locale/sl/LC_MESSAGES/homescreen-efl.mo__DEL__wlHFqnDo90H+cbQCSP3XJZbdwHd8jP/wQybabH0AMio= +res/locale/sr/LC_MESSAGES/homescreen-efl.mo__DEL__ZSDkTPRPOtRRTGPJfc17ajNRQ7L8KNq6PgywcU/NVrk= +res/locale/sv/LC_MESSAGES/homescreen-efl.mo__DEL__nsZDxMADpomu7OdG/bD/H0zvU549EdrX9C7NL4PYH+w= +res/locale/tr_TR/LC_MESSAGES/homescreen-efl.mo__DEL__pYKJbx3F3gp+pYo+qfULyifxu7bQK4uZ9TPH+gStk2o= +res/locale/uk/LC_MESSAGES/homescreen-efl.mo__DEL__AFzXVJVlIdnLBTiWPsX5KoH4CwxY8nAvqU40HWePpbc= +res/locale/uz/LC_MESSAGES/homescreen-efl.mo__DEL__RHOh/MQmFdqEgQAjg4fCwfZH8NqIkQV7bUMy0Jo/qf4= +res/locale/zh_CN/LC_MESSAGES/homescreen-efl.mo__DEL__RIZ1KIFfGF2e+0IkBlDIut/N5Y8JlVuOdHuEhVoNpV4= +res/locale/zh_HK/LC_MESSAGES/homescreen-efl.mo__DEL__XbmoPGvpjZD09qMkipbn/N/GNg/T74qcAmfZ09aTVIM= +res/locale/zh_TW/LC_MESSAGES/homescreen-efl.mo__DEL__oV3fIhDtXRMBjVuLETwBwYVDwiCHWvpDVpgtektLlM4= shared/res/homescreen-efl.png__DEL__1d0oEZHqPn+QzNzGIHwj9ODby6x9ggFs9uOsav6jPNs= -tizen-manifest.xml__DEL__en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= -author-signature.xml__DEL__nhDdIrtAyw1Q8c9XtEOVIg4NVx2e1wI3Q4JQT9eKIYo= +tizen-manifest.xml__DEL__HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo= +author-signature.xml__DEL__BKBfAcFwpjmzGULDek47sGh8FYZ5ibUrv4ESH9wSfjo= diff --git a/.sign/author-signature.xml b/.sign/author-signature.xml index 55bade4..98471a5 100644 --- a/.sign/author-signature.xml +++ b/.sign/author-signature.xml @@ -4,87 +4,83 @@ -jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= +tcjOCyj2e5XIByWhdkzRhfral3e6DLHgJYsUX3aYsH0= - + -NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= +kxOp0/9NM7zavtZCS/aRtK4J/kktpjndyqxWi/ctNCE= - + -dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= +hSuSQ3hQZXps9VqOx+iF5a8yxxuQYp1pX8X7o+zOiFY= - + -2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= +LpSthYUiusXGKzPufc1Z+UrTWOcLQtBTkbFqj1P0Z/w= - + -4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= +nt1/iw823ktobTD7tCkH8qF3ECx+dJzZ4nhbFEzV9jY= - - -d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= - - + -fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= +XwzpTRnEBagQ/fjveMIUJHywQjJJw9UiTHHANjYTL38= - + -GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= +LnTRhc7GKMlwBkLDmKWjbkAGAym388rXL5di6GR1SoI= - + -D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= +en0euIjmeqdudjs19LBKC38zGl7+NWMHWAnof7DBcKA= - + -gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= +uqDmQIugV+cL0AvTbyrB+Vx/rEpBthwIPPVP5xsuyGQ= - + -Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= +Ejp60/SrY0CZmR5dThP9k+Q0+z1EL3ZW7zABqM2TVI0= - + -MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= +FOWNwnM9qfTbXB3POm08kHT9/FUpGFRlu5RiVBSGV5c= - + -MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= +Ej7R8hosaLip//gef8JFzUOv97yfsNfh5QUODTJS7ug= - + -YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= +whmDKsbXwSg4lQiqqXqwmOJgWvMMi1m9eN1B4uXngPY= - + -69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= +shG/CpjlVPg1oMMerjnmv23B0QJal0wm55XhQi3+cxs= - + -3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= +nvh3Lst1qzLtEA92yDXQFcUgsYwQXVHDEpNLw/pjiOg= - + -nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= +hqnpwU7y0026fePoeHQUHiIsQkQkE6YMrEOLgWmi24s= - + -uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= +FeY8xIiCwRls8AYZLRxOVUNJqWCB85HWNvWcSibOOhE= - + -y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= +NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= - + -rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= +nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= - + -4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= +QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= @@ -92,11 +88,11 @@ -ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= +yXmN6gPaInzPqMnnvZy6EGtYkGEG9yxPC29xjSSOZnw= -Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= +Rp80WWmWlHdOMKUD28T+RwUiyKpO0W+ITPmDk0qgLLo= @@ -106,57 +102,29 @@ y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= - + -kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= +HCpFQAsWha3GigpGWrubNVXVShl0PT5o7LxsThAkhI0= - + -HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= +5XLz72s6yi/KOjCLocZJ/WrWgwYlAlGxDvJO90k3JPM= - + -0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= +rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= - + -Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= +Y9zRuA/OXInxUgtMSp1QJqrh999tKjpCQ7YPsMcF8Kk= 0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= - - -NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= - - - -nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= - - - -UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= - - - -wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= - - - -QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= - - - -0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= - - - -nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= - -SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= +noOZYNOHHOiWJijd4qawld1rsQZ12oYwz7PsgZybiZ8= @@ -168,351 +136,239 @@ -Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= +IHPVIyyHM+Xr16lKSzHDDHqflN4mg4RLjaEKhSe4w7s= APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= - + -gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= +NpjsIH4S1p/IhdqXCsHoNKNILPtXfeAfzacXL+giMA4= -l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= +gv8sVrOYti1vU2kcRO8xmD0KF8U1BsQ8xbXXCea5HDQ= - + -TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= +7SZnhNb1SQmaKs2YuWz9x8wxiG04DRVpr+ZqzMncM8s= - + -+tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= - - - -H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= - - - -zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= +buZftpza+NBOtEcuDVxbYeMZ/zDK0wFhnvpzpV02zu4= jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= - - -JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= - - - -3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= - - - -Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= - - - -4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= - - - -AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= - - - -P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= - - - -JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= - - - -EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= - - - -z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= - - - -nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= - - - -MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= - - + -L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= - - - -6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= - - - -H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= - - - -A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= - - - -ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= - - - -HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= - - - -IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= - - - -xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= - - - -QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= - - - -mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= - - - -+Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= - - - -o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= - - - -bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= - - - -Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= - - - -geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= - - - -1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= +HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= - + -wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= +0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= -qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= +ibnLSm8JGIo5UjVKQql8slRiGOWa82qiiJPJY5vuZek= -SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= +GzPOUx1zzTz6bhIuf8r9d7oXy/sV1nRXWKZ5btoVRPI= -Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= +0S9duKaLJFBEXDZpVNKiapv7jRHNZ2YIdzrdgZZ0n7Y= -69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= +iz/7dxAP0L4yBmJMByeowbhIEpucBqcK5GJacKtuJmU= -7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= +tDeQdJ+xC98GlCKTApleYaH9HyxPyDfHt0g1Oj6QKTs= -j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= +A4lQ15pkmbb54FahN0njXRIA0nv95olfbX2zEUkMsRs= -nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= +c1Y2E3rFnvxwGaqWVzrqdxdx7u1ciELljaOcbSK6Ofk= -+XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= ++swN5kVV1P54WCjD50HrJokTyorUIo7BczsE9rMBtxI= -QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= +gu5LsFomEKn5zDthQ79Pq00l7lNTPwpWmfc8DGvCdNI= -q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= +tXgXXEhmbLn0AxD/MWNw8mFAWBElGh2Pgmn4VjRiH6A= -GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= +pPmkr267A8TmCbznNyz7ngQXBG3Kq8X9nBWvo05qrqY= -L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= +qkjALrQWoRk39CZdSoOg77SZhs3g6TOzDPauojV3s8c= -hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= +BMWnX1L36IlipJsskB76AAE3Ijq3k6O5W85syPDTGOw= -2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= +MEr/xeDQBlrRY3KZUWHrrwGIqOjOzcLM6gxWX07M5bc= -KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= +sat+2O/zZMlEIQ6HZyWIS3E2RFC/C3h82p0jkiSfXR8= -AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= +py2C9x3kxqwOQD/w0XfVwCij7UykPjfJcNpPaYrL/4o= -cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= +3w7W8u64bBfu03NiAdPUZuTxQ69DykBj8J1oW2DjYn8= -NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= +Nvdus943mCM8IWbIseBnGtDKO33HqFtQfpKNQ5r5BXM= -W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= ++niA3/OBbBtCIjmZG9tFcowLo32CnV44MnSnSCjrBqI= -uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= +vGkr5Tlj9qSunxS9gO2KQm5IwxbxzD1bLW1qEzeWhsE= -XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= +WpVjXKJ5C28pXq2nRFFpFozLB4yHuG14Hf66RJgdYvk= -Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= +AHz+NWh8DdiZlhlpt6HWSP/V7OMPTsV58onsK+s7WuA= -TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= +SrzqXXl2lHwQtmtQ+FlHLGmB2NTU71U894GWFMm4/PY= -SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= +AZV+SSlvQXHMN6d/4YVNB5aUvPR0jFHo/SLHvm6oikA= -JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= +zh1QJJAZQpSJn26UNJumB87DT42bj/CWyurMpHg9Ynw= -x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= +zoYrYjZG8DrwCJMHHc5Adf7CqGKMHsSeKn5P+eUiXWs= -3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= +68NceM+wgJTiDr9KLFNwKHEWokXmqZyYP8FcDu/I5XM= -R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= +oXznH37kzPA8fB2mc0U1HA/LV3kZ4mslpvOdAaNfDRw= -FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= +v7d3w1h5B+ZehwYWsVRELZY278R6rgDKPPeDA+Z+sOg= -r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= +q2CHGLpi9nuAAPPYsYGXHxJ6V0hb32KbXj8EqxlIjaA= -zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= +h1CtHiv/VcyqBeUTQoju4K289eyR+9iLbvCNyRboQCI= -XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= +HgRJYnB3rCmV6MYT93LVG4dIrTdUaJMUXHJ+U7Cr99Y= -c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= +T7TTKYVEXjmGWVruFXlPeGI0WvRtWiHdbVVz2Qgd5Jw= -Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= +edmzo3YuUKbxOlrfAWaZMDGvRFG7lV50nQJvtB+7X1Q= -q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= +RWxv0Ow+mBFyuonGadQio/KDxzoY5K53VLZtqOiU7rs= -XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= +stpxGiwDfSseoI5lpKWEH1jaPbmH8pRpG4n1nsVau4Y= -IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= +ECccZWVv5eiiVH8ukv3GAps1GjQf+FjAQbxJIqnxoX8= -aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= +TqFfxXKPwFxR9GrOoBg21CK/3gucGfZfNEc2UBO4Bgk= -RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= +y0MNvjYNAAkXjeb5RtRxHjK630n9flnXSL7Cgl+NtGA= -Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= +pgTvV2t3cHsfRDHzgSqfIeFlgAb1IUx0U6WVxpPAxlU= -4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= +cDWKpiXOL6/ed7abaGpzMy15NreKea3F/nA2qOTeWUQ= -Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= +wlHFqnDo90H+cbQCSP3XJZbdwHd8jP/wQybabH0AMio= -x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= +ZSDkTPRPOtRRTGPJfc17ajNRQ7L8KNq6PgywcU/NVrk= -3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= +nsZDxMADpomu7OdG/bD/H0zvU549EdrX9C7NL4PYH+w= -uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= +pYKJbx3F3gp+pYo+qfULyifxu7bQK4uZ9TPH+gStk2o= -w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= +AFzXVJVlIdnLBTiWPsX5KoH4CwxY8nAvqU40HWePpbc= -1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= +RHOh/MQmFdqEgQAjg4fCwfZH8NqIkQV7bUMy0Jo/qf4= -dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= +RIZ1KIFfGF2e+0IkBlDIut/N5Y8JlVuOdHuEhVoNpV4= -6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= +XbmoPGvpjZD09qMkipbn/N/GNg/T74qcAmfZ09aTVIM= -LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= +oV3fIhDtXRMBjVuLETwBwYVDwiCHWvpDVpgtektLlM4= @@ -520,7 +376,7 @@ -en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= +HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo= @@ -531,9 +387,9 @@ -m4ONQLtiOft2RJxb5X4jIRKmlzl8j8k4YtyAK6kSjtSCEaJfcfQLrZQchsl8T3/RJDEy2MpXz6HD -1QzsDqnWFbpQziNy8HfSmDVPfdMzoK+ti1pEbgQA6Koi+fLuNyjOADumY+gmPOxj+dR63XOUr839 -146zgZVFzB2c1D4/lNc= +oNvYebPYvFMXen19lm09UqtjdBmJsFmatcN1t0R7r4C3Zoy15EfWyRdtTCMcjh5ORKmeWS9QiU25 +eZB6wNEiEojllrpZ+fZY+AZzqjoD2O7w6lwSaji5c/dLhTsdv7A8zjfFwSlDAHq20G5FPb9tSBlx +OH8/rOsLOBkhVdDn3EY= diff --git a/.sign/signature1.xml b/.sign/signature1.xml index 3f0d832..6958ced 100644 --- a/.sign/signature1.xml +++ b/.sign/signature1.xml @@ -4,91 +4,87 @@ -nhDdIrtAyw1Q8c9XtEOVIg4NVx2e1wI3Q4JQT9eKIYo= +BKBfAcFwpjmzGULDek47sGh8FYZ5ibUrv4ESH9wSfjo= -jHTodhfGSzuBXE+1HL1lVhn+yw11Kejbrogx+a3p79U= +tcjOCyj2e5XIByWhdkzRhfral3e6DLHgJYsUX3aYsH0= - + -NwYzJ/GMtZfhiMsknC8Eyy5NoZV5C0TWgVZbCWFZUsw= +kxOp0/9NM7zavtZCS/aRtK4J/kktpjndyqxWi/ctNCE= - + -dKHQu2M9WV3vhLhEFZ1GXPgj2l3HD2ttWwzeODPjRLQ= +hSuSQ3hQZXps9VqOx+iF5a8yxxuQYp1pX8X7o+zOiFY= - + -2jrbMBB9ks28EztSB4oleYk9kr1ibDl82bkgcQ1NNGE= +LpSthYUiusXGKzPufc1Z+UrTWOcLQtBTkbFqj1P0Z/w= - + -4P1VdVa5zlRmyicU2R5u+Du9uElAMrELCAIsCbx166Q= +nt1/iw823ktobTD7tCkH8qF3ECx+dJzZ4nhbFEzV9jY= - - -d7+H65K6d4J0m+Tzx9d90ATTKMNEGbMMMoKwAzvONQQ= - - + -fuxsgLTQispcFj03ND0fUjYMJeb/KC00wegVl08VCQA= +XwzpTRnEBagQ/fjveMIUJHywQjJJw9UiTHHANjYTL38= - + -GUW9sPvLE1lHVHD/n9SJKsKeGxxHZYR9rLirrtkG2ek= +LnTRhc7GKMlwBkLDmKWjbkAGAym388rXL5di6GR1SoI= - + -D1ICg7qhRCF9QYd8LHAy41RLAsKNoe9pWVvkTAEIIP0= +en0euIjmeqdudjs19LBKC38zGl7+NWMHWAnof7DBcKA= - + -gNz3htp/PRFJ1S9Ljq2hmviyIMOHIv6G96EUL50NnGs= +uqDmQIugV+cL0AvTbyrB+Vx/rEpBthwIPPVP5xsuyGQ= - + -Ch7k4jKlEeVJS3cUQHVw0s2X+zeJJdH46XPNo6XnH+0= +Ejp60/SrY0CZmR5dThP9k+Q0+z1EL3ZW7zABqM2TVI0= - + -MEhKmHIGVXj4z5i285leiqk6EtNj9wSSJgBPEYArIn8= +FOWNwnM9qfTbXB3POm08kHT9/FUpGFRlu5RiVBSGV5c= - + -MyVdyVwIebuLrjAYKbzKbuoEahYanMmACOOXfOPROlI= +Ej7R8hosaLip//gef8JFzUOv97yfsNfh5QUODTJS7ug= - + -YJ+YZGP8PQuniC+wC4rikDLMLm67eHreo1Fe1Am+S9Y= +whmDKsbXwSg4lQiqqXqwmOJgWvMMi1m9eN1B4uXngPY= - + -69srWlgmxtQh/3Y2I//rNhQmOHBCekDEBB+VttdBs1k= +shG/CpjlVPg1oMMerjnmv23B0QJal0wm55XhQi3+cxs= - + -3fhDKx1Nwz88m/n3zE6X+0jcEkpiKVkCcwaBuOZ68z0= +nvh3Lst1qzLtEA92yDXQFcUgsYwQXVHDEpNLw/pjiOg= - + -nvDO9TegVi2H3XrAynKsoeVUjBJTAVzGWkln76/Izuk= +hqnpwU7y0026fePoeHQUHiIsQkQkE6YMrEOLgWmi24s= - + -uFBxGhiP/IM/JTmjkXd6ZA6er9vIt6Gok37L9/Ee4fQ= +FeY8xIiCwRls8AYZLRxOVUNJqWCB85HWNvWcSibOOhE= - + -y9kSJGK7ctV0y9Go4TKAU7dSNewZrRvEfj/HthGOu2A= +NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= - + -rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= +nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= - + -4gsz+F8gXj4HxFUp3dw9PyRHrtT1kx6Hz4mpFvhUXNU= +QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= @@ -96,11 +92,11 @@ -ctGcriXx4o5vsokgJs3sMO6WizFgsHgwnCYCZ/pygNU= +yXmN6gPaInzPqMnnvZy6EGtYkGEG9yxPC29xjSSOZnw= -Ewy8JNsbphGe74DLTnSbzS+UvAeR7Nb9Av7Wsdi7hTg= +Rp80WWmWlHdOMKUD28T+RwUiyKpO0W+ITPmDk0qgLLo= @@ -110,57 +106,29 @@ y/oiTmwzPmU93wfx6D3bfCr5fKoc1IBSRmHvlpTEQtI= - + -kyKG5qvaSadrtzVDojN1oC8lay9BJBzUqLTpJtaJr8A= +HCpFQAsWha3GigpGWrubNVXVShl0PT5o7LxsThAkhI0= - + -HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= +5XLz72s6yi/KOjCLocZJ/WrWgwYlAlGxDvJO90k3JPM= - + -0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= +rJzE+OVrzZm9HJFzeBi1+8FPano9ukrWB10nQV82m1o= - + -Nz+SecsjmNuidhKNvmQ5+3nasrw8vI4q/bjPgbfx5fI= +Y9zRuA/OXInxUgtMSp1QJqrh999tKjpCQ7YPsMcF8Kk= 0gUX7G8t9qf8/bUeaHc1qp9EXAT934YJ9dYS1wupGI4= - - -NaFgj2lXKUfBbZk4VmOeQamahPg7kXuwItRyeq8/bSY= - - - -nN+eVeUdDmM7ZmWzctRbHQ0iGchd9tW87QWttAgq33c= - - - -UHI4fmgvajrTK2xKLEGYUy3smYig7kXKoaAalYmIpfk= - - - -wO2fjNlycCR3in29oxOae1y7t+GFF/qs1y+zlw9kMGw= - - - -QZcF6UVugz5DGrb237UpVkRFAfW7nGwFVw1wktOnNM8= - - - -0xcFTeSZxjt3L9/ReXijbY7dVaEYY45JQjMUdbVt0Tk= - - - -nUA6AkJXcGhNtJdi2EyxsjKV+lVwwJNkd0tsSsuf9Ic= - -SEoJYrMNmfMDDYh6p7u9DBNZOabjbOT9Mellsy3RT0I= +noOZYNOHHOiWJijd4qawld1rsQZ12oYwz7PsgZybiZ8= @@ -172,351 +140,239 @@ -Ysst9mhNQVr8gPEe51C2f9+N0CTjbM+F/xeIf+bdsvw= +IHPVIyyHM+Xr16lKSzHDDHqflN4mg4RLjaEKhSe4w7s= APqmJrt2ZwFNUC2PENUcmJ5cItcb+xkHI1KbVut6IsA= - + -gpq0MLAf9szSx3ow75FRsA0KUC0pS1no+iRjNZS/z9I= +NpjsIH4S1p/IhdqXCsHoNKNILPtXfeAfzacXL+giMA4= -l4faVb4KE9pXkjtVxKT1aAtH66f3gAKcg/elnRBJ+U8= +gv8sVrOYti1vU2kcRO8xmD0KF8U1BsQ8xbXXCea5HDQ= - + -TJbfUGn+pdFvEoKFUju4a0ja5t8UP2tEZQNG8BbNH8I= +7SZnhNb1SQmaKs2YuWz9x8wxiG04DRVpr+ZqzMncM8s= - + -+tDFf7ffkLuqu9WiH11YCiAXj7MwEwRQnL1Raw+dWrg= - - - -H/HrJq65K3MHJNE20myd6+iXIfX5Mew9KFlOG5+F+/M= - - - -zZS2Q++ggh8jqgvWfuxrNQRMYj/1N2ecSB4VIwOYxJo= +buZftpza+NBOtEcuDVxbYeMZ/zDK0wFhnvpzpV02zu4= jT49M8iXi1RBYngrDVZGYqunMNnGE2W9RCnqcJIU1WM= - - -JjUqvUuBNWMhBdt6cWwe2C8s5H4xf+RlWmGBStmT+wk= - - - -3ZDUMujXsuKQdll1qsq0QIASsX05Zq/NiOHCYwxi6zE= - - - -Dx8TBTedzgSRAdGQPH7xLrZnsgHNk/X4hDd0o005WJI= - - - -4tAytYuYy+7jFVA4XC+Vct10Oeu+QXy0vrOnO8pKWoY= - - - -AQVTOdG0Xxk+g6m+MziA9AFITnqAVRgGwO40tndMJrk= - - - -P6VUWAelllZtDLqc+z3a5eBazvXGygHu6/NE9tynNu4= - - - -JdyiUyAyT0//bCB3kVWmTiPXEiF0y1Hx1rpRPWQAczU= - - - -EijM8rmL/AmC3oYZJIuzsOThn2ZRjBYfPtkUdtLakZg= - - - -z4fEcK/PfvN90HO0dz5HTddZxse5IJGRFMnchoWneTY= - - - -nJYPwPWfBSTvQ+BfSUInLKrG3iAVzp9sWYpBsNdmVeE= - - - -MIbmuA6Puhz9y6hp6Ydn40OHN9pAm/V0uQlACSoqIfc= - - + -L8tH1GzIp268bxbR7CXLvVBM2rhweF47HBw+jacnC1k= - - - -6P6bjj/kkHI3A2Vf7v8iwq0DnTon8EUpv/8AfTKaOIk= - - - -H9/q7POQQC6W6kE2rSCohiPO4VkpWOnXgB1enKgRccc= - - - -A0mXL8hy2r6gsM0p2z9NwcMl+PBKU4i6ifNUvoZLZuE= - - - -ZK0SE6HQ7gCD7w9HZafL1fdDhM+/WnNRn9b5F1fdC94= - - - -HpA+xWYlnSunpHnXCNY+3j7hzXFjuuTrrEQ7KkGxnio= - - - -IKnpuzRXuaSZnGRmDCKtxQkEd0ieYS7toOq3J+4LE3w= - - - -xX441XxwNixUXRtG3+wvnuH6HQd69a+4GK+p+b8qF4c= - - - -QoWfaOYy7VtayNTC9RJZYVEC1JWLrmDxStYIREMYwhc= - - - -mEn+5/4SKC8p6o7KgG6JBfPm8na7VOX6Ln6i49XKKmY= - - - -+Khr1HDbJyEEftNIVlccG8/seZZEltRSFx9VY5hWH4s= - - - -o+c/XfTxZHg9we0G+ZVEGgzFWF4Tna03ohGwbyXTl4M= - - - -bW9Tef7odloVYkQIU81w0lFsOsAN+POUSiBqrfykff4= - - - -Dl4uB/n8AICNG+OjimHs0xXondtjJ7FJK7duG49UB10= - - - -geCmfkfJQwsznI9mgTWmY4cDR/xrXwmdrFmkOk2ZH6E= - - - -1zi7TzVEge+yg9ENOue8+0RE+U6XzqOnDL/iuO6QkLA= +HM+yEA7kUCEMRryHHz8v/ZQq645n2iarGYmWJK+MjkA= - + -wmGvOtxTMRgi79PbSy9BCuj/rizSbAfe/ciJTP5v+P8= +0c7mkvcdYnXZToRUScakcXFG8if7PQ5kCjJqbD0d5IM= -qYLt6zOsKvcaFK1EmL/AmZeNYaebTyumu88p/F2ZRgk= +ibnLSm8JGIo5UjVKQql8slRiGOWa82qiiJPJY5vuZek= -SFnYAjlhghodT4aZrpOQ/rJEp9y65oZe9uOVThnRatc= +GzPOUx1zzTz6bhIuf8r9d7oXy/sV1nRXWKZ5btoVRPI= -Cywgos8YvOdNyArlKSMvGm2SRWBgcshB3EmLuylPjkk= +0S9duKaLJFBEXDZpVNKiapv7jRHNZ2YIdzrdgZZ0n7Y= -69sIsKYA4LLM5k4lEUAmydXZG94W4uWyiyl1Ey65wqs= +iz/7dxAP0L4yBmJMByeowbhIEpucBqcK5GJacKtuJmU= -7aP+5lf/Q7jl51WQb9Ib0mao/9Bisc8LNaIcnM98Afo= +tDeQdJ+xC98GlCKTApleYaH9HyxPyDfHt0g1Oj6QKTs= -j9e64M1wxPEtaMj2b+2H80BNXnDpMm0SadpXGfJfqI8= +A4lQ15pkmbb54FahN0njXRIA0nv95olfbX2zEUkMsRs= -nssSSRiMDZqObxD9zmbeP4ToT/xqlwk2sF4ENCNR1YM= +c1Y2E3rFnvxwGaqWVzrqdxdx7u1ciELljaOcbSK6Ofk= -+XZHDGAYBheuyOscV/Tam1KavBPt7GlX7nWkfvoVBhQ= ++swN5kVV1P54WCjD50HrJokTyorUIo7BczsE9rMBtxI= -QS10uzT75NXFwfJEZIPmfd6w61j8E8tagZw36UZQvLk= +gu5LsFomEKn5zDthQ79Pq00l7lNTPwpWmfc8DGvCdNI= -q46c5jFrppMUq3bs9RntvPXgDDhLsj3whHUOAK9GAN4= +tXgXXEhmbLn0AxD/MWNw8mFAWBElGh2Pgmn4VjRiH6A= -GAh/TT0xbRf8oZoi5U3C1IXr04ybeGGCkrF+dIwmTOk= +pPmkr267A8TmCbznNyz7ngQXBG3Kq8X9nBWvo05qrqY= -L8jLHeLsWt3uNlLDZUHoIXv/FfbsCjzNZswiSSrw9Uw= +qkjALrQWoRk39CZdSoOg77SZhs3g6TOzDPauojV3s8c= -hT6HAUYSpKkyyGI7bR+8GVeGp79V7XIgw4+JT4ePHqs= +BMWnX1L36IlipJsskB76AAE3Ijq3k6O5W85syPDTGOw= -2Ndnktb0urcCrQrHdJDjF9la3rrIqQ+wLc0Zjt/rLl4= +MEr/xeDQBlrRY3KZUWHrrwGIqOjOzcLM6gxWX07M5bc= -KJ120FgYGz6111kBBS6qUG8rtQ5yod2A/XY/zO9ILlM= +sat+2O/zZMlEIQ6HZyWIS3E2RFC/C3h82p0jkiSfXR8= -AC+NPEpPHYR8oBlY9vmj7PEisgKjYc6IFVrxIM9vPsA= +py2C9x3kxqwOQD/w0XfVwCij7UykPjfJcNpPaYrL/4o= -cbgaXPnLwCntmAohkqD1fGD/8W3fgiZIV/kKXCmAofU= +3w7W8u64bBfu03NiAdPUZuTxQ69DykBj8J1oW2DjYn8= -NZnmc9uPKiLyiJwVWoTyyNaUSe2CC+4YBXqrIAXXxIQ= +Nvdus943mCM8IWbIseBnGtDKO33HqFtQfpKNQ5r5BXM= -W3VigK2g2KACSWrX8xgj1Pc5btWQWyvApK8POwkUPso= ++niA3/OBbBtCIjmZG9tFcowLo32CnV44MnSnSCjrBqI= -uExwxEQI/1y47oBNwcGaHO80bmARzn30f9DOMmxVm7I= +vGkr5Tlj9qSunxS9gO2KQm5IwxbxzD1bLW1qEzeWhsE= -XcvvTyQiMgjp6Q+qAmE1E+2houbwB5yACn7ZJQe30wo= +WpVjXKJ5C28pXq2nRFFpFozLB4yHuG14Hf66RJgdYvk= -Q43M/TXJhQjIZN6BcC+DuNtIbUZH9J1NYN0DLQH5OcY= +AHz+NWh8DdiZlhlpt6HWSP/V7OMPTsV58onsK+s7WuA= -TO174vd4fQkUt3As0KHgPbWO8CQpj0Cq5Nwxjj010EU= +SrzqXXl2lHwQtmtQ+FlHLGmB2NTU71U894GWFMm4/PY= -SmsDTn92AvsekPW2cc9pI83yJpK+gPCBm+gP1SFE1VY= +AZV+SSlvQXHMN6d/4YVNB5aUvPR0jFHo/SLHvm6oikA= -JLhQky0B/+daufEWDO48kBkCcGx6gerkYTwLFaYXCR8= +zh1QJJAZQpSJn26UNJumB87DT42bj/CWyurMpHg9Ynw= -x0l8OFvgutc3D4i6elMGSjFFnAPiJ4XVHTVDePaE+uQ= +zoYrYjZG8DrwCJMHHc5Adf7CqGKMHsSeKn5P+eUiXWs= -3lZ9Zcdx33sJC2EaVY2vVSSuJq+BMYJEbWvR2hKo5gU= +68NceM+wgJTiDr9KLFNwKHEWokXmqZyYP8FcDu/I5XM= -R9ch/KGvSLuu7K7VOEP+Os9q+uWPTSLyIi4YDihzZzY= +oXznH37kzPA8fB2mc0U1HA/LV3kZ4mslpvOdAaNfDRw= -FvACiVK8pgCdQ0OeH4a+wyqDqLRxsCRFM7kJBln2KV4= +v7d3w1h5B+ZehwYWsVRELZY278R6rgDKPPeDA+Z+sOg= -r5otdbz7OeZmKrnRo2noPPACrvaiVEgO86uVWWMcthY= +q2CHGLpi9nuAAPPYsYGXHxJ6V0hb32KbXj8EqxlIjaA= -zv/7pam/M6E6JboWfWYvuR65E3bzOWSOIha/MBUAR1Q= +h1CtHiv/VcyqBeUTQoju4K289eyR+9iLbvCNyRboQCI= -XXruTOen3m3s+jzqDOnUPjvgeh+WRui+mT6ysvoDD9Y= +HgRJYnB3rCmV6MYT93LVG4dIrTdUaJMUXHJ+U7Cr99Y= -c8eK+BIXcFPjmOwu0GZwN8SpNDDzPXQGRbO1TC92HBk= +T7TTKYVEXjmGWVruFXlPeGI0WvRtWiHdbVVz2Qgd5Jw= -Cj8AEWoOboJxe5SNfIVSJInTxzzoBPx09SRXW56fhzA= +edmzo3YuUKbxOlrfAWaZMDGvRFG7lV50nQJvtB+7X1Q= -q9x7SHtNysPOiA2cKtKDuvqnhe6BwUR94pXzjhkqzVA= +RWxv0Ow+mBFyuonGadQio/KDxzoY5K53VLZtqOiU7rs= -XksPwpX5Tbz7FFDQ7/vzLPkGRt/XDqV/hjY2A64q+wU= +stpxGiwDfSseoI5lpKWEH1jaPbmH8pRpG4n1nsVau4Y= -IVi4Ot4z9Lqt4vya8j4xYZl1GVQS7pZeAjlwiqh+2o4= +ECccZWVv5eiiVH8ukv3GAps1GjQf+FjAQbxJIqnxoX8= -aFv4X5Ok43bwfWKobpiV/rLTzPXnCMvgsKdJj8OB2pA= +TqFfxXKPwFxR9GrOoBg21CK/3gucGfZfNEc2UBO4Bgk= -RjspVHVp/abhArEJ1CnYJqnek6lPEjAMCLayx/Xj0m0= +y0MNvjYNAAkXjeb5RtRxHjK630n9flnXSL7Cgl+NtGA= -Go6CoVQu3sfIsi2Mz80SSEPmnqRskSaF9Q5sDySYAtk= +pgTvV2t3cHsfRDHzgSqfIeFlgAb1IUx0U6WVxpPAxlU= -4tIJ4yyz0BpuswaCw73snOvMuRgGC5JSBrCPuxPU2ow= +cDWKpiXOL6/ed7abaGpzMy15NreKea3F/nA2qOTeWUQ= -Fi8UCK9x9roWbjzg+MBzD2B3a694NAAbp+bKUXWUs0U= +wlHFqnDo90H+cbQCSP3XJZbdwHd8jP/wQybabH0AMio= -x3/n/gcoRjXOnFHzZbePK//pkAyt1c4YLGID1/0Pj/M= +ZSDkTPRPOtRRTGPJfc17ajNRQ7L8KNq6PgywcU/NVrk= -3qm5lJo4iSktZyMMOgN4TDwuebO/HvxTpH1OlAsogMw= +nsZDxMADpomu7OdG/bD/H0zvU549EdrX9C7NL4PYH+w= -uNhKcL0MBhQBDz9HQLthGf4dPmxX+heiRfte8bLLuUw= +pYKJbx3F3gp+pYo+qfULyifxu7bQK4uZ9TPH+gStk2o= -w0QXjUJAjRHtNEXbVoqF9VRxt/e/FONY5pBMNTolZdQ= +AFzXVJVlIdnLBTiWPsX5KoH4CwxY8nAvqU40HWePpbc= -1Qd8hbQGo2yGSc5Qfqyx7TFFm5GMJb0WThJoKk/CjnU= +RHOh/MQmFdqEgQAjg4fCwfZH8NqIkQV7bUMy0Jo/qf4= -dSQU4CoC9yiI9SMDjX4Lp/rdYnmaJafudmzP0xOy0RQ= +RIZ1KIFfGF2e+0IkBlDIut/N5Y8JlVuOdHuEhVoNpV4= -6fbM9/ol4ScNdW5OGQHpYBSjZ9q9KXM4CjjBzmhLPAU= +XbmoPGvpjZD09qMkipbn/N/GNg/T74qcAmfZ09aTVIM= -LFze8kgyHYQK9yfnyAEDhHVZI71AWSjHSUeLKdkRFr0= +oV3fIhDtXRMBjVuLETwBwYVDwiCHWvpDVpgtektLlM4= @@ -524,7 +380,7 @@ -en6pJaaSkQnQvJquunrTapiz93J1ABI9AF6gK4WBi3M= +HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo= @@ -535,9 +391,9 @@ -H0Q8k/2eJseDxpcoWO+FKzF8K3iCjp8YiS+7HBaV5nMdQWrei3xe6LGRbVfeNQrQ4IcMznehyO9t -YvzRHA20H9czpqF5p3Mfs7yR7zO0/kxexqWtti62lUCz4cHddrMUiXBazXNX4l8qUejsBGe9yhSE -HidgpQvFsy3PpQM8/3I= +pQOECgPlMm32WGY6kZ0k4UDIm+jCpctDPw2N6N1uMT9m7xTJLEGcMut+D6JKST4zJo5q03tQqFFY +g8i/Qhktgvz6s/aSrjdYku5SxKBfNtn1xfb0h/nEXNScjluoYMQzX6KvFLYViZnAcNDWVV5b6Ws2 +eCsG1z/uF+05ltLVDlk= diff --git a/inc/mouse.h b/inc/mouse.h index 9146c3f..99e514b 100755 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -31,6 +31,7 @@ typedef struct { int offset_x; int offset_y; Ecore_Timer *long_press_timer; + Evas_Object *pressed_obj; } mouse_info_t; #endif /* __MOUSE_H__ */ diff --git a/inc/widget_viewer.h b/inc/widget_viewer.h index 7ae4a06..d4c11b9 100755 --- a/inc/widget_viewer.h +++ b/inc/widget_viewer.h @@ -27,5 +27,6 @@ void widget_viewer_init(Evas_Object *win); void widget_viewer_fini(void); Evas_Object *widget_viewer_add_widget(Evas_Object *parent, widget_data_t *item, int *widget_width, int *widget_height); +void widget_viewer_send_cancel_click_event(widget_data_t *widget); #endif /* __WIDGET_VIEWER_H__ */ diff --git a/res/edje/cluster_page.edc b/res/edje/cluster_page.edc index b79fe67..8512f37 100755 --- a/res/edje/cluster_page.edc +++ b/res/edje/cluster_page.edc @@ -67,7 +67,6 @@ collections { signal: SIGNAL_EDIT_MODE_ON; source: SIGNAL_SOURCE; action: STATE_SET "edit" 0.0; - target: SIZE_SETTER; target: CLUSTER_BG; transition: DECELERATE ANIMATION_RESIZE_TIME; } @@ -76,7 +75,6 @@ collections { signal: SIGNAL_EDIT_MODE_OFF; source: SIGNAL_SOURCE; action: STATE_SET "default" 0.0; - target: SIZE_SETTER; target: CLUSTER_BG; transition: DECELERATE ANIMATION_RESIZE_TIME; } diff --git a/src/apps_view.c b/src/apps_view.c index 3455eb6..25d5a27 100755 --- a/src/apps_view.c +++ b/src/apps_view.c @@ -14,10 +14,10 @@ * limitations under the License. */ -#include #include #include #include +#include #include "apps_view.h" #include "conf.h" @@ -592,6 +592,7 @@ static void __apps_view_icon_uninstall_btn_clicked_cb(void *data, Evas_Object *o package_manager_request_h request; int id = 0; feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); + if (!item) { LOGE("item is NULL"); } @@ -831,7 +832,6 @@ static void __apps_view_create_menu(void) static void __apps_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); menu_hide(); apps_view_set_state(VIEW_STATE_EDIT); @@ -839,7 +839,6 @@ static void __apps_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_i static void __apps_view_menu_create_folder_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); menu_hide(); apps_view_s.dest_folder = apps_data_add_folder(); diff --git a/src/cluster_data.c b/src/cluster_data.c index 6b01aef..73f48af 100755 --- a/src/cluster_data.c +++ b/src/cluster_data.c @@ -117,7 +117,7 @@ static void __cluster_data_insert_default_data(void) new_item->page_idx = 0; new_item->pos_y = 0; new_item->pos_x = 0; - new_item->pkg_name = strdup("org.tizen.gallery.widget"); + new_item->pkg_name = strdup("org.tizen.calendar.widget"); new_item->content_info = NULL; new_item->type = WIDGET_SIZE_TYPE_4x4; new_item->period = 0.0; diff --git a/src/cluster_view.c b/src/cluster_view.c index d8c70da..1f94d65 100755 --- a/src/cluster_view.c +++ b/src/cluster_view.c @@ -14,7 +14,6 @@ * limitations under the License. */ -#include #include #include "homescreen-efl.h" @@ -83,11 +82,18 @@ static mouse_info_t cluster_mouse_info = { .long_press_timer = NULL, .offset_x = 0, .offset_y = 0, + .pressed_obj = NULL, }; static Eina_Hash *cluster_menu_table = NULL; Evas_Object *__cluster_view_create_base_gui(Evas_Object *win); + +static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data); + static void __cluster_view_create_cluster(void); static void __cluster_view_create_menu(void); static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info); @@ -114,10 +120,10 @@ static void __cluster_view_allpage_drag_page(void *data); static void __cluster_view_allpage_pick_up_page(void *data); static void __cluster_view_allpage_drop_page(void *data); -static void __clsuter_view_edit_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void __clsuter_view_edit_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static Eina_Bool __cluster_view_edit_long_press_time_cb(void *data); +static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data); static void __cluster_view_edit_pick_up_widget(void *data); static void __cluster_view_edit_drag_widget(void *data); @@ -157,6 +163,11 @@ Evas_Object *cluster_view_create(Evas_Object *win) void cluster_view_app_terminate(void) { + + evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb); + evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb); + evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb); + eina_hash_free(cluster_menu_table); widget_viewer_fini(); } @@ -203,6 +214,10 @@ Evas_Object *__cluster_view_create_base_gui(Evas_Object *win) elm_scroller_loop_set(cluster_view_s.scroller, EINA_TRUE, EINA_FALSE); elm_scroller_page_size_set(cluster_view_s.scroller, CLUSTER_W , CLUSTER_H); + evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb, NULL); + evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb, NULL); + evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb, NULL); + evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL); cluster_view_s.box = elm_box_add(cluster_view_s.scroller); @@ -254,7 +269,6 @@ static void __cluster_view_create_menu(void) static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); menu_hide(); cluster_view_set_state(VIEW_STATE_EDIT); @@ -262,7 +276,6 @@ static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *even static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); menu_hide(); cluster_view_set_state(VIEW_STATE_ADD_VIEWER); @@ -270,8 +283,6 @@ static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); - const char *appid = "org.tizen.wallpaper-ui-service"; app_control_h app_control_handle = NULL; @@ -303,7 +314,6 @@ static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info) { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP); menu_hide(); cluster_view_set_state(VIEW_STATE_ALL_PAGE); @@ -368,12 +378,9 @@ void cluster_view_set_state(view_state_t state) widget_data_t *item = NULL; EINA_LIST_FOREACH(data_list, find_list, item) { if (item->widget_layout) { - elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE); + if (!cluster_view_s.picked_widget || item->widget_layout != cluster_view_s.picked_widget->widget_layout) + elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE); elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE); - - evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_edit_down_cb, item); - evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_edit_move_cb, item); - evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_edit_up_cb, item); } } } else if (state == VIEW_STATE_NORMAL) { @@ -395,10 +402,6 @@ void cluster_view_set_state(view_state_t state) if (item->widget_layout) { elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE); elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_NORMAL_STATE, SIGNAL_SOURCE); - - evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_edit_down_cb); - evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_edit_move_cb); - evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_edit_up_cb); } } } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) { @@ -504,6 +507,11 @@ void cluster_view_delete_widget(widget_data_t *item) cluster_page_unset(page, item); else LOGE("Page is NULL"); + + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb); + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb); + evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb); + evas_object_del(item->widget_layout); item->widget_layout = NULL; } @@ -547,6 +555,9 @@ static void __cluster_view_add_widget_content(widget_data_t *item) int w, h; LOGD("Create Widget: pkg[%s], type[%d]", item->pkg_name, item->type); item->widget_layout = widget_viewer_add_widget(cluster_view_s.win, item, &w, &h); + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item); + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item); + evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item); LOGD("widget size : %d %d", w, h); } @@ -580,9 +591,7 @@ static void __cluster_view_create_all_page(void) cluster_page_t *page_item = NULL; elm_box_unpack_all(cluster_view_s.box); EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) { - //HIDE page evas_object_move(page_item->page_layout, -720, 0); - //make thumbnail ly if (page_item->page_layout) { page_item->thumbnail_ly = elm_layout_add(page_item->page_layout); elm_layout_file_set(page_item->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY); @@ -841,6 +850,8 @@ static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object * LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y); cluster_mouse_info.pressed = true; + cluster_mouse_info.pressed_obj = obj; + cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x; cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y; @@ -863,6 +874,7 @@ static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *ob return ; cluster_mouse_info.pressed = false; + cluster_mouse_info.pressed_obj = NULL; if (cluster_mouse_info.long_press_timer) { ecore_timer_del(cluster_mouse_info.long_press_timer); @@ -1018,12 +1030,14 @@ static void __cluster_view_allpage_drop_page(void *data) eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb); } -static void __clsuter_view_edit_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down* ev = event_info; LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y); cluster_mouse_info.pressed = true; + cluster_mouse_info.pressed_obj = obj; + cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x; cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y; @@ -1033,10 +1047,10 @@ static void __clsuter_view_edit_down_cb(void *data, Evas *e, Evas_Object *obj, v } cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME, - __cluster_view_edit_long_press_time_cb, data); + __cluster_view_widget_long_press_time_cb, data); } -static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Up* ev = event_info; LOGD("UP: (%d,%d)", ev->output.x, ev->output.y); @@ -1045,6 +1059,7 @@ static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, voi return ; cluster_mouse_info.pressed = false; + cluster_mouse_info.pressed_obj = NULL; if (cluster_mouse_info.long_press_timer) { ecore_timer_del(cluster_mouse_info.long_press_timer); @@ -1068,10 +1083,10 @@ static void __clsuter_view_edit_up_cb(void *data, Evas *e, Evas_Object *obj, voi } } -static void __clsuter_view_edit_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Move* ev = event_info; - //LOGD("MOVE: (%d,%d)", ev->cur.output.x, ev->cur.output.y); + LOGD("MOVE: (%d,%d)", ev->cur.output.x, ev->cur.output.y); if (!cluster_mouse_info.pressed) return ; @@ -1098,8 +1113,9 @@ static void __clsuter_view_edit_move_cb(void *data, Evas *e, Evas_Object *obj, v } } -static Eina_Bool __cluster_view_edit_long_press_time_cb(void *data) +static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data) { + widget_data_t *widget = (widget_data_t *)data; if (!cluster_mouse_info.pressed) return ECORE_CALLBACK_CANCEL; @@ -1109,35 +1125,48 @@ static Eina_Bool __cluster_view_edit_long_press_time_cb(void *data) __cluster_view_edit_pick_up_widget(data); + widget_viewer_send_cancel_click_event(widget); + return ECORE_CALLBACK_CANCEL; } static void __cluster_view_edit_pick_up_widget(void *data) { int cx = -1, cy = -1; - int gx = -1, gy = -1; + int gx = -1, gy = -1, gw = 0, gh = 0; Evas *e = NULL; cluster_view_s.picked_widget = (widget_data_t *)data; Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout; - elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE); - elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE); e = evas_object_evas_get(widget_layout); evas_pointer_canvas_xy_get(e, &cx, &cy); - evas_object_geometry_get(widget_layout, &gx, &gy, NULL, NULL); + evas_object_geometry_get(widget_layout, &gx, &gy, &gw, &gh); + LOGD("cx, cy (%d, %d )", cx, cy); + LOGD("gx, gy, gw, gh (%d, %d, %d, %d)", gx, gy, gw, gh); cluster_mouse_info.offset_x = cx - gx; cluster_mouse_info.offset_y = cy - gy; cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx); - elm_grid_unpack(page->grid, widget_layout); + + cluster_page_unset(page, cluster_view_s.picked_widget); + + if (cluster_view_s.view_state == VIEW_STATE_NORMAL) { + evas_object_resize(widget_layout, gw * 0.9, gh * 0.9); + + cluster_mouse_info.offset_x *= 0.9; + cluster_mouse_info.offset_y *= 0.9; + + cluster_view_set_state(VIEW_STATE_EDIT); + } + + elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE); + elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE); evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x, cluster_mouse_info.move_y - cluster_mouse_info.offset_y); - - cluster_page_unset(page, cluster_view_s.picked_widget); } static void __cluster_view_edit_drag_widget(void *data) @@ -1154,6 +1183,8 @@ static void __cluster_view_edit_drag_widget(void *data) evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x, cluster_mouse_info.move_y - cluster_mouse_info.offset_y); + LOGD("drag %d %d", cluster_mouse_info.move_x - cluster_mouse_info.offset_x, cluster_mouse_info.move_y - cluster_mouse_info.offset_y); + cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page); evas_object_geometry_get(page->page_layout, &page_x, &page_y, NULL, NULL); edje_object_part_geometry_get(elm_layout_edje_get(page->page_layout), CLUSTER_BG, &bg_x, &bg_y, &bg_w, &bg_h); @@ -1200,6 +1231,91 @@ static void __cluster_view_edit_drop_widget(void *data) } } +static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down* ev = event_info; + + if (cluster_view_s.view_state != VIEW_STATE_NORMAL) + return ; + + LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y); + + cluster_mouse_info.pressed = true; + cluster_mouse_info.pressed_obj = obj; + + cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x; + cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME, + __cluster_view_scroller_long_press_time_cb, obj); +} + +static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up* ev = event_info; + + if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj) + return ; + + LOGD("UP: (%d,%d)", ev->output.x, ev->output.y); + + cluster_mouse_info.pressed = false; + + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + cluster_mouse_info.up_x = ev->output.x; + cluster_mouse_info.up_y = ev->output.y; + + cluster_mouse_info.long_pressed = false; +} + +static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move* ev = event_info; + + if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj) + return ; + + LOGD("MOVE: (%d,%d)", ev->cur.output.x, ev->cur.output.y); + + cluster_mouse_info.move_x = ev->cur.output.x; + cluster_mouse_info.move_y = ev->cur.output.y; + + if (!cluster_mouse_info.long_pressed) { + int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x); + distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y); + + if (distance > MOUSE_MOVE_MIN_DISTANCE) { + if (cluster_mouse_info.long_press_timer) { + ecore_timer_del(cluster_mouse_info.long_press_timer); + cluster_mouse_info.long_press_timer = NULL; + } + + return ; + } + } +} + +static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data) +{ + if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != data) + return ECORE_CALLBACK_CANCEL; + + cluster_mouse_info.long_pressed = true; + + cluster_view_set_state(VIEW_STATE_EDIT); + + return ECORE_CALLBACK_CANCEL; +} + static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info) { cluster_view_s.is_srolling = false; diff --git a/src/page_indicator.c b/src/page_indicator.c index 66c7d3c..8cc0a5a 100755 --- a/src/page_indicator.c +++ b/src/page_indicator.c @@ -147,7 +147,7 @@ static void __page_indicator_scroll_cb(void *data, Evas_Object *obj, void *event angle = (double)(x - current_x) / page_indicator->w * 90.0; if (fabs((float)(x - current_x)) <= page_indicator->w) { - next_page = x > current_x ? (page_indicator->current_page+1) % page_indicator->page_count : page_indicator->current_page-1; + next_page = x > current_x ? (page_indicator->current_page + 1) % page_indicator->page_count : page_indicator->current_page-1; color = fabs(angle) * 2; } else { if (x > current_x) { diff --git a/src/widget_viewer.c b/src/widget_viewer.c index d678725..df8f64e 100755 --- a/src/widget_viewer.c +++ b/src/widget_viewer.c @@ -51,16 +51,14 @@ Evas_Object *widget_viewer_add_widget(Evas_Object *parent, widget_data_t *item, #if 1 Evas_Object *widget = widget_viewer_evas_add_widget(widget_layout, item->pkg_name, NULL, item->period); - evas_object_size_hint_min_set(widget, *widget_width, *widget_height); evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_color_set(widget, 255, 255, 255, 255); #else // for TEST Evas_Object *widget = evas_object_rectangle_add(evas_object_evas_get(widget_layout)); - evas_object_size_hint_min_set(widget, *widget_width, *widget_height); evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_color_set(widget, 0, 0, 255, 255); + evas_object_color_set(widget, 0, 0, 255, 100); evas_object_show(widget); #endif elm_object_part_content_set(widget_layout, WIDGET_CONTENT, widget); @@ -78,3 +76,11 @@ static void __widget_viewer_delete_btn_clicked_cb(void *data, Evas_Object *obj, widget_data_t *item = (widget_data_t *)data; cluster_data_delete(item); } + +void widget_viewer_send_cancel_click_event(widget_data_t *widget) +{ + Evas_Object *widget_obj = NULL; + widget_obj = elm_object_part_content_get(widget->widget_layout, WIDGET_CONTENT); + // Widget crash. : temp + //widget_viewer_evas_cancel_click_event(widget_obj); +} -- 2.7.4 From 3f83112068b89efe7b3c7c36695a707aef719024 Mon Sep 17 00:00:00 2001 From: YoungHun Cho Date: Tue, 24 May 2016 19:26:14 +0900 Subject: [PATCH 10/16] add long press on apps view & icon text resize Change-Id: I0fbab7476bef1f37a8365a4aef6d1e810a2f7a0e Signed-off-by: YoungHun Cho --- .cproject | 8 +- .sdk_delta.info | Bin 21031 -> 25272 bytes .sign/.manifest.tmp | 32 +- .sign/author-signature.xml | 36 +- .sign/signature1.xml | 38 +- inc/apps_data.h | 1 + inc/apps_view.h | 2 + inc/conf.h | 12 +- inc/edc_conf.h | 5 +- inc/popup.h | 2 + res/edje/app_icon.edc | 88 ++--- res/edje/apps_folder_icon.edc | 7 + src/add_widget_viewer/add_widget_viewer.c | 2 +- src/apps_data.c | 26 +- src/apps_view.c | 575 +++++++++++++++++++++++++++--- src/cluster_data.c | 3 +- src/cluster_page.c | 1 + src/cluster_view.c | 50 +-- src/menu.c | 2 +- src/popup.c | 35 +- 20 files changed, 706 insertions(+), 219 deletions(-) diff --git a/.cproject b/.cproject index 518044c..072c9a0 100755 --- a/.cproject +++ b/.cproject @@ -27,7 +27,7 @@