From: Jin Yoon Date: Thu, 14 Feb 2013 08:47:43 +0000 (+0900) Subject: Sync with the private X-Git-Tag: submit/tizen_2.1/20130424.223356~28 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bcd021d0a6259cf658d9fdfbc3b43779ae582530;p=apps%2Fhome%2Fmenu-screen.git Sync with the private --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 6817739..4528b36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ INCLUDE(FindPkgConfig) pkg_check_modules(MENU_PKGS REQUIRED ail aul + badge bundle capi-appfw-application dlog @@ -59,6 +60,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) ADD_EXECUTABLE(${PROJECT_NAME} src/index.c src/item.c + src/item_badge.c src/item_event.c src/layout.c src/list.c diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index dcc6f83..8b9e6d0 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -5,5 +5,6 @@ CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml) INSTALL(FILES ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml DESTINATION ${MANIFESTDIR}) ADD_SUBDIRECTORY(edje) +ADD_SUBDIRECTORY(images) # End of a file diff --git a/data/edje/CMakeLists.txt b/data/edje/CMakeLists.txt index 02cf548..2e334a0 100644 --- a/data/edje/CMakeLists.txt +++ b/data/edje/CMakeLists.txt @@ -48,4 +48,14 @@ INSTALL(FILES layout_portrait.edj DESTINATION ${EDJEDIR}) +ADD_CUSTOM_TARGET(button_edit.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/button_edit.edc button_edit.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/button_edit.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} button_edit.edj) +INSTALL(FILES button_edit.edj DESTINATION ${EDJEDIR}) + + + # End of a file diff --git a/data/edje/all_apps_portrait.edc b/data/edje/all_apps_portrait.edc index 5534e0f..fe5f0ef 100644 --- a/data/edje/all_apps_portrait.edc +++ b/data/edje/all_apps_portrait.edc @@ -56,22 +56,34 @@ collections { rel1 { relative: 0.2 0.0; to, "index_bg";} rel2 { relative: 0.8 1.0; to, "index_bg";} visible: 1; - } + } } - + part { + name: "button_edit"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 16/720 8/70; to, "index_bg";} + rel2 { relative: 144/720 62/70; to, "index_bg";} + visible: 1; + } + } part { - name: "content_bg"; - type: RECT; - scale: 1; - mouse_events: 1; - description { + name: "content_bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description { state: "default" 0.0; rel1 { relative: 0.0 84/1210; to, "bg"; } // 154 - 70 rel2 { relative: 1.0 1144/1210; to, "bg"; } color: 34 34 34 255; visible: 0; - } - } + } + } part { name: "content"; diff --git a/data/edje/button_edit.edc b/data/edje/button_edit.edc new file mode 100644 index 0000000..dc6e2e3 --- /dev/null +++ b/data/edje/button_edit.edc @@ -0,0 +1,277 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.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.tizenopensource.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. + */ + + + +images { + image: "../images/RM06_App_tray_setting.png" COMP; + image: "../images/RM06_App_tray_setting_press.png" COMP; + image: "../images/RM06_App_tray_edit_btn.png" COMP; + image: "../images/RM06_App_tray_edit_btn_press.png" COMP; +} + + + +collections { + group { + name: "button_edit"; + parts { + part { + name: "edit_button"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 25/128 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + description { + state: "enable" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "edit_button_bg"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.5 0.5; to, "edit_button"; } + rel2 { relative: 0.5 0.5; to, "edit_button"; } + min: 119 54; + max: 119 54; + fixed: 1 1; + image { + normal: "../images/RM06_App_tray_edit_btn.png"; + border: 3 3 3 3; + middle: DEFAULT; + border_scale: 0; + } + color: 0 0 0 0; + visible: 1; + } + description { + state: "enable" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "press" 0.0; + rel1 { relative: 0.5 0.5; to, "edit_button"; } + rel2 { relative: 0.5 0.5; to, "edit_button"; } + min: 119 54; + max: 119 54; + fixed: 1 1; + image { + normal: "../images/RM06_App_tray_edit_btn_press.png"; + border: 3 3 3 3; + middle: DEFAULT; + border_scale: 0; + } + color: 255 255 255 255; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "edit_button_image"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 30/119 0.5; to, "edit_button_bg";} + rel2 { relative: 30/119 0.5; to, "edit_button_bg";} + image { + normal: "../images/RM06_App_tray_setting.png"; + } + min:42 42; + fixed: 1 1; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/RM06_App_tray_setting_press.png"; + } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "edit_button_text"; + type: TEXT; + effect: SOFT_SHADOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 50/119 0.15; to, "edit_button_bg";} // origin : 59/119 0.0 + rel2 { relative: 1.0 1.0; to, "edit_button_bg";} + color: 183 183 183 255; + color2: 0 0 0 35; + color3: 0 0 0 35; + text { + text_class: "menu_item"; + font: "TIZEN:style=medium"; + size: 6; + fit: 1 1; + align: 0.5 0.5; + } + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 249 249 249 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "edit_button_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to, "edit_button";} + rel2 { relative: 1.0 1.0; to, "edit_button";} + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + + programs { + program { + name: "edit_button,down"; + signal: "mouse,down,*"; + source: "edit_button_event"; + action: STATE_SET "press" 0.0; + target: "edit_button_image"; + target: "edit_button_text"; + after: "edit_button,down,after"; + } + program { + name: "edit_button,down,after"; + action: SIGNAL_EMIT "edit_button,down" "menu"; + } + + program { + name: "edit_button,up"; + signal: "mouse,up,*"; + source: "edit_button_event"; + action: STATE_SET "default" 0.0; + target: "edit_button_image"; + target: "edit_button_text"; + after: "edit_button,up,after"; + } + program { + name: "edit_button,up,after"; + action: SIGNAL_EMIT "edit_button,up" "menu"; + } + + program { + name: "edit_button,enable"; + signal: "edit_button,enable"; + source: "menu"; + action: STATE_SET "enable" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + transition: DECELERATE 0.4; + } + program { + name: "edit_button,disable"; + signal: "edit_button,disable"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + transition: DECELERATE 0.4; + } + + program { + name: "edit_button,enable,press"; + signal: "edit_button,enable,press"; + source: "menu"; + action: STATE_SET "press" 0.0; + target: "edit_button_bg"; + } + program { + name: "edit_button,enable,release"; + signal: "edit_button,enable,release"; + source: "menu"; + action: STATE_SET "enable" 0.0; + target: "edit_button_bg"; + } + program { + name: "edit_button_image,hide"; + signal: "edit_button_image,hide"; + source: "menu"; + action: STATE_SET "hide" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_text"; + target: "edit_button_event"; + } + program { + name: "edit_button_image,show"; + signal: "edit_button_image,show"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_text"; + target: "edit_button_event"; + } + } + } +} + + +// End of file diff --git a/data/edje/item_4x4.edc b/data/edje/item_4x4.edc index c243069..527dfad 100644 --- a/data/edje/item_4x4.edc +++ b/data/edje/item_4x4.edc @@ -25,7 +25,11 @@ styles { } } - +images { + image: "../images/RM06_App tray_Btn_Uninstall.png" COMP; + image: "../images/RM06_App tray_Btn_Uninstall_press.png" COMP; + image: "../images/menu_badge_01.png" COMP; +} collections { group { @@ -81,7 +85,56 @@ collections { visible: 1; } } + part { + name: "badge"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 120/180 10/180; to, "bg"; } + rel2 { relative: 180/180 70/180; to, "bg"; } + image { + normal: "../images/menu_badge_01.png"; + } + } + description { + state: "badge" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "badge,txt"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.1 0.1; to, "badge"; } + rel2 { relative: 0.9 0.9; to, "badge"; } + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 35; + color3: 0 0 0 35; + text { + text_class: "menu_item"; + font: "TIZEN:style=medium"; + size: 12; + text: "1"; + align: 0.5 0.5; + fit: 1 1; + } + } + description { + state: "badge" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } part { name: "block_event"; type: RECT; @@ -100,6 +153,52 @@ collections { visible: 0; } } + part { + name: "uninstall"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 10/180 10/180; to, "bg"; } + rel2 { relative: 70/180 70/180; to, "bg"; } + image { + normal: "../images/RM06_App tray_Btn_Uninstall.png"; + } + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "edit,press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/RM06_App tray_Btn_Uninstall_press.png"; + } + visible: 1; + } + } + part { + name: "uninstall_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0/180 10/180; to, "bg"; } + rel2 { relative: 60/180 70/180; to, "bg"; } + color: 0 0 0 0; + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } part { name: "txt"; type: TEXT; @@ -147,6 +246,66 @@ collections { action: SIGNAL_EMIT "item,up" "menu"; } + // Badge + program { + name: "badge,on"; + signal: "badge,on"; + source: "menu"; + action: STATE_SET "badge" 0.0; + target: "badge"; + target: "badge,txt"; + } + program { + name: "badge,off"; + signal: "badge,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "badge"; + target: "badge,txt"; + } + + program { + name: "uninstall,on"; + signal: "uninstall,on"; + source: "menu"; + action: STATE_SET "edit,release" 0.0; + target: "block_event"; + target: "uninstall"; + target: "uninstall_event"; + } + program { + name: "uninstall,off"; + signal: "uninstall,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "block_event"; + target: "uninstall"; + target: "uninstall_event"; + } + program { + name: "uninstall,down"; + signal: "mouse,down,*"; + source: "uninstall_event"; + action: SIGNAL_EMIT "uninstall,down" "menu"; + after: "uninstall,down,after"; + } + program { + name: "uninstall,down,after"; + action: STATE_SET "edit,press" 0.0; + target: "uninstall"; + } + program { + name: "uninstall,up"; + signal: "mouse,up,*"; + source: "uninstall_event"; + action: SIGNAL_EMIT "uninstall,up" "menu"; + after: "uninstall,up,after"; + } + program { + name: "uninstall,up,after"; + action: STATE_SET "edit,release" 0.0; + target: "uninstall"; + } } } // group } // collections diff --git a/data/edje/pagecontrol.edc b/data/edje/pagecontrol.edc deleted file mode 100644 index ebb5c31..0000000 --- a/data/edje/pagecontrol.edc +++ /dev/null @@ -1,155 +0,0 @@ - /* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.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.tizenopensource.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 { - group { - name: "elm/pagecontrol/base/default"; - - parts { - part { - name: "bg"; - type: RECT; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - color: 0 0 0 0; - } - } - part { - name: "elm.swallow.page"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - min: 332 32; - } - } - } - } - - #define PAGE_ITEM(number) \ - group { \ - name: "elm/page/item/default_"number; \ - images { \ - image: "../images/RM06_App tray_page indicator.png" COMP; \ - image: "../images/RM06_App tray_page indicator_focus.png" COMP; \ - } \ - parts { \ - part { \ - name: "bg"; \ - type: RECT; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 44 40; \ - max: 44 40; \ - align: 0.5 0.5; \ - color: 0 0 0 0; \ - } \ - } \ - part { \ - name: "indicator_1"; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - fixed: 1 1; \ - align: 0.5 0.5; \ - visible: 1; \ - rel1 { to: "bg"; } \ - rel2 { to: "bg"; } \ - image { \ - normal: "../images/RM06_App tray_page indicator.png"; \ - } \ - } \ - description { \ - state: "selected" 0.0; \ - inherit: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - visible: 0; \ - } \ - } \ - part { \ - name: "indicator_2"; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - fixed: 1 1; \ - align: 0.5 0.5; \ - visible: 0; \ - rel1 { to: "bg"; } \ - rel2 { to: "bg"; } \ - image { \ - normal: "../images/RM06_App tray_page indicator_focus.png"; \ - } \ - } \ - description { \ - state: "selected" 0.0; \ - inherit: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - visible: 1; \ - } \ - } \ - } \ - programs { \ - program { \ - name: "indicator_on"; \ - signal: "elm,state,indicator,on"; \ - source: "elm"; \ - action: STATE_SET "selected" 0.0; \ - target: "indicator_1"; \ - target: "indicator_2"; \ - } \ - program { \ - name: "indicator_off"; \ - signal: "elm,state,indicator,off"; \ - source: "elm"; \ - action: STATE_SET "default" 0.0; \ - target: "indicator_1"; \ - target: "indicator_2"; \ - } \ - program { \ - name: "indicator_clicked"; \ - signal: "mouse,clicked,1"; \ - source: "bg"; \ - action: SIGNAL_EMIT "clicked" "indicator_clicked"; \ - } \ - } \ - } \ - - PAGE_ITEM(1) - PAGE_ITEM(2) - PAGE_ITEM(3) - PAGE_ITEM(4) - PAGE_ITEM(5) - PAGE_ITEM(6) - PAGE_ITEM(7) - PAGE_ITEM(8) - PAGE_ITEM(9) - PAGE_ITEM(10) -} diff --git a/data/images/CMakeLists.txt b/data/images/CMakeLists.txt new file mode 100644 index 0000000..cb60ac7 --- /dev/null +++ b/data/images/CMakeLists.txt @@ -0,0 +1 @@ +INSTALL(FILES default.png DESTINATION ${IMAGEDIR}) diff --git a/data/images/RM06_App tray_Btn_Uninstall.png b/data/images/RM06_App tray_Btn_Uninstall.png new file mode 100644 index 0000000..7145638 Binary files /dev/null and b/data/images/RM06_App tray_Btn_Uninstall.png differ diff --git a/data/images/RM06_App tray_Btn_Uninstall_press.png b/data/images/RM06_App tray_Btn_Uninstall_press.png new file mode 100644 index 0000000..2ac8311 Binary files /dev/null and b/data/images/RM06_App tray_Btn_Uninstall_press.png differ diff --git a/data/images/RM06_App_tray_edit_btn.png b/data/images/RM06_App_tray_edit_btn.png new file mode 100644 index 0000000..0674e9c Binary files /dev/null and b/data/images/RM06_App_tray_edit_btn.png differ diff --git a/data/images/RM06_App_tray_edit_btn_press.png b/data/images/RM06_App_tray_edit_btn_press.png new file mode 100644 index 0000000..eefc4f9 Binary files /dev/null and b/data/images/RM06_App_tray_edit_btn_press.png differ diff --git a/data/images/RM06_App_tray_setting.png b/data/images/RM06_App_tray_setting.png new file mode 100644 index 0000000..1b357fc Binary files /dev/null and b/data/images/RM06_App_tray_setting.png differ diff --git a/data/images/RM06_App_tray_setting_press.png b/data/images/RM06_App_tray_setting_press.png new file mode 100644 index 0000000..3858945 Binary files /dev/null and b/data/images/RM06_App_tray_setting_press.png differ diff --git a/data/images/default.png b/data/images/default.png new file mode 100644 index 0000000..983c883 Binary files /dev/null and b/data/images/default.png differ diff --git a/data/images/menu_badge_01.png b/data/images/menu_badge_01.png new file mode 100644 index 0000000..f297f72 Binary files /dev/null and b/data/images/menu_badge_01.png differ diff --git a/debian/control b/debian/control index 1a1fe81..1bb0f09 100644 --- a/debian/control +++ b/debian/control @@ -2,14 +2,14 @@ Source: menu-screen Section: utils Priority: extra Maintainer: Jin Yoon -Build-Depends: debhelper (>= 5), libelm-dev, libslp-utilx-dev, libslp-setting-dev, libefreet-dev, libslp-sysman-dev, libslp-pm-dev, dlog-dev, libecore-dev, libaul-1-dev, libpkgmgr-client-dev, syspopup-caller-dev, libheynoti-dev, libail-0-dev, librua-dev, libslp-shortcut-dev, menu-daemon, capi-appfw-application-dev +Build-Depends: debhelper (>= 5), libelm-dev, libslp-utilx-dev, libslp-setting-dev, libefreet-dev, libslp-sysman-dev, libslp-pm-dev, dlog-dev, libecore-dev, libaul-1-dev, libpkgmgr-client-dev, syspopup-caller-dev, libheynoti-dev, libail-0-dev, librua-dev, libslp-shortcut-dev, menu-daemon, capi-appfw-application-dev, libbadge-dev Homepage: N/A Standards-Version: 0.1.0 Package: org.tizen.menu-screen Section: utils Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, libelm, libeina, libslp-utilx-0, libslp-setting-0, libefreet, libslp-sysman, libslp-pm-0, libdlog-0, libaul-1, libpkgmgr-client-0, syspopup-caller-0, libheynoti-0, libail-0, menu-daemon, capi-appfw-application +Depends: ${shlibs:Depends}, ${misc:Depends}, libelm, libeina, libslp-utilx-0, libslp-setting-0, libefreet, libslp-sysman, libslp-pm-0, libdlog-0, libaul-1, libpkgmgr-client-0, syspopup-caller-0, libheynoti-0, libail-0, menu-daemon, capi-appfw-application, libbadge Description: inhouse menu-screen Package: org.tizen.menu-screen-dbg diff --git a/include/item.h b/include/item.h index 70844a3..60d4db7 100644 --- a/include/item.h +++ b/include/item.h @@ -45,6 +45,13 @@ extern void item_set_desktop(Evas_Object *item, char *name, int sync); extern void item_enable_delete(Evas_Object *obj); extern void item_disable_delete(Evas_Object *item); +extern void item_show_badge(Evas_Object *obj, int value); +extern void item_hide_badge(Evas_Object *obj); +extern int item_is_enabled_badge(Evas_Object *obj); + +extern void item_edit(Evas_Object *item); +extern void item_unedit(Evas_Object *item); + extern Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai); extern void item_update(Evas_Object *item, app_info_t *ai); extern void item_destroy(Evas_Object *obj); diff --git a/include/item_badge.h b/include/item_badge.h new file mode 100644 index 0000000..8e13bdf --- /dev/null +++ b/include/item_badge.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.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.tizenopensource.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_SCREEN_BADGE_H__ +#define __MENU_SCREEN_BADGE_H__ + +#include + +#include "util.h" + +extern menu_screen_error_e item_badge_register(Evas_Object *item); +extern void item_badge_unregister(Evas_Object *item); +extern bool item_badge_is_registered(Evas_Object *item); +extern int item_badge_count(char *package); + +extern void item_badge_register_changed_cb(Evas_Object *scroller); +extern void item_badge_unregister_changed_cb(void); + +#endif +// End of a file diff --git a/include/page_scroller.h b/include/page_scroller.h index 4f12bda..0a9f1ca 100644 --- a/include/page_scroller.h +++ b/include/page_scroller.h @@ -45,6 +45,10 @@ extern void page_scroller_trim_items(Evas_Object *scroller); extern void page_scroller_bring_in(Evas_Object *scroller, int idx); extern void page_scroller_show_region(Evas_Object *scroller, int idx); +extern void page_scroller_edit(Evas_Object *scroller); +extern void page_scroller_unedit(Evas_Object *scroller); +extern bool page_scroller_is_edited(Evas_Object *scroller); + #endif //__MENU_SCREEN_PAGE_SCROLLER_H__ // End of a file diff --git a/include/popup.h b/include/popup.h index 7a2dc3c..d8ed123 100644 --- a/include/popup.h +++ b/include/popup.h @@ -25,6 +25,7 @@ extern void popup_free_list(); extern Evas_Object *popup_create(Evas_Object *parent, const char *warning); extern void popup_destroy(Evas_Object *popup); +extern Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item); #endif //__MENU_SCREEN_POPUP_H__ diff --git a/include/util.h b/include/util.h index 9d93f62..522a580 100644 --- a/include/util.h +++ b/include/util.h @@ -33,15 +33,15 @@ /* Log */ #if !defined(_W) -#define _W(fmt, arg...) LOGW("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) #endif #if !defined(_D) -#define _D(fmt, arg...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) #endif #if !defined(_E) -#define _E(fmt, arg...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) #endif #if !defined(_T) @@ -57,6 +57,12 @@ #define N_(str) gettext_noop(str) #define D_(str) dgettext("sys_string", str) +/* Build */ +#define HAPI __attribute__((visibility("hidden"))) + +/* Packaging */ +#define DEFAULT_ICON IMAGEDIR"/default.png" + #ifdef APPFWK_MEASUREMENT #define PRINT_APPFWK() do { \ struct timeval tv; \ diff --git a/packaging/org.tizen.menu-screen.spec b/packaging/org.tizen.menu-screen.spec index f084a02..9529448 100644 --- a/packaging/org.tizen.menu-screen.spec +++ b/packaging/org.tizen.menu-screen.spec @@ -19,27 +19,28 @@ Release: 1.1 Group: TO_BE/FILLED_IN License: Flora Software License Source0: %{name}-%{version}.tar.gz -BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(ail) BuildRequires: pkgconfig(appcore-efl) -BuildRequires: pkgconfig(utilX) BuildRequires: pkgconfig(aul) -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(badge) BuildRequires: pkgconfig(bundle) -BuildRequires: pkgconfig(pkgmgr) -BuildRequires: pkgconfig(syspopup-caller) -BuildRequires: pkgconfig(heynoti) -BuildRequires: pkgconfig(evas) -BuildRequires: pkgconfig(ecore-evas) -BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(ecore-evas) BuildRequires: pkgconfig(ecore-file) BuildRequires: pkgconfig(ecore-imf) BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(edje) BuildRequires: pkgconfig(eet) BuildRequires: pkgconfig(eina) -BuildRequires: pkgconfig(ail) -BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(heynoti) +BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(syspopup-caller) +BuildRequires: pkgconfig(utilX) BuildRequires: cmake BuildRequires: edje-tools BuildRequires: gettext-tools @@ -92,9 +93,11 @@ init_vconf %defattr(-,root,root,-) %{_bindir}/menu-screen %{_resdir}/edje/all_apps_portrait.edj +%{_resdir}/edje/button_edit.edj %{_resdir}/edje/group_4x4_portrait.edj %{_resdir}/edje/item_4x4.edj %{_resdir}/edje/layout_portrait.edj %{_resdir}/edje/index.edj +%{_resdir}/images/default.png %{_usr_datadir}/packages/org.tizen.menu-screen.xml %{_usr_datadir}/license/%{name} diff --git a/src/all_apps/layout.c b/src/all_apps/layout.c index 7d394ea..386b5f7 100644 --- a/src/all_apps/layout.c +++ b/src/all_apps/layout.c @@ -34,6 +34,163 @@ #define GROUP_4X4_EDJE_PORTRAIT EDJEDIR"/group_4x4_portrait.edj"; +#define ALL_APPS_EDIT_BUTTON_EDJE EDJEDIR"/button_edit.edj" +#define ALL_APPS_EDIT_BUTTON_GROUP "button_edit" +#define ALL_APPS_EDIT_BUTTON_PART "button_edit" + +#define STR_DONE _("Done") + + +HAPI void all_apps_layout_edit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + Evas_Object *scroller; + + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + edje_object_signal_emit(_EDJ(edit_button), "edit_button,enable", "menu"); + if (edje_object_part_text_set(_EDJ(edit_button), "edit_button_text", STR_DONE) == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:%s", _EDJ(edit_button), "edit_button_text", STR_DONE); + } + + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + page_scroller_edit(scroller); +} + + + +HAPI void all_apps_layout_unedit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + + ret_if(NULL == all_apps); + + do { + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + + edje_object_signal_emit(_EDJ(edit_button), "edit_button,disable", "menu"); + if (edje_object_part_text_set(_EDJ(edit_button), "edit_button_text", "") == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:(null)", _EDJ(edit_button), "edit_button_text"); + } + } while (0); + + do { + Evas_Object *scroller; + + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + + page_scroller_unedit(scroller); + } while (0); +} + + + +static void _press_edit_button(Evas_Object *edje) +{ + edje_object_signal_emit(edje, "edit_button,enable,press", "menu"); +} + + + +static void _release_edit_button(Evas_Object *edje) +{ + edje_object_signal_emit(edje, "edit_button,enable,release", "menu"); +} + + + +static void _edit_button_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *scroller = data; + + _D("Edit button is down"); + + if (page_scroller_is_edited(scroller)) { + _press_edit_button(obj); + } +} + + + +static void _edit_button_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *scroller = data; + Evas_Object *all_apps; + + _D("Edit button is up"); + + all_apps = evas_object_data_get(scroller, "tab"); + if (page_scroller_is_edited(scroller)) { + Evas_Object *eo; + bool pressed = false; + + eo = evas_object_data_get(obj, "evas_object"); + pressed = (bool) evas_object_data_get(eo, "pressed"); + if (pressed) { + all_apps_layout_unedit(all_apps); + } else { + _release_edit_button(obj); + } + } else { + all_apps_layout_edit(all_apps); + } +} + + + +static void _button_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Edit button is out"); + evas_object_data_set(obj, "pressed", (void *) false); +} + + + +static void _button_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Edit button is in"); + evas_object_data_set(obj, "pressed", (void *) true); +} + + + +static Evas_Object *_add_edit_button(Evas_Object *parent, Evas_Object *scroller) +{ + Evas_Object *button; + + retv_if(NULL == parent, NULL); + retv_if(NULL == scroller, NULL); + + button = layout_load_edj(parent, ALL_APPS_EDIT_BUTTON_EDJE, ALL_APPS_EDIT_BUTTON_GROUP); + retv_if(NULL == button, NULL); + + edje_object_signal_callback_add(_EDJ(button), "edit_button,down", "menu", _edit_button_down_cb, scroller); + edje_object_signal_callback_add(_EDJ(button), "edit_button,up", "menu", _edit_button_up_cb, scroller); + evas_object_event_callback_add(button, EVAS_CALLBACK_MOUSE_OUT, _button_out_cb, NULL); + evas_object_event_callback_add(button, EVAS_CALLBACK_MOUSE_IN, _button_in_cb, NULL); + evas_object_data_set(button, "pressed", (void *) false); + + return button; +} + + + +static void _remove_edit_button(Evas_Object *button) +{ + ret_if(NULL == button); + + edje_object_signal_callback_del(_EDJ(button), "edit_button,down", "menu", _edit_button_down_cb); + edje_object_signal_callback_del(_EDJ(button), "edit_button,up", "menu", _edit_button_up_cb); + evas_object_event_callback_del(button, EVAS_CALLBACK_MOUSE_OUT, _button_out_cb); + evas_object_event_callback_del(button, EVAS_CALLBACK_MOUSE_IN, _button_in_cb); + evas_object_data_del(button, "pressed"); + + layout_unload_edj(button); +} + static menu_screen_error_e _load_item(Evas_Object *scroller, app_list_item *item) @@ -80,6 +237,15 @@ ERROR: page_scroller_bring_in(scroller, 0); menu_screen_set_done(true); + do { + Evas_Object *button; + button = _add_edit_button(all_apps, scroller); + if (NULL == button) { + _D("cannot make the edit button"); + } + elm_object_part_content_set(all_apps, ALL_APPS_EDIT_BUTTON_PART, button); + } while (0); + return ECORE_CALLBACK_CANCEL; } @@ -102,7 +268,7 @@ static menu_screen_error_e _push_items(Evas_Object *all_apps) -Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) +HAPI Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) { Evas_Object *all_apps; Evas_Object *index; @@ -176,11 +342,23 @@ Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) -void all_apps_layout_destroy(Evas_Object *all_apps) +HAPI void all_apps_layout_destroy(Evas_Object *all_apps) { Evas_Object *index; Evas_Object *scroller; + ret_if(NULL == all_apps); + + do { + Evas_Object *button; + if(all_apps) { + button = elm_object_part_content_unset(all_apps, ALL_APPS_EDIT_BUTTON_PART); + _remove_edit_button(button); + } else { + _D("cannot find the all_apps object"); + } + } while (0); + index = evas_object_data_get(all_apps, "index"); scroller = evas_object_data_get(all_apps, "scroller"); diff --git a/src/all_apps/list.c b/src/all_apps/list.c index e3d2e6c..531bbbd 100644 --- a/src/all_apps/list.c +++ b/src/all_apps/list.c @@ -85,7 +85,7 @@ static int _all_apps_sort_cb(const void *d1, const void *d2) -app_list *all_apps_list_create(void) +HAPI app_list *all_apps_list_create(void) { int count = 0; app_list *list; @@ -123,7 +123,7 @@ app_list *all_apps_list_create(void) -void all_apps_list_destroy(app_list *list) +HAPI void all_apps_list_destroy(app_list *list) { app_list_item *item; diff --git a/src/index.c b/src/index.c index 81f536c..d840d3d 100644 --- a/src/index.c +++ b/src/index.c @@ -28,7 +28,7 @@ -inline void index_bring_in(Evas_Object *index, int idx) +HAPI inline void index_bring_in(Evas_Object *index, int idx) { Elm_Object_Item *idx_it; @@ -39,7 +39,7 @@ inline void index_bring_in(Evas_Object *index, int idx) -void index_destroy(Evas_Object *index) +HAPI void index_destroy(Evas_Object *index) { evas_object_data_del(index, "win"); evas_object_data_del(index, "layout"); @@ -52,7 +52,7 @@ void index_destroy(Evas_Object *index) -Evas_Object *index_create(Evas_Object *tab, unsigned int count) +HAPI Evas_Object *index_create(Evas_Object *tab, unsigned int count) { Evas_Object *index; Evas_Object *scroller; @@ -106,7 +106,7 @@ Evas_Object *index_create(Evas_Object *tab, unsigned int count) -Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count) +HAPI Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count) { index_destroy(index); @@ -115,14 +115,14 @@ Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int -void index_hide(Evas_Object *index) +HAPI void index_hide(Evas_Object *index) { edje_object_signal_emit(_EDJ(index), "hide", "index"); } -void index_show(Evas_Object *index) +HAPI void index_show(Evas_Object *index) { edje_object_signal_emit(_EDJ(index), "show", "index"); } diff --git a/src/item.c b/src/item.c index aeb1812..dd00558 100644 --- a/src/item.c +++ b/src/item.c @@ -22,6 +22,7 @@ #include #include "menu_screen.h" +#include "item_badge.h" #include "conf.h" #include "item.h" #include "item_event.h" @@ -29,6 +30,7 @@ #include "list.h" #include "mapbuf.h" #include "page.h" +#include "page_scroller.h" #include "popup.h" #include "util.h" @@ -88,7 +90,7 @@ static char *_space_to_new_line(const char *str) -void item_set_icon(Evas_Object *edje, char *icon, int sync) +HAPI void item_set_icon(Evas_Object *edje, char *icon, int sync) { char *tmp; int changed; @@ -114,7 +116,7 @@ void item_set_icon(Evas_Object *edje, char *icon, int sync) -inline char *item_get_icon(Evas_Object *edje) +HAPI inline char *item_get_icon(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_ICON); } @@ -122,7 +124,7 @@ inline char *item_get_icon(Evas_Object *edje) -void item_set_name(Evas_Object *edje, char *name, int sync) +HAPI void item_set_name(Evas_Object *edje, char *name, int sync) { char *tmp; int changed; @@ -168,14 +170,14 @@ void item_set_name(Evas_Object *edje, char *name, int sync) -inline char *item_get_name(Evas_Object *edje) +HAPI inline char *item_get_name(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_NAME); } -void item_set_desktop(Evas_Object *edje, char *name, int sync) +HAPI void item_set_desktop(Evas_Object *edje, char *name, int sync) { char *tmp; int changed; @@ -201,14 +203,14 @@ void item_set_desktop(Evas_Object *edje, char *name, int sync) -inline char *item_get_desktop(Evas_Object *edje) +HAPI inline char *item_get_desktop(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_DESKTOP); } -void item_set_package(Evas_Object *edje, char *package, int sync) +HAPI void item_set_package(Evas_Object *edje, char *package, int sync) { char *tmp; int changed; @@ -235,14 +237,14 @@ void item_set_package(Evas_Object *edje, char *package, int sync) -inline char *item_get_package(Evas_Object *edje) +HAPI inline char *item_get_package(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_PKG_NAME); } -void item_set_removable(Evas_Object *edje, int removable, int sync) +HAPI void item_set_removable(Evas_Object *edje, int removable, int sync) { int value; int changed; @@ -263,14 +265,14 @@ void item_set_removable(Evas_Object *edje, int removable, int sync) -inline int item_get_removable(Evas_Object *edje) +HAPI inline int item_get_removable(Evas_Object *edje) { return (int) evas_object_data_get(edje, STR_ATTRIBUTE_REMOVABLE); } -void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) +HAPI void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) { Evas_Object *value; int changed; @@ -291,7 +293,7 @@ void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) -inline Evas_Object *item_get_page(Evas_Object *edje) +HAPI inline Evas_Object *item_get_page(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_PAGE); } @@ -299,7 +301,7 @@ inline Evas_Object *item_get_page(Evas_Object *edje) -inline void item_enable_delete(Evas_Object *item) +HAPI inline void item_enable_delete(Evas_Object *item) { if (item_get_removable(item) > 0) { edje_object_signal_emit(_EDJ(item), "delete,on", "menu"); @@ -308,7 +310,7 @@ inline void item_enable_delete(Evas_Object *item) -inline void item_disable_delete(Evas_Object *item) +HAPI inline void item_disable_delete(Evas_Object *item) { if (item_get_removable(item) > 0) { edje_object_signal_emit(_EDJ(item), "delete,off", "menu"); @@ -316,7 +318,50 @@ inline void item_disable_delete(Evas_Object *item) } -void item_enable_progress(Evas_Object *obj) + +HAPI void item_show_badge(Evas_Object *obj, int value) +{ + char str[BUFSZE]; + Evas_Object *scroller; + + ret_if(NULL == obj); + ret_if(value <= 0); + + sprintf(str, "%d", value); + if (edje_object_part_text_set(_EDJ(obj), "badge,txt", str) == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:%s", _EDJ(obj), "badge,txt", str); + } + + scroller = evas_object_data_get(obj, "scroller"); + ret_if(NULL == scroller); + ret_if(page_scroller_is_edited(scroller)); + + edje_object_signal_emit(_EDJ(obj), "badge,on", "menu"); + evas_object_data_set(obj, "badge,enabled", (void*)1); + + _D("Badge is updated to %s", str); +} + + + +HAPI void item_hide_badge(Evas_Object *obj) +{ + ret_if(NULL == obj); + + edje_object_signal_emit(_EDJ(obj), "badge,off", "menu"); + evas_object_data_del(obj, "badge,enabled"); +} + + + +HAPI int item_is_enabled_badge(Evas_Object *obj) +{ + return evas_object_data_get(obj, "badge,enabled") != NULL; +} + + + +HAPI void item_enable_progress(Evas_Object *obj) { Evas_Object *progress; @@ -347,7 +392,7 @@ void item_enable_progress(Evas_Object *obj) -void item_update_progress(Evas_Object *obj, int value) +HAPI void item_update_progress(Evas_Object *obj, int value) { Evas_Object *progress; @@ -363,7 +408,7 @@ void item_update_progress(Evas_Object *obj, int value) -void item_disable_progress(Evas_Object *obj) +HAPI void item_disable_progress(Evas_Object *obj) { Evas_Object *progress; @@ -381,13 +426,40 @@ void item_disable_progress(Evas_Object *obj) -int item_is_enabled_progress(Evas_Object *obj) +HAPI int item_is_enabled_progress(Evas_Object *obj) { return evas_object_data_get(obj, "progress,enabled") != NULL; } +HAPI void item_edit(Evas_Object *item) +{ + if (item_get_removable(item)) { + edje_object_signal_emit(_EDJ(item), "uninstall,on", "menu"); + } + edje_object_signal_emit(_EDJ(item), "badge,off", "menu"); + item_unmark_dirty(item); +} + + + +HAPI void item_unedit(Evas_Object *item) +{ + char *package; + + edje_object_signal_emit(_EDJ(item), "uninstall,off", "menu"); + + package = item_get_package(item); + if (item_badge_is_registered(item) + && item_badge_count(package) > 0) + { + edje_object_signal_emit(_EDJ(item), "badge,on", "menu"); + } +} + + + static Evas_Object *_add_icon_image(Evas_Object *item, const char *icon_file) { Evas_Object *icon; @@ -430,7 +502,7 @@ static Evas_Object *_add_edje_icon(Evas_Object *item, const char *icon_file) -menu_screen_error_e item_is_edje_icon(const char *icon) +HAPI menu_screen_error_e item_is_edje_icon(const char *icon) { int len; const char *ext = "jde."; @@ -449,17 +521,30 @@ menu_screen_error_e item_is_edje_icon(const char *icon) -void item_update(Evas_Object *item, app_info_t *ai) +HAPI void item_update(Evas_Object *item, app_info_t *ai) { - Evas_Object *icon; + Evas_Object *icon = NULL; if (!ai->image) { - if (item_is_edje_icon(ai->icon) == MENU_SCREEN_ERROR_OK) { - icon = _add_edje_icon(item, ai->icon); - evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_EDJE); + if (0 != access(ai->icon, R_OK)) { + _E("Failed to access to [%s]", ai->icon); } else { - icon = _add_icon_image(item, ai->icon); - evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_OBJECT); + FILE *fp; + + fp = fopen(ai->icon, "rb"); + if (fp) { + fseek(fp, 0L, SEEK_END); + _D("Access to file [%s], size[%ld]", ai->icon, ftell(fp)); + fclose(fp); + } else _E("Cannot get the file pointer[%s]", ai->icon); + + if (item_is_edje_icon(ai->icon) == MENU_SCREEN_ERROR_OK) { + icon = _add_edje_icon(item, ai->icon); + evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_EDJE); + } else { + icon = _add_icon_image(item, ai->icon); + evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_OBJECT); + } } } else { icon = ai->image; @@ -483,11 +568,23 @@ void item_update(Evas_Object *item, app_info_t *ai) item_set_icon(item, ai->icon, 0); evas_object_data_set(item, STR_ATTRIBUTE_REMOVABLE, (void*) ai->x_slp_removable); evas_object_data_set(item, "pid", (void *) ai->pid); + + item_badge_register(item); + + do { + Evas_Object *scroller; + + scroller = evas_object_data_get(item, "scroller"); + break_if(NULL == scroller); + + if (false == page_scroller_is_edited(scroller)) break; + item_edit(item); + } while (0); } -Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) +HAPI Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) { Evas_Object *item; Evas_Object *bg; @@ -540,7 +637,7 @@ Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) -void item_destroy(Evas_Object *item) +HAPI void item_destroy(Evas_Object *item) { Evas_Object *icon; Evas_Object *bg; @@ -565,6 +662,9 @@ void item_destroy(Evas_Object *item) } } + if (item_badge_is_registered(item)) { + item_badge_unregister(item); + } item_event_unregister(item); item_set_package(item, NULL, 1); @@ -617,7 +717,7 @@ static Eina_Bool _unblock_cb(void *data) -void item_launch(Evas_Object *obj) +HAPI void item_launch(Evas_Object *obj) { char *package; char *name; @@ -661,7 +761,7 @@ void item_launch(Evas_Object *obj) -int item_get_position(Evas_Object *item) +HAPI int item_get_position(Evas_Object *item) { Evas_Object *scroller; Evas_Object *layout; @@ -716,21 +816,21 @@ int item_get_position(Evas_Object *item) -void item_mark_dirty(Evas_Object *item) +HAPI void item_mark_dirty(Evas_Object *item) { evas_object_data_set(item, "dirty", (void *) 1); } -void item_unmark_dirty(Evas_Object *item) +HAPI void item_unmark_dirty(Evas_Object *item) { evas_object_data_set(item, "dirty", (void *) 0); } -int item_is_dirty(Evas_Object *item) +HAPI int item_is_dirty(Evas_Object *item) { return (int) evas_object_data_get(item, "dirty"); } diff --git a/src/item_badge.c b/src/item_badge.c new file mode 100644 index 0000000..8762099 --- /dev/null +++ b/src/item_badge.c @@ -0,0 +1,180 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.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.tizenopensource.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 "menu_screen.h" +#include "conf.h" +#include "item.h" +#include "page_scroller.h" +#include "util.h" + + + +HAPI int item_badge_count(char *package) +{ + unsigned int is_display = 0; + unsigned int count = 0; + badge_error_e err = BADGE_ERROR_NONE; + + err = badge_get_display(package, &is_display); + if (BADGE_ERROR_NONE != err) _D("cannot get badge display"); + + if (0 == is_display) return 0; + + err = badge_get_count(package, &count); + if (BADGE_ERROR_NONE != err) _D("cannot get badge count"); + + _D("Badge for package %s : %u", package, count); + + return (int) count; +} + + + +static Eina_Bool _idler_cb(void *data) +{ + char *package; + int count; + Evas_Object *item = data; + + package = item_get_package(item); + if (!package) { + _D("Failed to get a package name"); + evas_object_data_del(item, "idle_timer"); + return ECORE_CALLBACK_CANCEL; + } + + count = item_badge_count(package); + if (count) item_show_badge(item, count); + else item_hide_badge(item); + + evas_object_data_del(item, "idle_timer"); + + return ECORE_CALLBACK_CANCEL; +} + + + +HAPI bool item_badge_is_registered(Evas_Object *item) +{ + const char *pkgname; + badge_error_e err; + bool existing = false; + + pkgname = item_get_package(item); + retv_if(NULL == pkgname, false); + + err = badge_is_existing(pkgname, &existing); + if (BADGE_ERROR_NONE != err) _E("cannot know whether the badge for %s is or not.", pkgname); + + return existing? true : false; +} + + + +HAPI menu_screen_error_e item_badge_register(Evas_Object *item) +{ + Ecore_Idler *idle_timer; + bool is_registered; + + is_registered = item_badge_is_registered(item); + if (false == is_registered) return MENU_SCREEN_ERROR_OK; + + idle_timer = ecore_idler_add(_idler_cb, item); + retv_if(NULL == idle_timer, MENU_SCREEN_ERROR_FAIL); + evas_object_data_set(item, "idle_timer", idle_timer); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI void item_badge_unregister(Evas_Object *item) +{ + char *package; + Ecore_Idler *idle_timer; + + package = item_get_package(item); + if (!package) return; + + idle_timer = evas_object_data_get(item, "idle_timer"); + if (idle_timer) { + _D("Badge handler for package %s is not yet ready", package); + evas_object_data_del(item, "idle_timer"); + ecore_idler_del(idle_timer); + return; + } + + item_hide_badge(item); +} + + + +static void _badge_change_cb(unsigned int action, const char *pkgname, unsigned int count, void *data) +{ + Evas_Object *scroller = data; + Evas_Object *item; + unsigned int is_display = 0; + badge_error_e err; + + _D("Badge changed, action : %u, pkgname : %s, count : %u", action, pkgname, count); + + ret_if(NULL == pkgname); + + if (BADGE_ACTION_REMOVE == action) { + count = 0; + is_display = false; + } else { + err = badge_get_display(pkgname, &is_display); + if (BADGE_ERROR_NONE != err) _D("cannot get badge display"); + if (0 == is_display) count = 0; + } + + item = page_scroller_find_item_by_package(scroller, pkgname, NULL); + if (NULL == item) return; + + if (count) item_show_badge(item, count); + else item_hide_badge(item); +} + + + +HAPI void item_badge_register_changed_cb(Evas_Object *scroller) +{ + badge_error_e err; + + err = badge_register_changed_cb(_badge_change_cb, scroller); + ret_if(BADGE_ERROR_NONE != err); +} + + + +HAPI void item_badge_unregister_changed_cb(void) +{ + badge_error_e err; + + err = badge_unregister_changed_cb(_badge_change_cb); + ret_if(BADGE_ERROR_NONE != err); +} + + + +// End of a file diff --git a/src/item_event.c b/src/item_event.c index 30fd27a..e5eec04 100644 --- a/src/item_event.c +++ b/src/item_event.c @@ -29,6 +29,8 @@ #include "mouse.h" #include "page.h" #include "page_scroller.h" +#include "pkgmgr.h" +#include "popup.h" #include "util.h" #include "all_apps/layout.h" @@ -70,6 +72,7 @@ static void _item_down_cb(void *data, Evas_Object *obj, const char* emission, co static void _item_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) { + Evas_Object *scroller; Evas_Object *icon_image; Evas_Object *item; @@ -91,12 +94,57 @@ static void _item_up_cb(void *data, Evas_Object *obj, const char* emission, cons if (mouse_is_scrolling()) return; + scroller = evas_object_data_get(item, "scroller"); + ret_if(NULL == scroller); + + if (true == page_scroller_is_edited(scroller)) { + return; + } item_launch(item); } -void item_event_register(Evas_Object *item) +static void _uninstall_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Uninstall button is down"); + obj = evas_object_data_get(obj, "evas_object"); + if (obj) evas_object_data_set(obj, "removing", (void*)1); +} + + + +static void _uninstall_up_cb(void *item, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *win; + Evas_Object *scroller; + char *package; + + ret_if(mouse_is_scrolling()); + + win = menu_screen_get_win(); + ret_if(NULL == win); + + _D("Uninstall button is up"); + scroller = evas_object_data_get(item, "scroller"); + obj = evas_object_data_get(obj, "evas_object"); + ret_if(NULL == obj); + ret_if(NULL == evas_object_data_get(obj, "removing")); + + evas_object_data_del(obj, "removing"); + + package = item_get_package(obj); + ret_if(!package || strlen(package) == 0); + ret_if(pkgmgr_find_pended_object(package, 0, scroller, NULL)); + + _D("Uninstalling... [%s]", package); + + popup_create_uninstall(win, item); +} + + + +HAPI void item_event_register(Evas_Object *item) { Evas_Object *item_edje; item_edje = _EDJ(item); @@ -104,11 +152,14 @@ void item_event_register(Evas_Object *item) edje_object_signal_callback_add(item_edje, "item,down", "menu", _item_down_cb, NULL); edje_object_signal_callback_add(item_edje, "item,up", "menu", _item_up_cb, NULL); + + edje_object_signal_callback_add(item_edje, "uninstall,down", "menu", _uninstall_down_cb, NULL); + edje_object_signal_callback_add(item_edje, "uninstall,up", "menu", _uninstall_up_cb, item); } -void item_event_unregister(Evas_Object *item) +HAPI void item_event_unregister(Evas_Object *item) { Evas_Object *item_edje; item_edje = _EDJ(item); @@ -116,6 +167,9 @@ void item_event_unregister(Evas_Object *item) edje_object_signal_callback_del(item_edje, "item,down", "menu", _item_down_cb); edje_object_signal_callback_del(item_edje, "item,up", "menu", _item_up_cb); + edje_object_signal_callback_del(item_edje, "uninstall,down", "menu", _uninstall_down_cb); + edje_object_signal_callback_del(item_edje, "uninstall,up", "menu", _uninstall_up_cb); + evas_object_data_del(item_edje, "item"); } diff --git a/src/layout.c b/src/layout.c index f28751b..43edf93 100644 --- a/src/layout.c +++ b/src/layout.c @@ -33,7 +33,7 @@ -Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate) +HAPI Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate) { Evas_Object *layout; @@ -77,7 +77,7 @@ Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char -void layout_destroy(Evas_Object *layout) +HAPI void layout_destroy(Evas_Object *layout) { Evas_Object *all_apps; @@ -94,7 +94,7 @@ void layout_destroy(Evas_Object *layout) -void layout_enable_block(Evas_Object *layout) +HAPI void layout_enable_block(Evas_Object *layout) { ret_if(NULL == layout); @@ -104,7 +104,7 @@ void layout_enable_block(Evas_Object *layout) -void layout_disable_block(Evas_Object *layout) +HAPI void layout_disable_block(Evas_Object *layout) { ret_if(NULL == layout); @@ -114,7 +114,7 @@ void layout_disable_block(Evas_Object *layout) -Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname) +HAPI Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname) { Evas_Object *eo; @@ -132,7 +132,7 @@ Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const cha -void layout_unload_edj(Evas_Object *layout) +HAPI void layout_unload_edj(Evas_Object *layout) { Evas_Object *evas_object; diff --git a/src/list.c b/src/list.c index 48c9a08..af4b054 100644 --- a/src/list.c +++ b/src/list.c @@ -27,7 +27,7 @@ -menu_screen_error_e list_count(app_list *list, int *count) +HAPI menu_screen_error_e list_count(app_list *list, int *count) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -40,7 +40,7 @@ menu_screen_error_e list_count(app_list *list, int *count) -menu_screen_error_e list_first(app_list *list) +HAPI menu_screen_error_e list_first(app_list *list) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -51,7 +51,7 @@ menu_screen_error_e list_first(app_list *list) -menu_screen_error_e list_next(app_list *list) +HAPI menu_screen_error_e list_next(app_list *list) { int count; @@ -68,7 +68,7 @@ menu_screen_error_e list_next(app_list *list) -menu_screen_error_e list_is_ended(app_list *list, bool *flag) +HAPI menu_screen_error_e list_is_ended(app_list *list, bool *flag) { int count; @@ -83,7 +83,7 @@ menu_screen_error_e list_is_ended(app_list *list, bool *flag) -menu_screen_error_e list_get_item(app_list *list, app_list_item **item) +HAPI menu_screen_error_e list_get_item(app_list *list, app_list_item **item) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -96,7 +96,7 @@ menu_screen_error_e list_get_item(app_list *list, app_list_item **item) -menu_screen_error_e list_get_values(const char *package, app_info_t *ai) +HAPI menu_screen_error_e list_get_values(const char *package, app_info_t *ai) { ail_appinfo_h appinfo_h; char *exec; @@ -139,20 +139,35 @@ menu_screen_error_e list_get_values(const char *package, app_info_t *ai) -void list_free_values(app_info_t *ai) +HAPI void list_free_values(app_info_t *ai) { ret_if(NULL == ai); /* Origin field */ - if (ai->package) free(ai->package); - if (ai->exec) free(ai->exec); - if (ai->name) free(ai->name); - if (ai->icon) free(ai->icon); + if (ai->package) { + free(ai->package); + ai->package = NULL; + } + + if (ai->exec) { + free(ai->exec); + ai->exec = NULL; + } + + if (ai->name) { + free(ai->name); + ai->name = NULL; + } + + if (ai->icon) { + free(ai->icon); + ai->icon = NULL; + } } -menu_screen_error_e list_append_item(app_list *list, app_list_item *item) +HAPI menu_screen_error_e list_append_item(app_list *list, app_list_item *item) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -165,7 +180,7 @@ menu_screen_error_e list_append_item(app_list *list, app_list_item *item) -menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) +HAPI menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -178,7 +193,7 @@ menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) -menu_screen_error_e list_sort(app_list *list, int (*_sort_cb)(const void *d1, const void *d2)) +HAPI menu_screen_error_e list_sort(app_list *list, int (*_sort_cb)(const void *d1, const void *d2)) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); diff --git a/src/mapbuf.c b/src/mapbuf.c index 098b12b..b807395 100644 --- a/src/mapbuf.c +++ b/src/mapbuf.c @@ -26,7 +26,7 @@ -Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) +HAPI Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) { Evas_Object *mapbuf; @@ -42,7 +42,7 @@ Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) -Evas_Object *mapbuf_get_page(Evas_Object *obj) +HAPI Evas_Object *mapbuf_get_page(Evas_Object *obj) { Evas_Object *page; @@ -58,13 +58,11 @@ Evas_Object *mapbuf_get_page(Evas_Object *obj) -menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) +HAPI menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) { Evas_Object *mapbuf; int cnt; - _D("Mapbuf disabled version"); - mapbuf = mapbuf_get_mapbuf(obj); if (!mapbuf) { _D("Failed to get the mapbuf object"); @@ -96,7 +94,7 @@ menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) -int mapbuf_is_enabled(Evas_Object *obj) +HAPI int mapbuf_is_enabled(Evas_Object *obj) { Evas_Object *mapbuf; mapbuf = mapbuf_get_mapbuf(obj); @@ -109,7 +107,7 @@ int mapbuf_is_enabled(Evas_Object *obj) -int mapbuf_disable(Evas_Object *obj, int force) +HAPI int mapbuf_disable(Evas_Object *obj, int force) { Evas_Object *mapbuf; int cnt; @@ -143,7 +141,7 @@ int mapbuf_disable(Evas_Object *obj, int force) -Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) +HAPI Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) { Evas_Object *mapbuf; @@ -167,7 +165,7 @@ Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) -Evas_Object *mapbuf_unbind(Evas_Object *obj) +HAPI Evas_Object *mapbuf_unbind(Evas_Object *obj) { Evas_Object *page; Evas_Object *mapbuf; diff --git a/src/menu_screen.c b/src/menu_screen.c index 0ce4d1b..8f4f5b4 100644 --- a/src/menu_screen.c +++ b/src/menu_screen.c @@ -64,49 +64,49 @@ static struct { -Evas *menu_screen_get_evas(void) +HAPI Evas *menu_screen_get_evas(void) { return menu_screen_info.evas; } -int menu_screen_get_root_width(void) +HAPI int menu_screen_get_root_width(void) { return menu_screen_info.root_width; } -int menu_screen_get_root_height(void) +HAPI int menu_screen_get_root_height(void) { return menu_screen_info.root_height; } -Evas_Object *menu_screen_get_win(void) +HAPI Evas_Object *menu_screen_get_win(void) { return menu_screen_info.win; } -Elm_Theme *menu_screen_get_theme(void) +HAPI Elm_Theme *menu_screen_get_theme(void) { return menu_screen_info.theme; } -bool menu_screen_get_done(void) +HAPI bool menu_screen_get_done(void) { return menu_screen_info.is_done; } -void menu_screen_set_done(bool is_done) +HAPI void menu_screen_set_done(bool is_done) { menu_screen_info.is_done = is_done; } @@ -299,7 +299,7 @@ static void _fini_theme(void) -Evas_Object *_create_conformant(Evas_Object *win) +static Evas_Object *_create_conformant(Evas_Object *win) { Evas_Object *conformant; @@ -319,7 +319,7 @@ Evas_Object *_create_conformant(Evas_Object *win) -void _destroy_conformant(Evas_Object *conformant) +static void _destroy_conformant(Evas_Object *conformant) { evas_object_data_del(conformant, "win"); evas_object_del(conformant); diff --git a/src/mouse.c b/src/mouse.c index 078323f..f6cf446 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -68,7 +68,7 @@ static struct { -bool mouse_is_scrolling(void) +HAPI bool mouse_is_scrolling(void) { bool scroll_x = false; bool scroll_y = false; @@ -141,7 +141,7 @@ static Eina_Bool _move_cb(void *data, int type, void *event) -void mouse_register(void) +HAPI void mouse_register(void) { mouse_info.mouse_down = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _down_cb, NULL); if (!mouse_info.mouse_down) { @@ -168,7 +168,7 @@ void mouse_register(void) -void mouse_unregister(void) +HAPI void mouse_unregister(void) { if (mouse_info.mouse_down) { ecore_event_handler_del(mouse_info.mouse_down); diff --git a/src/page.c b/src/page.c index 0492364..6da6598 100644 --- a/src/page.c +++ b/src/page.c @@ -34,7 +34,7 @@ -inline void page_mark_dirty(Evas_Object *page) +HAPI inline void page_mark_dirty(Evas_Object *page) { int value; value = (int) evas_object_data_get(page, "dirty"); @@ -43,7 +43,7 @@ inline void page_mark_dirty(Evas_Object *page) -inline void page_unmark_dirty(Evas_Object *page) +HAPI inline void page_unmark_dirty(Evas_Object *page) { int value; value = (int) evas_object_data_get(page, "dirty"); @@ -54,14 +54,14 @@ inline void page_unmark_dirty(Evas_Object *page) -inline void page_clean_dirty(Evas_Object *page) +HAPI inline void page_clean_dirty(Evas_Object *page) { evas_object_data_set(page, "dirty", 0); } -inline int page_is_dirty(Evas_Object *page) +HAPI inline int page_is_dirty(Evas_Object *page) { return (int) evas_object_data_get(page, "dirty"); } @@ -137,7 +137,7 @@ static void _dim_up_cb(void *data, Evas_Object *obj, const char* emission, const -Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) +HAPI Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) { Evas_Object *page; Evas_Object *bg; @@ -218,7 +218,7 @@ Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) -void page_destroy(Evas_Object *scroller, Evas_Object *page) +HAPI void page_destroy(Evas_Object *scroller, Evas_Object *page) { Evas_Object *mapbuf; Evas_Object *bg; @@ -279,7 +279,7 @@ void page_destroy(Evas_Object *scroller, Evas_Object *page) -Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) +HAPI Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) { Eina_List *pending_list; Eina_List *n; @@ -305,7 +305,7 @@ Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) -menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) +HAPI menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) { char tmp[PATH_MAX]; Evas_Object *check_item; @@ -347,7 +347,7 @@ menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) -Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) +HAPI Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) { Eina_List *pending_list; Eina_List *n; @@ -390,7 +390,7 @@ Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) -void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) +HAPI void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) { char tmp[PATH_MAX]; Evas_Object *object; @@ -426,7 +426,7 @@ void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) -void page_set_item(Evas_Object *page, int idx, Evas_Object *item) +HAPI void page_set_item(Evas_Object *page, int idx, Evas_Object *item) { Eina_List *list; @@ -448,7 +448,7 @@ void page_set_item(Evas_Object *page, int idx, Evas_Object *item) -inline unsigned int page_count_item(Evas_Object *page) +HAPI inline unsigned int page_count_item(Evas_Object *page) { register unsigned int i; unsigned int count = 0; @@ -466,7 +466,7 @@ inline unsigned int page_count_item(Evas_Object *page) -int page_find_empty_near(Evas_Object *page, int pivot) +HAPI int page_find_empty_near(Evas_Object *page, int pivot) { int pivot_saved = pivot; Evas_Object *obj; @@ -503,7 +503,7 @@ int page_find_empty_near(Evas_Object *page, int pivot) -int page_find_first_empty(Evas_Object *page, int pivot) +HAPI int page_find_first_empty(Evas_Object *page, int pivot) { Evas_Object *item; Evas_Object *scroller; @@ -525,7 +525,7 @@ int page_find_first_empty(Evas_Object *page, int pivot) -void page_trim_items(Evas_Object *page) +HAPI void page_trim_items(Evas_Object *page) { Evas_Object *item; register unsigned int i; diff --git a/src/page_scroller.c b/src/page_scroller.c index 20b7116..5d611d2 100644 --- a/src/page_scroller.c +++ b/src/page_scroller.c @@ -19,6 +19,7 @@ #include #include +#include "item_badge.h" #include "conf.h" #include "index.h" #include "item.h" @@ -52,7 +53,7 @@ static int _count_pages(Evas_Object *scroller) -void page_scroller_bring_in(Evas_Object *scroller, int idx) +HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx) { Evas_Object *index; int w, h; @@ -74,7 +75,7 @@ void page_scroller_bring_in(Evas_Object *scroller, int idx) -void page_scroller_show_region(Evas_Object *scroller, int idx) +HAPI void page_scroller_show_region(Evas_Object *scroller, int idx) { Evas_Object *index; int w, h; @@ -192,7 +193,7 @@ static void _scroller_unregister(Evas_Object *scroller) -menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +static menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) { Evas_Object *page; Evas_Object *item; @@ -234,7 +235,7 @@ menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candid -menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +static menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) { Evas_Object *page; Evas_Object *item; @@ -393,7 +394,7 @@ static Evas_Object *_animated_unpack_item(Evas_Object *scroller, Evas_Object *pa -menu_screen_error_e page_scroller_push_item(Evas_Object *scroller, app_info_t *ai) +HAPI menu_screen_error_e page_scroller_push_item(Evas_Object *scroller, app_info_t *ai) { Evas_Object *page; Evas_Object *item; @@ -736,7 +737,7 @@ static void _mapbuf_cb(keynode_t *node, void *data) -void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Wheel *ei = event_info; Evas_Object *scroller = data; @@ -761,7 +762,7 @@ void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate) +HAPI Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate) { Evas_Object *box; Evas_Object *scroller; @@ -832,13 +833,14 @@ Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scr } pkgmgr_init(scroller); + item_badge_register_changed_cb(scroller); return scroller; } -void page_scroller_destroy(Evas_Object *scroller) +HAPI void page_scroller_destroy(Evas_Object *scroller) { Evas_Object *box; Evas_Object *page; @@ -852,6 +854,7 @@ void page_scroller_destroy(Evas_Object *scroller) ret_if(NULL == (box = evas_object_data_get(scroller, "box"))); ret_if(NULL == (page_list = elm_box_children_get(box))); + item_badge_unregister_changed_cb(); pkgmgr_fini(); EINA_LIST_FOREACH_SAFE(page_list, l, ln, page) { @@ -914,7 +917,7 @@ void page_scroller_destroy(Evas_Object *scroller) -void page_scroller_clean(Evas_Object *scroller) +HAPI void page_scroller_clean(Evas_Object *scroller) { Evas_Object *page; Evas_Object *item; @@ -947,7 +950,7 @@ void page_scroller_clean(Evas_Object *scroller) -Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) +HAPI Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) { const Eina_List *page_list; Evas_Object *item; @@ -971,7 +974,7 @@ Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) -unsigned int page_scroller_count_page(Evas_Object *scroller) +HAPI unsigned int page_scroller_count_page(Evas_Object *scroller) { const Eina_List *page_list; Evas_Object *box; @@ -987,7 +990,7 @@ unsigned int page_scroller_count_page(Evas_Object *scroller) -int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) +HAPI int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) { Evas_Object *item; Evas_Object *box; @@ -1018,7 +1021,7 @@ int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) -Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no) +HAPI Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no) { register int i; register int j; @@ -1059,7 +1062,7 @@ Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const cha -void page_scroller_trim_items(Evas_Object *scroller) +HAPI void page_scroller_trim_items(Evas_Object *scroller) { register unsigned int i; register unsigned int j; @@ -1130,4 +1133,83 @@ void page_scroller_trim_items(Evas_Object *scroller) } + +HAPI void page_scroller_edit(Evas_Object *scroller) +{ + Evas_Object *page; + Evas_Object *item; + register unsigned int page_no; + register unsigned int position_no; + unsigned int nr_of_pages; + int page_max_app; + + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (page_no = 0; page_no < nr_of_pages; page_no ++) { + page = page_scroller_get_page_at(scroller, page_no); + ret_if(NULL == page); + + for (position_no = 0; position_no < page_max_app; position_no ++) { + item = page_get_item_at(page, position_no); + if (!item) { + continue; + } + + item_edit(item); + } + } + evas_object_data_set(scroller, "is_edited", (void *) true); +} + + + +HAPI void page_scroller_unedit(Evas_Object *scroller) +{ + Evas_Object *all_apps; + Evas_Object *page; + Evas_Object *item; + register int page_no; + register unsigned int position_no; + unsigned int nr_of_pages; + int page_max_app; + + ret_if(NULL == scroller); + + all_apps = evas_object_data_get(scroller, "tab"); + ret_if(NULL == all_apps); + + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + + for (page_no = nr_of_pages - 1; page_no >= 0; page_no --) { + int count; + + page = page_scroller_get_page_at(scroller, page_no); + if (NULL == page) break; + count = page_count_item(page); + + page_trim_items(page); + + for (position_no = 0; position_no < page_max_app; position_no ++) { + item = page_get_item_at(page, position_no); + if (!item) { + break; + } + + item_unedit(item); + } + } + + evas_object_data_set(scroller, "is_edited", (void *) false); +} + + + +HAPI bool page_scroller_is_edited(Evas_Object *scroller) +{ + return (bool) evas_object_data_get(scroller, "is_edited"); +} + + + // End of a file diff --git a/src/pkgmgr.c b/src/pkgmgr.c index a0fb33a..c4182c7 100644 --- a/src/pkgmgr.c +++ b/src/pkgmgr.c @@ -46,7 +46,7 @@ static struct { -inline menu_screen_error_e pkgmgr_uninstall(Evas_Object *item) +HAPI inline menu_screen_error_e pkgmgr_uninstall(Evas_Object *item) { pkgmgr_client *req_pc = NULL; int ret = MENU_SCREEN_ERROR_OK; @@ -162,7 +162,7 @@ static menu_screen_error_e _start_update(const char *package, void *scroller) install_list = eina_list_append(install_list, pi); evas_object_data_set(scroller, "install_list", install_list); } else { - if (pi->status != DOWNLOAD_END) { + if (pi->status != DOWNLOAD_END && pi->status != INSTALL_END) { _D("Package [%s] is in invalid state (%d), cancel this", package, pi->status); install_list = eina_list_remove(install_list, pi); evas_object_data_set(scroller, "install_list", install_list); @@ -220,10 +220,24 @@ static menu_screen_error_e _start_install(const char *package, void *scroller) retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); pi->ai.package = strdup(package); + if (!pi->ai.package) { + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + + pi->ai.icon = strdup(DEFAULT_ICON); + if (!pi->ai.icon) { + free(pi->ai.package); + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); - if (pi->item) { - pi->page = page_scroller_get_page_at(scroller, page_no); + if (!pi->item) { + if (MENU_SCREEN_ERROR_FAIL == page_scroller_push_item(scroller, &pi->ai)) _E("Cannot push an item"); } + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); + pi->page = page_scroller_get_page_at(scroller, page_no); if (pi->item && pi->page) { pi->ai.nodisplay = false; @@ -232,7 +246,7 @@ static menu_screen_error_e _start_install(const char *package, void *scroller) install_list = eina_list_append(install_list, pi); evas_object_data_set(scroller, "install_list", install_list); } else { - if (pi->status != DOWNLOAD_END) { + if (pi->status != DOWNLOAD_END && pi->status != INSTALL_END) { _D("Package [%s] is in invalid state (%d), cancel this", package, pi->status); install_list = eina_list_remove(install_list, pi); evas_object_data_set(scroller, "install_list", install_list); @@ -336,6 +350,7 @@ static menu_screen_error_e _icon_path(const char *package, const char *val, void retv_if (NULL == pi->ai.icon, MENU_SCREEN_ERROR_OUT_OF_MEMORY); if (!pi->item) { + _D("There is no item for [%s]", package); pi->ai.nodisplay = false; if (MENU_SCREEN_ERROR_FAIL == page_scroller_push_item(scroller, &pi->ai)) { @@ -346,6 +361,7 @@ static menu_screen_error_e _icon_path(const char *package, const char *val, void free(pi); } } else { + _D("There is an item for [%s:%p]", package, pi->item); item_update(pi->item, &pi->ai); } } @@ -562,8 +578,7 @@ static menu_screen_error_e _end_unknown(const char *package, struct package_info // Remove an item only if it is installing. if ( pi->status == INSTALL_BEGIN || pi->status == INSTALLING || pi->status == INSTALL_END || - pi->status == DOWNLOAD_BEGIN || pi->status == DOWNLOADING || pi->status == DOWNLOAD_END || - pi->status == UPDATE_BEGIN || pi->status == UPDATING || pi->status == UPDATE_END + pi->status == DOWNLOAD_BEGIN || pi->status == DOWNLOADING || pi->status == DOWNLOAD_END ) { if (pi->page) { @@ -635,6 +650,10 @@ static menu_screen_error_e _end(const char *package, const char *val, void *scro retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + list_free_values(&pi->ai); + if (MENU_SCREEN_ERROR_OK != list_get_values(package, &pi->ai)) _E("Cannot get values"); + item_update(pi->item, &pi->ai); + if (item_is_enabled_progress(pi->item)) { item_disable_progress(pi->item); } @@ -732,7 +751,7 @@ static menu_screen_error_e _pkgmgr_cb(int req_id, const char *pkg_type, const ch -menu_screen_error_e pkgmgr_init(Evas_Object *scroller) +HAPI menu_screen_error_e pkgmgr_init(Evas_Object *scroller) { if (NULL != pkg_mgr_info.listen_pc) { return MENU_SCREEN_ERROR_OK; @@ -748,7 +767,7 @@ menu_screen_error_e pkgmgr_init(Evas_Object *scroller) -void pkgmgr_fini(void) +HAPI void pkgmgr_fini(void) { ret_if(NULL == pkg_mgr_info.listen_pc); if (pkgmgr_client_free(pkg_mgr_info.listen_pc) != PKGMGR_R_OK) { @@ -759,7 +778,7 @@ void pkgmgr_fini(void) -Evas_Object *pkgmgr_find_pended_object(const char *package, int with_desktop_file, Evas_Object *scroller, Evas_Object **page) +HAPI Evas_Object *pkgmgr_find_pended_object(const char *package, int with_desktop_file, Evas_Object *scroller, Evas_Object **page) { Eina_List *l; Eina_List *tmp; diff --git a/src/popup.c b/src/popup.c index c83e305..af27631 100644 --- a/src/popup.c +++ b/src/popup.c @@ -39,7 +39,7 @@ static void _response_cb(void *data, Evas_Object *obj, void *event_info) -Evas_Object *popup_create(Evas_Object *parent, const char *warning) +HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning) { Evas_Object *popup; Evas_Object *btn; @@ -70,5 +70,83 @@ Evas_Object *popup_create(Evas_Object *parent, const char *warning) } +static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *popup; + Evas_Object *item; + + ret_if(NULL == data); + + popup = data; + item = evas_object_data_del(popup, "item"); + + evas_object_del(evas_object_data_del(popup, "button1")); + evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_del(popup); + + if (MENU_SCREEN_ERROR_OK != pkgmgr_uninstall(item)) { + _E("Cannot communicate with the pkgmgr-server."); + } +} + + + +static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *popup; + + ret_if(NULL == data); + popup = data; + evas_object_del(evas_object_data_del(popup, "button1")); + evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_data_del(popup, "item"); + evas_object_del(popup); +} + + + +HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) +{ + Evas_Object *popup; + Evas_Object *btn1; + Evas_Object *btn2; + char warning[BUFSZE]; + + retv_if(NULL == warning, NULL); + + popup = elm_popup_add(parent); + retv_if(NULL == popup, NULL); + + evas_object_data_set(popup, "item", item); + + btn1 = elm_button_add(popup); + if (NULL == btn1) { + evas_object_del(popup); + return NULL; + } + elm_object_text_set(btn1, D_("IDS_COM_SK_YES")); + evas_object_data_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _uninstall_yes_cb, popup); + + btn2 = elm_button_add(popup); + if (NULL == btn2) { + evas_object_del(popup); + return NULL; + } + elm_object_text_set(btn2, D_("IDS_COM_SK_NO")); + evas_object_data_set(popup, "button2", btn2); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _uninstall_no_cb, popup); + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(warning, sizeof(warning), _("Uninstall %s?"), item_get_name(item)); + elm_object_text_set(popup, warning); + evas_object_show(popup); + + return popup; +} + + // End of a file diff --git a/src/util.c b/src/util.c index 7ec1f36..281b53c 100644 --- a/src/util.c +++ b/src/util.c @@ -22,7 +22,7 @@ -void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y; @@ -35,14 +35,14 @@ void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_i -void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { _D("%s IS REMOVED!", (const char *) data); } -void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y; @@ -55,7 +55,7 @@ void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *eve -void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y;