Tab menu items 'selected' state implementation 15/61515/1
authorRadek Kintop <r.kintop@samsung.com>
Tue, 8 Mar 2016 10:14:16 +0000 (11:14 +0100)
committerRadek Kintop <r.kintop@samsung.com>
Tue, 8 Mar 2016 10:14:16 +0000 (11:14 +0100)
Change-Id: I59bb1baaef06832984b2081b2c9640adbc0acf3b
Signed-off-by: Radek Kintop <r.kintop@samsung.com>
14 files changed:
include/common/listmgr.h
include/common/menumgr.h
include/common/viewmgr.h
include/define.h
res/widget/button.edc
src/common/listmgr.c
src/common/menumgr.c
src/layout/layout_channel.c
src/layout/layout_network.c
src/layout/layout_picture.c
src/layout/layout_sound.c
src/layout/layout_system.c
src/view/system/view_location.c
src/view/view_base.c

index 8d85437..8bb6c4c 100644 (file)
@@ -38,10 +38,10 @@ bool listmgr_update_list(struct listmgr *listmgr, const char *list_id);
 void listmgr_set_list_next_focus(struct listmgr *listmgr, const char *list_id,
                Evas_Object *obj_to_focus, Elm_Focus_Direction dir);
 
-void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id,
+void listmgr_add_inner_grid_cb(struct listmgr *listmgr, const char *list_id,
                input_handler *handler, void *data);
 
-void listmgr_remove_realized_cb(struct listmgr *listmgr, const char *list_id,
+void listmgr_remove_inner_grid_cb(struct listmgr *listmgr, const char *list_id,
                input_handler *handler);
 
 #endif /* __AIR_SETTINGS_LISTMGR_H__ */
index 15e287e..d30bded 100644 (file)
@@ -31,6 +31,7 @@ struct menumgr_info {
        char *(*status)(void *data, int id);
        float (*progress_value)(void);
        void (*selected)(void *data, int id);
+       void (*focused)(void *data, int id);
        void (*selected_menu)(void *data, int id);
 };
 
index f0172d4..f52b83a 100644 (file)
@@ -42,6 +42,7 @@ typedef struct _view_class {
 
 enum update_type {
        UPDATE_FOCUS = 0,
+       UPDATE_SUB_ITEM_SELECTED,
        UPDATE_TITLE,
        UPDATE_CONTENT,
        UPDATE_ENABLE,
index c54c513..940a171 100644 (file)
 #define SIG_ENABLED "elm,state,enabled"
 #define SIG_DISABLED "elm,state,disabled"
 #define SIG_SELECTED "selected"
+#define SIG_UNSELECTED "unselected"
 #define SIG_NOTAVAILABLE "state,notavailable"
 #define SIG_ITEM_SELECTED "sig.item.selected"
 #define SIG_FAV_ADD "elm,state,favorite,add"
index 28e746c..9135aea 100644 (file)
@@ -21,7 +21,8 @@ group {
        name, "elm/button/base/style.menu.button";
        data.item, "focus_highlight" "on";
        script {
-               public cur_state;
+               public focused;
+               public selected;
        }
        parts {
                part {
@@ -149,7 +150,7 @@ group {
                        signal, SIG_FOCUSED;
                        source, SRC_ELM;
                        script {
-                               set_int(cur_state, STATE_NORMAL);
+                               set_int(focused, true);
                                run_program(PROGRAM:"focused,anim");
                        }
                }
@@ -160,14 +161,15 @@ group {
                        source, SRC_ELM;
                        script {
                                new state;
-                               state = get_int(cur_state);
-                               if (state == STATE_SELECTED) {
+                               state = get_int(selected);
+                               if (state) {
                                        set_state(PART:"part.bg", "selected", 0.0);
                                        set_state(PART:"elm.text", "selected", 0.0);
                                        set_state(PART:"part.bottom.line", "selected", 0.0);
                                } else {
                                        run_program(PROGRAM:"unfocused,anim");
                                }
+                               set_int(focused, false);
                        }
                }
 
@@ -190,13 +192,32 @@ group {
                }
 
                program {
-                       name, SIG_SELECTED;
-                       signal, "selected";
+                       name, "selected";
+                       signal, SIG_SELECTED;
                        script {
-                               set_int(cur_state, STATE_SELECTED);
                                set_state(PART:"part.bg", "selected", 0.0);
                                set_state(PART:"elm.text", "selected", 0.0);
                                set_state(PART:"part.bottom.line", "selected", 0.0);
+                               set_int(selected, true);
+                       }
+               }
+
+               program {
+                       name, "unselected";
+                       signal, SIG_UNSELECTED;
+                       script {
+                               new state;
+                               state = get_int(focused);
+                               if (state) {
+                                       set_state(PART:"part.bg", "focused", 0.0);
+                                       set_state(PART:"elm.text", "focused", 0.0);
+                                       set_state(PART:"part.bottom.line", "focused", 0.0);
+                               } else {
+                                       set_state(PART:"part.bg", "default", 0.0);
+                                       set_state(PART:"elm.text", "default", 0.0);
+                                       set_state(PART:"part.bottom.line", "default", 0.0);
+                               }
+                               set_int(selected, false);
                        }
                }
        }
index c86885c..dfbad75 100644 (file)
@@ -198,7 +198,7 @@ static bool _add_grid(struct list_info *linfo, Evas_Object *parent,
        return true;
 }
 
-void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id,
+void listmgr_add_inner_grid_cb(struct listmgr *listmgr, const char *list_id,
                input_handler *handler, void *data)
 {
        struct list_info *linfo;
@@ -219,7 +219,7 @@ void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id,
        _DBG("realized callback added");
 }
 
-void listmgr_remove_realized_cb(struct listmgr *listmgr, const char *list_id,
+void listmgr_remove_inner_grid_cb(struct listmgr *listmgr, const char *list_id,
                input_handler *handler)
 {
        struct list_info *linfo;
index 019298f..c858a99 100644 (file)
@@ -42,6 +42,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Mouse_Move *ev)
 {
        SETTING_TRACE_BEGIN;
+
        if (!obj) {
                _ERR("Invalid argument.");
                return;
@@ -100,10 +101,23 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj)
        }
 }
 
+static void _focused(int id, void *data, Evas_Object *obj,
+                       Elm_Object_Item *item)
+{
+       struct menumgr *m = (struct menumgr *)data;
+
+       if (!obj || !m)
+               return;
+
+       if (m->info[id] && m->info[id]->focused)
+               m->info[id]->focused(m->data, id);
+}
+
 static input_handler _handler = {
        .mouse_move = _mouse_move_cb,
        .key_down = _key_down_cb,
        .clicked = _clicked_cb,
+       .focused = _focused
 };
 
 void menumgr_update(struct menumgr *m)
index 4ea2660..c452845 100644 (file)
@@ -64,6 +64,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_E
 static void _popup_clicked_cb(int id, void *data, Evas_Object *obj);
 static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
 static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev);
+static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item);
 static void _stop_popup_show(struct _priv *priv);
 static void _stop_popup_create(struct _priv *priv);
 
@@ -72,13 +73,14 @@ static layout_class _lclass = {
        .create = _create,
        .show = _show,
        .hide = _hide,
-       .destroy = _destroy,
+       .destroy = _destroy
 };
 
 static input_handler _input_handler = {
        .mouse_move = _mouse_move_cb,
        .key_down = _key_down_cb,
        .mouse_down = _mouse_down_cb,
+       .focused = _focused
 };
 
 static input_handler _popup_input_handler = {
@@ -377,6 +379,11 @@ static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_E
        _button_selected(priv);
 }
 
+static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item)
+{
+       viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_CHANNEL);
+}
+
 static bool _create(layoutmgr *lmgr, void *data)
 {
        struct _priv *priv = NULL;
index 708812d..9ff4718 100644 (file)
@@ -434,19 +434,27 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj,
        }
 }
 
+static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item)
+{
+       viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_NETWORK);
+}
+
 static input_handler _network_type_input_handler = {
        .mouse_move = _mouse_move_cb,
        .mouse_down = _network_type_mouse_down_cb,
        .key_down = _network_type_key_down_cb,
+       .focused = _focused
 };
 
 static input_handler _action_input_handler = {
        .mouse_move = _mouse_move_cb,
        .key_down = _action_key_down_cb,
+       .focused = _focused
 };
 
 static input_handler _grid_input_handler = {
        .realized = _grid_realized_cb,
+       .focused = _focused
 };
 
 static void _draw_no_contents_message(struct _priv *priv)
@@ -956,7 +964,7 @@ static bool _create(layoutmgr *lmgr, void *data)
 
        layoutmgr_set_layout_data(lmgr, LAYOUT_ID_NETWORK, priv);
 
-       listmgr_add_realized_cb(priv->listmgr, LIST_WIRELESS,
+       listmgr_add_inner_grid_cb(priv->listmgr, LIST_WIRELESS,
                        &_grid_input_handler, NULL);
 
        return true;
@@ -1022,7 +1030,7 @@ static void _destroy(void *layout_data)
                datamgr_destroy(priv->wirelessmgr);
 
        if (priv->listmgr) {
-               listmgr_remove_realized_cb(priv->listmgr, LIST_WIRELESS,
+               listmgr_remove_inner_grid_cb(priv->listmgr, LIST_WIRELESS,
                                &_grid_input_handler);
                listmgr_destroy(priv->listmgr);
        }
index e4c8a8a..5f7b0d3 100644 (file)
@@ -57,6 +57,7 @@ static char *_get_color(void *data, int id);
 static char *_get_tint(void *data, int id);
 static char *_get_screen_adj(void *data, int id);
 static void _selected(void *data, int id);
+static void _focused(void *data, int id);
 static void _selected_menu(void *data, int id);
 
 /* Class functions: */
@@ -76,6 +77,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = NULL,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -87,6 +89,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = settings_picture_get_contrast_relative,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -98,6 +101,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = settings_picture_get_brightness_relative,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -109,6 +113,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = settings_picture_get_sharpness_relative,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -120,6 +125,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = settings_picture_get_color_relative,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -131,6 +137,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = settings_picture_get_tint_relative,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -142,6 +149,7 @@ static struct menumgr_info menu_info[] = {
                .progress_value = NULL,
                .progress_evas = NULL,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
 };
@@ -265,6 +273,11 @@ static void _selected(void *data, int id)
        }
 }
 
+static void _focused(void *data, int id)
+{
+       viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_PICTURE);
+}
+
 static void _selected_menu(void *data, int id)
 {
        switch (id)
index 3e99aa4..a3b9e90 100644 (file)
@@ -28,6 +28,7 @@
 #include "common/listmgr.h"
 #include "common/datamgr.h"
 #include "grid/grid_sound.h"
+#include "common/viewmgr.h"
 
 #define SOUND_MODES_COUNT 3
 
@@ -73,7 +74,6 @@ struct _priv {
        int speakers_count;
 };
 
-
 static bool _select_item(Elm_Object_Item *it, struct _priv *priv,
                                        Elm_Object_Item *prev_it, const char *list_id);
 static void _sound_mode_selected_cb(Elm_Object_Item *it, void *data);
@@ -86,6 +86,8 @@ static void _show(void *layout_data);
 static void _hide(void *layout_data);
 static void _destroy(void *layout_data);
 
+static void _grid_focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item);
+
 static layout_class _lclass = {
        .layout_id = LAYOUT_ID_SOUND,
        .create = _create,
@@ -94,12 +96,15 @@ static layout_class _lclass = {
        .destroy = _destroy,
 };
 
+static input_handler grid_handler = {
+       .focused = _grid_focused
+};
+
 layout_class *layout_sound_get_lclass(void)
 {
        return &_lclass;
 }
 
-
 static bool _create(layoutmgr *lmgr, void *data)
 {
        struct _priv *priv = NULL;
@@ -158,6 +163,8 @@ static bool _create(layoutmgr *lmgr, void *data)
                return false;
        }
 
+       listmgr_add_inner_grid_cb(priv->list_mgr, LIST_SOUND_MODES_ID, &grid_handler, NULL);
+
        if (!listmgr_add_list(priv->list_mgr, LIST_SPEAKERS_ID, get_sound_grid_class(),
                                _speaker_selected_cb, priv)) {
                _ERR("Add location list failed.");
@@ -167,6 +174,8 @@ static bool _create(layoutmgr *lmgr, void *data)
                return false;
        }
 
+       listmgr_add_inner_grid_cb(priv->list_mgr, LIST_SPEAKERS_ID, &grid_handler, NULL);
+
        if(data) {
                listmgr_set_list_next_focus(priv->list_mgr, LIST_SOUND_MODES_ID,
                                (Evas_Object *)data, ELM_FOCUS_UP);
@@ -224,6 +233,9 @@ static void _destroy(void *layout_data)
                return;
        }
 
+       listmgr_remove_inner_grid_cb(priv->list_mgr, LIST_SOUND_MODES_ID, &grid_handler);
+       listmgr_remove_inner_grid_cb(priv->list_mgr, LIST_SPEAKERS_ID, &grid_handler);
+
        evas_object_del(priv->ly);
        listmgr_destroy(priv->list_mgr);
 
@@ -233,6 +245,11 @@ static void _destroy(void *layout_data)
        free(priv);
 }
 
+static void _grid_focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item)
+{
+       viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_SOUND);
+}
+
 static bool _select_item(Elm_Object_Item *it, struct _priv *priv,
                                        Elm_Object_Item *prev_it, const char *list_id)
 {
index 7b1c34d..f8d6343 100644 (file)
@@ -65,6 +65,7 @@ static char *_get_subtitle(void *data, int id);
 static char *_get_location(void *data, int id);
 
 static void _selected(void *data, int id);
+static void _focused(void *data, int id);
 static void _selected_menu(void *data, int id);
 static void _location_selected(void *data, int id);
 
@@ -77,6 +78,7 @@ static struct menumgr_info menu_info[] = {
                .favorite = EINA_TRUE,
                .status = _get_clock_mode,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -86,6 +88,7 @@ static struct menumgr_info menu_info[] = {
                .disabled = EINA_FALSE,
                .status = _get_sleep_timer,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -95,6 +98,7 @@ static struct menumgr_info menu_info[] = {
                .disabled = EINA_FALSE,
                .status = _get_wakeup_timer,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -103,6 +107,7 @@ static struct menumgr_info menu_info[] = {
                .style = STYLE_NORMAL_BTN,
                .disabled = EINA_FALSE,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -112,6 +117,7 @@ static struct menumgr_info menu_info[] = {
                .disabled = EINA_FALSE,
                .status = _get_language,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -121,6 +127,7 @@ static struct menumgr_info menu_info[] = {
                .disabled = EINA_FALSE,
                .status = _get_subtitle,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -130,6 +137,7 @@ static struct menumgr_info menu_info[] = {
                .disabled = EINA_FALSE,
                .status = _get_location,
                .selected = _location_selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
        {
@@ -138,6 +146,7 @@ static struct menumgr_info menu_info[] = {
                .style = STYLE_NORMAL_BTN,
                .disabled = EINA_FALSE,
                .selected = _selected,
+               .focused = _focused,
                .selected_menu = _selected_menu
        },
 };
@@ -243,6 +252,11 @@ static void _selected(void *data, int id)
        }
 }
 
+static void _focused(void *data, int id)
+{
+       viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_SYSTEM);
+}
+
 static void _selected_menu(void *data, int id)
 {
        switch (id)
index ce2130b..80a2590 100644 (file)
@@ -363,7 +363,7 @@ static Evas_Object *_create(Evas_Object *win, void *data)
                return NULL;
        }
 
-       listmgr_add_realized_cb(priv->list_mgr, LOCATION_LIST_ID,
+       listmgr_add_inner_grid_cb(priv->list_mgr, LOCATION_LIST_ID,
                        &_grid_input_handler, NULL);
 
        _fill_list_data(priv);
@@ -418,7 +418,7 @@ static void _destroy(void *data)
 
        datamgr_destroy(priv->country_data_mgr);
 
-       listmgr_remove_realized_cb(priv->list_mgr, LOCATION_LIST_ID,
+       listmgr_remove_inner_grid_cb(priv->list_mgr, LOCATION_LIST_ID,
                        &_grid_input_handler);
        listmgr_destroy(priv->list_mgr);
 
index 9d9dd40..b2102d8 100644 (file)
@@ -131,7 +131,8 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj,
                Elm_Object_Item *it)
 {
        struct _priv *priv;
-       int i;
+       int i = -1;
+       int j = 0;
 
        if (!data || !obj) {
                _ERR("Invalid argument.");
@@ -140,9 +141,10 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj,
 
        priv = data;
 
-       for (i = 0; i < LAYOUT_MAX; i++) {
-               if (priv->menu[i] == obj)
-                       break;
+       for (j = 0; j < LAYOUT_MAX; j++) {
+               elm_layout_signal_emit(priv->menu[j], SIG_UNSELECTED, "");
+               if (priv->menu[j] == obj)
+                       i = j;
        }
 
        if (i == priv->cur_menu) {
@@ -342,6 +344,11 @@ static void _update(void *view_data, int update_type, void *data)
        case UPDATE_FOCUS:
                elm_object_focus_set(priv->menu[priv->cur_menu], EINA_TRUE);
                break;
+       case UPDATE_SUB_ITEM_SELECTED:
+               for (i = 0; i < LAYOUT_MAX; i++)
+                       elm_layout_signal_emit(priv->menu[i], SIG_UNSELECTED, "");
+               elm_layout_signal_emit(priv->menu[priv->cur_menu], SIG_SELECTED, "");
+               break;
        case UPDATE_TITLE:
                elm_object_part_text_set(priv->base, PART_TOP_TITLE, _(STR_SETTINGS));
                // tabbar buttons