app_icon: Do not show checkbox on folder icon 75/65475/2
authorKamil Lipiszko <k.lipiszko@samsung.com>
Mon, 11 Apr 2016 08:31:27 +0000 (10:31 +0200)
committerKamil Lipiszko <k.lipiszko@samsung.com>
Mon, 11 Apr 2016 12:28:12 +0000 (14:28 +0200)
On all apps choose view do not show folder checkbox. It is shown
now only after at least one of the icons inside the folder is checked.

Change-Id: Ia792c21d09dbc1d78838cb78d5400c30acdae331

inc/conf.h
inc/folder_panel.h
res/edje/icon.edc
src/app_icon.c
src/folder_panel.c

index 9e1c758..2efe836 100644 (file)
 #define SIGNAL_UNINSTALL_BUTTON_CLICKED "uninstall_button,clicked"
 #define SIGNAL_CHECKBOX_SHOW_UNCHECKED "checkbox,show,unchecked"
 #define SIGNAL_CHECKBOX_SHOW_CHECKED "checkbox,show,checked"
+#define SIGNAL_CHECKBOX_SHOW_DIMMED "checkbox,show,dimmed"
 #define SIGNAL_CHECKBOX_HIDE "checkbox,hide"
 #define SIGNAL_CHECKBOX_CHECKED "checkbox,checked"
 #define SIGNAL_CHECKBOX_UNCHECKED "checkbox,unchecked"
index 8d7a3fc..ab8450a 100644 (file)
@@ -28,6 +28,12 @@ typedef struct {
        Evas_Object *folder_scroller;
 } folder_data_t;
 
+typedef enum {
+       FOLDER_PANEL_CHECKED_NONE = 0,
+       FOLDER_PANEL_CHECKED_ANY,
+       FOLDER_PANEL_CHECKED_ALL,
+} folder_checked_t;
+
 /**
  * @brief Initializes folder module
  */
@@ -91,7 +97,7 @@ extern bool folder_panel_is_folder_visible(void);
 /**
  * @brief Shows checkboxes on the folder icon.
  */
-extern bool folder_panel_set_content_checked(Tree_node_t *node);
+extern folder_checked_t folder_panel_set_content_checked(Tree_node_t *node);
 
 /**
  * @brief Function returns pointer to data node of the opened folder
index 85653e2..27e155c 100644 (file)
@@ -275,6 +275,10 @@ collections {
                                        visible: 1;
                                }
                                description {
+                                       state: "dimmed" 0.0;
+                                       inherit: "blank" 0.0;
+                               }
+                               description {
                                        state: "checked" 0.0;
                                        inherit: "default" 0.0;
                                        //color_class: "ATO005";
@@ -306,6 +310,10 @@ collections {
                                        visible: 1;
                                }
                                description {
+                                       state: "dimmed" 0.0;
+                                       inherit: "blank" 0.0;
+                               }
+                               description {
                                        state: "checked" 0.0;
                                        inherit: "default" 0.0;
                                        color: 255 255 255 120;
@@ -341,6 +349,10 @@ collections {
                                        color: 255 255 255 255;
                                        visible: 1;
                                }
+                               description {
+                                       state: "dimmed" 0.0;
+                                       inherit: "checked" 0.0;
+                               }
                        }
 
                        part { //checkbox_click_area
@@ -491,6 +503,16 @@ collections {
                                after: "checkbox_area_visible";
                        }
                        program {
+                               name: "checkbox_show_dimmed";
+                               signal: SIGNAL_CHECKBOX_SHOW_DIMMED;
+                               source: SIGNAL_SOURCE;
+                               script {
+                                       set_int(checkbox_state, 1);
+                                       emit("checkbox,dimmed,show", SIGNAL_SOURCE);
+                               }
+                               after: "checkbox_area_visible";
+                       }
+                       program {
                                name: "checkbox_blank_show";
                                signal: "checkbox,blank,show";
                                source: SIGNAL_SOURCE;
@@ -521,6 +543,16 @@ collections {
                                transition: DECELERATE 0.20;
                        }
                        program {
+                               name: "checkbox_dimmed_show";
+                               signal: "checkbox,dimmed,show";
+                               source: SIGNAL_SOURCE;
+                               action: STATE_SET "dimmed" 0.0;
+                               target: "icon_checkbox";
+                               target: "icon_checkbox_border";
+                               target: "icon_checkbox_bg";
+                               transition: DECELERATE 0.20;
+                       }
+                       program {
                                name: "checkbox_clicked";
                                signal: "mouse,clicked,1";
                                source: "checkbox_click_area";
index a35c840..2c3bb41 100644 (file)
@@ -279,6 +279,8 @@ HAPI void app_icon_set_click_ignore(bool ignore)
 
 HAPI bool app_icon_set_view_mode(Evas_Object *icon, homescreen_view_t view, bool in_folder)
 {
+       Tree_node_t *node = NULL;
+
        switch (view) {
        case HOMESCREEN_VIEW_ALL_APPS:
                in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_OFF, SIGNAL_SOURCE) :
@@ -298,7 +300,13 @@ HAPI bool app_icon_set_view_mode(Evas_Object *icon, homescreen_view_t view, bool
                in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE) :
                                elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
                elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_HIDE, SIGNAL_SOURCE);
-               elm_object_signal_emit(icon, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE);
+
+               node = evas_object_data_get(icon, KEY_ICON_DATA);
+               if (node && node->data->type != APP_ITEM_FOLDER)
+                       elm_object_signal_emit(icon, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE);
+               else
+                       elm_object_signal_emit(icon, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
+
                app_icon_set_click_ignore(true);
                break;
        case HOMESCREEN_VIEW_HOME:
@@ -514,6 +522,7 @@ static bool __app_icon_check_removeable_state(Evas_Object *icon)
 
 static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
+       folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE;
        Tree_node_t *node = (Tree_node_t *)data;
        app_item_t *item = node->data;
        int count = -1;
@@ -521,8 +530,22 @@ static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emissi
 
        if (item->type == APP_ITEM_ICON) {
                item->is_checked = true;
-               if (node->parent->parent->data->type == APP_ITEM_FOLDER && folder_panel_set_content_checked(node->parent->parent))
-                       elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE);
+               if (node->parent->parent->data->type == APP_ITEM_FOLDER) {
+
+                       check_info = folder_panel_set_content_checked(node->parent->parent);
+
+                       switch (check_info) {
+                       case FOLDER_PANEL_CHECKED_NONE:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
+                               break;
+                       case FOLDER_PANEL_CHECKED_ANY:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE);
+                               break;
+                       case FOLDER_PANEL_CHECKED_ALL:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE);
+                               break;
+                       }
+               }
        } else if (item->type == APP_ITEM_FOLDER) {
                data_model_check_all_apps(node, true);
        }
@@ -556,14 +579,32 @@ static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emissi
 
 static void __app_icon_uncheck_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
+       folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE;
+
        Tree_node_t *node = (Tree_node_t *)data;
        app_item_t *item = node->data;
        if (item->type == APP_ITEM_ICON) {
                item->is_checked = false;
-               if (node->parent->parent->data->type == APP_ITEM_FOLDER && !folder_panel_set_content_checked(node->parent->parent))
-                       elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE);
+
+               if (node->parent->parent->data->type == APP_ITEM_FOLDER) {
+
+                       check_info = folder_panel_set_content_checked(node->parent->parent);
+
+                       switch (check_info) {
+                       case FOLDER_PANEL_CHECKED_NONE:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
+                               break;
+                       case FOLDER_PANEL_CHECKED_ANY:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE);
+                               break;
+                       case FOLDER_PANEL_CHECKED_ALL:
+                               elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE);
+                               break;
+                       }
+               }
        } else if (item->type == APP_ITEM_FOLDER) {
                data_model_check_all_apps(node, false);
+               elm_object_signal_emit(item->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
        }
        option_menu_update_on_item_selected();
 }
index 25251f3..40bd9af 100644 (file)
@@ -55,6 +55,10 @@ static struct
        .opened_folder_entrychange_cb_ignore = true
 };
 
+typedef struct {
+       bool all_checked;
+       bool any_checked;
+} check_info_s;
 
 static void __folder_panel_create_folder_window_layout_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void __folder_window_destroy_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
@@ -202,11 +206,28 @@ HAPI bool folder_panel_is_folder_visible(void)
        return s_info.is_opened;
 }
 
-HAPI bool folder_panel_set_content_checked(Tree_node_t *node)
+HAPI folder_checked_t folder_panel_set_content_checked(Tree_node_t *node)
 {
-       bool all_checked = true;
-       tree_in_depth_browse(node, __folder_panel_get_checked_icons, &all_checked);
-       return all_checked;
+       LOGD("");
+       check_info_s check_info = {
+               .all_checked = true,
+               .any_checked = false
+       };
+
+       tree_in_depth_browse(node, __folder_panel_get_checked_icons, &check_info);
+
+       if (check_info.all_checked) {
+               LOGD("All items checked");
+               return FOLDER_PANEL_CHECKED_ALL;
+       }
+       else if (check_info.any_checked) {
+               LOGD("Any item checked");
+               return FOLDER_PANEL_CHECKED_ANY;
+       }
+       else {
+               LOGD("None items checked");
+               return FOLDER_PANEL_CHECKED_NONE;
+       }
 }
 
 HAPI Tree_node_t *folder_panel_get_opened_folder_node(void)
@@ -545,10 +566,13 @@ static bool __folder_panel_show_checkbox(Tree_node_t *parent, Tree_node_t *leaf,
 
 static bool __folder_panel_get_checked_icons(Tree_node_t *parent, Tree_node_t *leaf, void *data)
 {
-       if (leaf->data->type == APP_ITEM_ICON && !leaf->data->is_checked) {
-               *(bool *)data = false;
-               return false;
+       check_info_s *check_info = data;
+
+       if (leaf->data->type == APP_ITEM_ICON) {
+               check_info->all_checked = check_info->all_checked && leaf->data->is_checked;
+               check_info->any_checked = check_info->any_checked || leaf->data->is_checked;
        }
+
        return true;
 }