From cd69c5673a95c7d055eb08cbe3cc4c5db6395024 Mon Sep 17 00:00:00 2001 From: Kamil Lipiszko Date: Sat, 19 Mar 2016 13:09:23 +0100 Subject: [PATCH] add_viewer: Create basic add-viewer view. Because add-viewer separate app is not supported anymore it is needed to put its functionality into homescreen-efl. This commit creates base gui for adding widgets. Change-Id: Ib98c6955b14bc7415902000a7d3555c732f7ad7c --- CMake/CMakeLists.txt | 5 + CMake/res/edje/CMakeLists.txt | 16 + inc/add_viewer/add_viewer.h | 55 ++ inc/add_viewer/list_view.h | 34 ++ inc/add_viewer/view.h | 72 +++ inc/add_viewer/widget.h | 65 +++ inc/conf.h | 1 - inc/homescreen-efl.h | 1 + inc/util.h | 4 +- project_def.prop | 4 +- res/edje/color_classes.edc | 43 ++ res/edje/preview.edc | 1093 +++++++++++++++++++++++++++++++++++ res/images/00_scroll_bar_h.png | Bin 0 -> 3185 bytes res/images/00_scroll_bar_v.png | Bin 0 -> 3192 bytes res/images/1x1 preview shortcut.png | Bin 0 -> 3080 bytes res/images/icon_drawer_search.png | Bin 0 -> 1892 bytes res/images/icon_list_close.png | Bin 0 -> 1125 bytes res/images/icon_list_open.png | Bin 0 -> 1222 bytes res/images/icon_shadow.png | Bin 0 -> 4001 bytes res/images/preview_bg_1x1.png | Bin 0 -> 1072 bytes res/images/preview_bg_2x1.png | Bin 0 -> 1123 bytes res/images/preview_bg_2x2.png | Bin 0 -> 1242 bytes res/images/preview_bg_4x1.png | Bin 0 -> 1724 bytes res/images/preview_bg_4x2.png | Bin 0 -> 1467 bytes res/images/preview_bg_4x3.png | Bin 0 -> 1614 bytes res/images/preview_bg_4x4.png | Bin 0 -> 1799 bytes res/images/scroll_bar.9.png | Bin 0 -> 1182 bytes res/images/unknown.png | Bin 0 -> 19568 bytes src/add_viewer/add_viewer.c | 192 ++++++ src/add_viewer/list_view.c | 532 +++++++++++++++++ src/add_viewer/view.c | 159 +++++ src/add_viewer/widget.c | 174 ++++++ src/homescreen-efl.c | 8 + src/key.c | 6 +- src/livebox/livebox_panel.c | 19 +- src/livebox/livebox_widget.c | 8 +- src/option_menu.c | 23 +- src/page_scroller.c | 6 +- 38 files changed, 2480 insertions(+), 40 deletions(-) create mode 100644 inc/add_viewer/add_viewer.h create mode 100644 inc/add_viewer/list_view.h create mode 100644 inc/add_viewer/view.h create mode 100644 inc/add_viewer/widget.h create mode 100644 res/edje/color_classes.edc create mode 100644 res/edje/preview.edc create mode 100644 res/images/00_scroll_bar_h.png create mode 100644 res/images/00_scroll_bar_v.png create mode 100644 res/images/1x1 preview shortcut.png create mode 100644 res/images/icon_drawer_search.png create mode 100644 res/images/icon_list_close.png create mode 100644 res/images/icon_list_open.png create mode 100644 res/images/icon_shadow.png create mode 100644 res/images/preview_bg_1x1.png create mode 100644 res/images/preview_bg_2x1.png create mode 100644 res/images/preview_bg_2x2.png create mode 100644 res/images/preview_bg_4x1.png create mode 100644 res/images/preview_bg_4x2.png create mode 100644 res/images/preview_bg_4x3.png create mode 100644 res/images/preview_bg_4x4.png create mode 100644 res/images/scroll_bar.9.png create mode 100644 res/images/unknown.png create mode 100644 src/add_viewer/add_viewer.c create mode 100644 src/add_viewer/list_view.c create mode 100644 src/add_viewer/view.c create mode 100644 src/add_viewer/widget.c diff --git a/CMake/CMakeLists.txt b/CMake/CMakeLists.txt index 6a1c25b..95630d6 100644 --- a/CMake/CMakeLists.txt +++ b/CMake/CMakeLists.txt @@ -72,6 +72,11 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${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) diff --git a/CMake/res/edje/CMakeLists.txt b/CMake/res/edje/CMakeLists.txt index a4af2fa..bf99cf5 100644 --- a/CMake/res/edje/CMakeLists.txt +++ b/CMake/res/edje/CMakeLists.txt @@ -69,3 +69,19 @@ ADD_CUSTOM_TARGET(page_edit.edj ) 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/inc/add_viewer/add_viewer.h b/inc/add_viewer/add_viewer.h new file mode 100644 index 0000000..d00270a --- /dev/null +++ b/inc/add_viewer/add_viewer.h @@ -0,0 +1,55 @@ +/* + * 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/list_view.h b/inc/add_viewer/list_view.h new file mode 100644 index 0000000..0cf8e47 --- /dev/null +++ b/inc/add_viewer/list_view.h @@ -0,0 +1,34 @@ +/* + * 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 LIST_VIEW_H_ +#define LIST_VIEW_H_ + +#include "homescreen-efl.h" + +/** + * @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 diff --git a/inc/add_viewer/view.h b/inc/add_viewer/view.h new file mode 100644 index 0000000..284683c --- /dev/null +++ b/inc/add_viewer/view.h @@ -0,0 +1,72 @@ +/* + * 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 new file mode 100644 index 0000000..c5d7c2f --- /dev/null +++ b/inc/add_viewer/widget.h @@ -0,0 +1,65 @@ +/* + * 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; + + 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/conf.h b/inc/conf.h index a076a16..6d03591 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -69,7 +69,6 @@ *******************************************************************************/ /*================================ OPTION_MENU.C==============================*/ -#define OPTION_MENU_ADD_VIEWER "org.tizen.add-viewer" #define OPTION_MENU_SETTINGS "org.tizen.wallpaper-ui-service" #define CAPTION_MENU_CENTER_LABEL_TEXT_LEN_MAX 16 diff --git a/inc/homescreen-efl.h b/inc/homescreen-efl.h index c2e2afd..377aa5f 100644 --- a/inc/homescreen-efl.h +++ b/inc/homescreen-efl.h @@ -36,6 +36,7 @@ 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, diff --git a/inc/util.h b/inc/util.h index 23b3f03..1b2f620 100644 --- a/inc/util.h +++ b/inc/util.h @@ -21,13 +21,13 @@ #include #include -#define BUF_SIZE 64 - #ifdef LOG_TAG #undef LOG_TAG #endif #define LOG_TAG "HOMESCREEN_EFL" +#define BUF_SIZE 64 + /* Multi-language */ #ifndef _ #define _(str) gettext(str) diff --git a/project_def.prop b/project_def.prop index a5ae489..5a973dc 100644 --- a/project_def.prop +++ b/project_def.prop @@ -9,7 +9,7 @@ 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 +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 # EDC Sources USER_EDCS = @@ -59,7 +59,7 @@ 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 +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 res/edje/tizen-dark-inc.edc USER_EXT_EDC0_EDCS_IMAGE_DIRS = res/images USER_EXT_EDC0_EDCS_IMAGE_DIRS_ABS = USER_EXT_EDC0_EDCS_SOUND_DIRS = edje/sounds diff --git a/res/edje/color_classes.edc b/res/edje/color_classes.edc new file mode 100644 index 0000000..de2453b --- /dev/null +++ b/res/edje/color_classes.edc @@ -0,0 +1,43 @@ +/* +* 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/preview.edc b/res/edje/preview.edc new file mode 100644 index 0000000..a0e0f6c --- /dev/null +++ b/res/edje/preview.edc @@ -0,0 +1,1093 @@ +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/images/00_scroll_bar_h.png b/res/images/00_scroll_bar_h.png new file mode 100644 index 0000000000000000000000000000000000000000..526c91c16134b23bd562ebbaa2ef06a58f4f2414 GIT binary patch literal 3185 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 XZL^pZ7JZ^-00000NkvXXu0mjfP^RcH literal 0 HcmV?d00001 diff --git a/res/images/00_scroll_bar_v.png b/res/images/00_scroll_bar_v.png new file mode 100644 index 0000000000000000000000000000000000000000..f07b2ca593aef5f593c52ff2892a00fc719cd6da GIT binary patch literal 3192 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 BuuuR1 literal 0 HcmV?d00001 diff --git a/res/images/icon_drawer_search.png b/res/images/icon_drawer_search.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca32619cb78341f59843d8f1d0423161a82484 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/res/images/icon_list_open.png b/res/images/icon_list_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f101249d207d8b90bcd6ae08a682700a97194689 GIT binary patch literal 1222 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 literal 0 HcmV?d00001 diff --git a/res/images/preview_bg_2x1.png b/res/images/preview_bg_2x1.png new file mode 100644 index 0000000000000000000000000000000000000000..817f5ee8016a3f14390f9a57d0ccab5a591d2b09 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/res/images/preview_bg_2x2.png b/res/images/preview_bg_2x2.png new file mode 100644 index 0000000000000000000000000000000000000000..d34f366faf3de0d00664b299d863c7ba69d621de GIT binary patch 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% literal 0 HcmV?d00001 diff --git a/res/images/preview_bg_4x3.png b/res/images/preview_bg_4x3.png new file mode 100644 index 0000000000000000000000000000000000000000..219dc42e0f5f90f8cf2c0ae00bcbd6c35e2862aa GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/res/images/preview_bg_4x4.png b/res/images/preview_bg_4x4.png new file mode 100644 index 0000000000000000000000000000000000000000..59a8bce7d7dd459286d2e668561ff20818a2f548 GIT binary patch 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$<=? literal 0 HcmV?d00001 diff --git a/res/images/scroll_bar.9.png b/res/images/scroll_bar.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a077f4d5864300b5d6507041b9b048cc21556b20 GIT binary patch literal 1182 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$Z5SAsl`=yjN+NuHtdjF{^%6m9^eS=-fVvqNZ0suv5|gu2OB9k) z(=+pImEP~(ucVNfVyhHx>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 literal 0 HcmV?d00001 diff --git a/res/images/unknown.png b/res/images/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..535db6063ad8e69e355c808507480f46ab0ea5bc GIT binary patch literal 19568 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

e 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 +#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->widget_id); + + 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->widget_id); + + //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"); + } + + *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 new file mode 100644 index 0000000..f5450b3 --- /dev/null +++ b/src/add_viewer/view.c @@ -0,0 +1,159 @@ +/* + * 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 new file mode 100644 index 0000000..fe8cf94 --- /dev/null +++ b/src/add_viewer/widget.c @@ -0,0 +1,174 @@ +/* + * 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->widget_id, w2->widget_id); + + 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_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); +} + + diff --git a/src/homescreen-efl.c b/src/homescreen-efl.c index cd629ed..36367a3 100644 --- a/src/homescreen-efl.c +++ b/src/homescreen-efl.c @@ -21,8 +21,10 @@ #include #include #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" @@ -187,8 +189,14 @@ HAPI void home_screen_set_view_type(homescreen_view_t view) 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(); diff --git a/src/key.c b/src/key.c index 503ca1d..372f536 100644 --- a/src/key.c +++ b/src/key.c @@ -20,6 +20,7 @@ #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" @@ -153,6 +154,9 @@ static Eina_Bool __key_release_cb(void *data, int type, void *event) 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(); @@ -163,7 +167,7 @@ static Eina_Bool __key_release_cb(void *data, int type, void *event) break; case HOMESCREEN_VIEW_ALL_APPS_CHOOSE: home_screen_close_all_apps_choose_view(); - if(pressed_key == HW_KEY_HOME) + if (pressed_key == HW_KEY_HOME) home_screen_set_view_type(HOMESCREEN_VIEW_HOME); break; case HOMESCREEN_VIEW_ALL_APPS_EDIT: diff --git a/src/livebox/livebox_panel.c b/src/livebox/livebox_panel.c index 901daff..fc3aa9e 100644 --- a/src/livebox/livebox_panel.c +++ b/src/livebox/livebox_panel.c @@ -379,6 +379,7 @@ void livebox_panel_add_livebox(Tree_node_t *node, Evas_Object *page, 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); @@ -395,7 +396,6 @@ void livebox_panel_add_livebox(Tree_node_t *node, Evas_Object *page, #ifdef LIVEBOX_RESIZE_TEST livebox = elm_image_add(livebox_layout); - elm_image_file_set(livebox, livebox_pkgname, NULL); #else livebox = livebox_widget_add(livebox_pkgname, livebox_layout, content_info); #endif @@ -408,12 +408,25 @@ void livebox_panel_add_livebox(Tree_node_t *node, Evas_Object *page, node->data->layout = livebox_layout; evas_object_data_set(livebox_layout, KEY_ICON_DATA, node); - elm_layout_file_set(livebox_layout, EDJE_LIVEBOX_LAYOUT_FILENAME, + ret = elm_layout_file_set(livebox_layout, util_get_res_file_path(EDJE_LIVEBOX_LAYOUT_FILENAME), GROUP_LIVEBOX_LAYOUT); - elm_layout_content_set(livebox_layout, PART_LIVEBOX, livebox); + 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); diff --git a/src/livebox/livebox_widget.c b/src/livebox/livebox_widget.c index 69e276a..7124468 100644 --- a/src/livebox/livebox_widget.c +++ b/src/livebox/livebox_widget.c @@ -366,7 +366,7 @@ static int __livebox_widget_get_pkg_list_cb(const char *pkg_id, const char *widg return 0; } -static void livebox_widget_new(int widget_width, int widget_height, const char *content_info) +static void livebox_widget_new(int widget_width, int widget_height, const char *appid) { int page_index = -1; int pos_x = 0; @@ -414,14 +414,14 @@ static void livebox_widget_new(int widget_width, int widget_height, const char * } } - item_node = data_model_add_widget(page_node, content_info, pos_x, pos_y, widget_width, widget_height, NULL); + 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, content_info, pos_x, pos_y, widget_width, widget_height, NULL); + livebox_panel_add_livebox(item_node, page, appid, pos_x, pos_y, widget_width, widget_height, NULL); livebox_panel_update_dynamic_index(); } @@ -481,7 +481,7 @@ static int request_cb(const char *appid, const char *name, int type, LOGI("Widget will be added: %dx%d\n", widget_width, widget_height); - livebox_widget_new(widget_width, widget_height, content_info); + livebox_widget_new(widget_width, widget_height, appid); home_screen_print_tree(); return 0; /*returns success. */ diff --git a/src/option_menu.c b/src/option_menu.c index cf0e6f9..7af4cbf 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -180,8 +180,6 @@ static void __option_menu_entry_all_apps_edit_apps_cb(void *data, Evas_Object *o 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); - livebox_panel_set_edit_mode_layout(true); - livebox_panel_change_edit_mode_state(false); option_menu_hide(); } @@ -215,27 +213,8 @@ static void __option_menu_entry_all_apps_add_widget_cb(void *data, Evas_Object * { LOGD("__option_menu_entry_all_apps_add_widget_cb"); - const char *appid = OPTION_MENU_ADD_VIEWER; - app_control_h app_control_handle = NULL; - - if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) { - LOGE("[FAILED][app_control_create]"); - return; - } + home_screen_set_view_type(HOMESCREEN_VIEW_HOME_ADD_VIEWER); - 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(); } diff --git a/src/page_scroller.c b/src/page_scroller.c index 5a64698..308f9ba 100644 --- a/src/page_scroller.c +++ b/src/page_scroller.c @@ -161,8 +161,6 @@ HAPI Evas_Object* page_scroller_get_page(Evas_Object *scroller, int n) HAPI bool page_scroller_freeze(Evas_Object *scroller) { - LOGD("Freeze page scroller"); - if (!scroller) { LOGE("Page Scroller is NULL"); return false; @@ -175,8 +173,6 @@ HAPI bool page_scroller_freeze(Evas_Object *scroller) HAPI bool page_scroller_unfreeze(Evas_Object *scroller) { - LOGD("Unfreeze page scroller"); - if (!scroller) { LOGE("Page Scroller is NULL"); return false; @@ -334,7 +330,7 @@ static Evas_Object* __page_scroller_create_scroller(void) Evas_Object *box = NULL; if (!win) { - LOGD("Window doesn't exist"); + LOGE("Window doesn't exist"); return NULL; } -- 2.7.4