Fixed layout buttons bugged focus chain 85/60285/1
authorBartlomiej Uliasz <b.uliasz@samsung.com>
Wed, 24 Feb 2016 14:59:00 +0000 (15:59 +0100)
committerBartlomiej Uliasz <b.uliasz@samsung.com>
Wed, 24 Feb 2016 14:59:00 +0000 (15:59 +0100)
Change-Id: Ie2d761daf38e6bdb1b0e434c99fcb730a9d6e965
Signed-off-by: Bartlomiej Uliasz <b.uliasz@samsung.com>
include/common/menumgr.h
src/common/menumgr.c
src/layout/layout_picture.c
src/layout/layout_system.c

index e65c009..ea7bf53 100644 (file)
@@ -28,7 +28,7 @@ struct menumgr_info {
        void (*selected)(void *data, int id);
 };
 
-struct menumgr *menumgr_create(Evas_Object *table, Evas_Object **first_menu_option,
+struct menumgr *menumgr_create(Evas_Object *table, Evas_Object *tab_menu_btn,
                struct menumgr_info *info, int len, void *data);
 void menumgr_destroy(struct menumgr *m);
 
index 8f8a44a..bf9860b 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <Elementary.h>
+#include <stdbool.h>
 
 #include "common/viewmgr.h"
 #include "common/inputmgr.h"
@@ -129,15 +130,17 @@ void menumgr_update(struct menumgr *m)
        }
 }
 
-struct menumgr *menumgr_create(Evas_Object *table, Evas_Object **first_menu_option,
+struct menumgr *menumgr_create(Evas_Object *table, Evas_Object *tab_menu_btn,
                struct menumgr_info *info, int len, void *data)
 {
        SETTING_TRACE_BEGIN;
        struct menumgr *m = NULL;
        Evas_Object *btn = NULL;
+       Evas_Object *last_enabled_btn = NULL;
        int i = 0;
        int col = 0;
        int row = 0;
+       bool first_option_set = false;
 
        m = calloc(1, sizeof(struct menumgr));
        if (!m) {
@@ -145,6 +148,10 @@ struct menumgr *menumgr_create(Evas_Object *table, Evas_Object **first_menu_opti
                return NULL;
        }
 
+       if (len > MAX_BTN) {
+               _ERR("Number of buttons exceed maximum allowed");
+               len = MAX_BTN;
+       }
        m->data = data;
        m->len = len;
 
@@ -159,9 +166,19 @@ struct menumgr *menumgr_create(Evas_Object *table, Evas_Object **first_menu_opti
                        return NULL;
                }
 
-               if (i == 0 && first_menu_option)
-                       *first_menu_option = btn;
-
+               if (info[i].disabled == EINA_FALSE) {
+                       if (!first_option_set && tab_menu_btn) {
+                               elm_object_focus_next_object_set(tab_menu_btn, btn, ELM_FOCUS_DOWN);
+                               elm_object_focus_next_object_set(btn, tab_menu_btn, ELM_FOCUS_UP);
+                               first_option_set = true;
+                       } else if (i < MAX_BTN_COL && tab_menu_btn)
+                               elm_object_focus_next_object_set(btn, tab_menu_btn, ELM_FOCUS_UP);
+                       if (last_enabled_btn) {
+                               elm_object_focus_next_object_set(btn, last_enabled_btn, ELM_FOCUS_LEFT);
+                               elm_object_focus_next_object_set(last_enabled_btn, btn, ELM_FOCUS_RIGHT);
+                       }
+                       last_enabled_btn = btn;
+               }
                elm_object_disabled_set(btn, info[i].disabled);
                evas_object_size_hint_align_set(btn, 0, 0);
 
index 93015f0..59e81cd 100644 (file)
@@ -33,7 +33,6 @@ struct _priv {
        Evas_Object *base;
        Evas_Object *ly;
        Evas_Object *table;
-       Evas_Object *first_menu_option;
        layoutmgr *lmgr;
        struct menumgr *menu;
 };
@@ -56,7 +55,6 @@ 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 bool _add_layout_contents(struct _priv *priv);
 
 /* Class functions: */
 static bool _create(layoutmgr *lmgr, void *data);
@@ -241,7 +239,7 @@ static void _selected(void *data, int id)
        }
 }
 
-static bool _add_layout_contents(struct _priv *priv)
+static bool _add_layout_contents(struct _priv *priv, Evas_Object *tab_button)
 {
        SETTING_TRACE_BEGIN;
        Evas_Object *table = NULL;
@@ -261,7 +259,7 @@ static bool _add_layout_contents(struct _priv *priv)
 
        elm_object_part_content_set(priv->ly, PART_PICTURE, table);
 
-       priv->menu = menumgr_create(table, &priv->first_menu_option, menu_info,
+       priv->menu = menumgr_create(table, tab_button, menu_info,
                                                                ARRAY_SIZE(menu_info), priv);
        if (!priv->menu) {
                _ERR("failed to create menu manager");
@@ -277,7 +275,6 @@ static bool _create(layoutmgr *lmgr, void *tab_button)
        SETTING_TRACE_BEGIN;
 
        struct _priv *priv = NULL;
-       Evas_Object *tab_button_evas = (Evas_Object *)tab_button;
 
        if (!lmgr) {
                _ERR("Invalid argument.");
@@ -306,13 +303,12 @@ static bool _create(layoutmgr *lmgr, void *tab_button)
 
        priv->lmgr = lmgr;
 
-       if (!_add_layout_contents(priv)) {
+       if (!_add_layout_contents(priv, (Evas_Object *)tab_button)) {
                _ERR("Add layout contents failed.");
                evas_object_del(priv->ly);
                free(priv);
                return false;
        }
-       elm_object_focus_next_object_set(tab_button_evas, priv->first_menu_option, ELM_FOCUS_DOWN);
        layoutmgr_set_layout_data(lmgr, LAYOUT_ID_PICTURE, priv);
        SETTING_TRACE_END;
        return true;
index ab4eb39..bfd3c59 100644 (file)
@@ -46,7 +46,6 @@ struct _priv {
        Evas_Object *ly;
        Evas_Object *table;
        layoutmgr *lmgr;
-       Evas_Object *first_menu_option;
        struct menumgr *menu;
 };
 
@@ -265,7 +264,7 @@ static void _location_selected(void *data, int id)
                _ERR("viewmgr_show_view failed.");
 }
 
-static bool _add_layout_contents(struct _priv *priv)
+static bool _add_layout_contents(struct _priv *priv, Evas_Object *tab_button)
 {
        Evas_Object *table = NULL;
        struct menumgr *menu = NULL;
@@ -285,7 +284,7 @@ static bool _add_layout_contents(struct _priv *priv)
 
        elm_object_part_content_set(priv->ly, PART_SYSTEM, table);
 
-       menu = menumgr_create(table, &priv->first_menu_option, menu_info, ARRAY_SIZE(menu_info), priv);
+       menu = menumgr_create(table, tab_button, menu_info, ARRAY_SIZE(menu_info), priv);
        if (!menu) {
                _ERR("failed to create menu manager");
                evas_object_del(table);
@@ -302,7 +301,6 @@ static bool _create(layoutmgr *lmgr, void *tab_button)
        struct _priv *priv = NULL;
        Evas_Object *base = NULL;
        Evas_Object *ly = NULL;
-       Evas_Object *tab_button_evas = (Evas_Object *)tab_button;
 
        if (!lmgr) {
                _ERR("Invalid argument.");
@@ -334,13 +332,12 @@ static bool _create(layoutmgr *lmgr, void *tab_button)
        priv->base = base;
        priv->ly = ly;
 
-       if (!_add_layout_contents(priv)) {
+       if (!_add_layout_contents(priv, (Evas_Object *)tab_button)) {
                _ERR("Add layout contents failed.");
                evas_object_del(ly);
                free(priv);
                return false;
        }
-       elm_object_focus_next_object_set(tab_button_evas, priv->first_menu_option, ELM_FOCUS_DOWN);
        layoutmgr_set_layout_data(lmgr, LAYOUT_ID_SYSTEM, priv);
 
        return true;