Focus: first item should be focused when there is no focused/selected item
authorAnil Kumar Nahak <ak.nahak@samsung.com>
Mon, 21 Jul 2014 09:55:55 +0000 (18:55 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Mon, 21 Jul 2014 09:55:55 +0000 (18:55 +0900)
Summary: First item of widget should be focused when focus comes to the widget for first time.

Test Plan:
elementary_test -to "Genlist Focus"
elementary_test -to "Gengrid Focus"
elementary_test -to "List Focus"
elementary_test -to "toolbar Focus"

Reviewers: seoz

Differential Revision: https://phab.enlightenment.org/D1135

14 files changed:
config/default/base.src.in
config/mobile/base.src.in
config/standard/base.src.in
src/bin/test_gengrid.c
src/bin/test_genlist.c
src/bin/test_list.c
src/bin/test_toolbar.c
src/lib/elm_config.c
src/lib/elm_config.h
src/lib/elm_gengrid.c
src/lib/elm_genlist.c
src/lib/elm_list.c
src/lib/elm_priv.h
src/lib/elm_toolbar.c

index db264a0..cc3793e 100644 (file)
@@ -47,6 +47,7 @@ group "Elm_Config" struct {
   value "focus_highlight_animate" uchar: 0;
   value "focus_highlight_clip_disable" uchar: 0;
   value "item_select_on_focus_disable" uchar: 0;
+  value "first_item_focus_on_first_focusin" uchar: 1;
   value "focus_move_policy" uchar: 0;
   value "toolbar_shrink_mode" int: 3;
   value "fileselector_expand_enable" uchar: 0;
index 58da35d..e09332d 100644 (file)
@@ -47,6 +47,7 @@ group "Elm_Config" struct {
   value "focus_highlight_animate" uchar: 0;
   value "focus_highlight_clip_disable" uchar: 0;
   value "item_select_on_focus_disable" uchar: 0;
+  value "first_item_focus_on_first_focusin" uchar: 1;
   value "focus_move_policy" uchar: 0;
   value "toolbar_shrink_mode" int: 3;
   value "fileselector_expand_enable" uchar: 0;
index 1f7594d..cb2ae46 100644 (file)
@@ -47,6 +47,7 @@ group "Elm_Config" struct {
   value "focus_highlight_animate" uchar: 0;
   value "focus_highlight_clip_disable" uchar: 1;
   value "item_select_on_focus_disable" uchar: 0;
+  value "first_item_focus_on_first_focusin" uchar: 1;
   value "focus_move_policy" uchar: 0;
   value "toolbar_shrink_mode" int: 3;
   value "fileselector_expand_enable" uchar: 1;
index ba69f37..71b3ba6 100644 (file)
@@ -1445,6 +1445,13 @@ _gg_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED,
    elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
 }
 
+static void
+_gg_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                          void *event_info  EINA_UNUSED)
+{
+   elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
 void
 test_gengrid_focus(void *data EINA_UNUSED,
                    Evas_Object *obj EINA_UNUSED,
@@ -1568,6 +1575,16 @@ test_gengrid_focus(void *data EINA_UNUSED,
    elm_box_pack_end(bx_opt, ck);
    evas_object_show(ck);
 
+   ck = elm_check_add(bx_opt);
+   elm_object_text_set(ck, "First item focus on first focus in");
+   elm_check_state_set(ck, elm_config_first_item_focus_on_first_focusin_get());
+   evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(ck, "changed",
+                                  _gg_first_item_focus_on_first_focus_in_cb,
+                                  NULL);
+   elm_box_pack_end(bx_opt, ck);
+   evas_object_show(ck);
+
    // Focus Autoscroll Mode
    fr = _focus_autoscroll_mode_frame_create(bx);
    elm_box_pack_end(bx, fr);
index bba0086..d553be5 100644 (file)
@@ -4032,6 +4032,12 @@ _gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_O
    elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
 }
 
+static void
+_gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                          void *event_info  EINA_UNUSED)
+{
+   elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
 static Eina_Bool
 _focus_timer_cb(void *data)
 {
@@ -4324,6 +4330,17 @@ test_genlist_focus(void *data EINA_UNUSED,
    elm_box_pack_end(bx_opt, chk);
    evas_object_show(chk);
 
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "First item focus on first focus in");
+   elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_first_item_focus_on_first_focus_in_cb,
+                                  NULL);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+
    // Focus Autoscroll Mode
    fr = _focus_autoscroll_mode_frame_create(bx);
    elm_box_pack_end(bx, fr);
index be96c75..e6a2967 100644 (file)
@@ -1327,6 +1327,13 @@ test_list_focus_item_select_on_focus_disable_changed(void *data EINA_UNUSED, Eva
 }
 
 static void
+test_list_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                                void *event_info  EINA_UNUSED)
+{
+   elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+static void
 _item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    printf("%s: %p\n", (char *)data, event_info);
@@ -1534,6 +1541,16 @@ _test_list_focus(const char *name, const char *title, Eina_Bool horiz)
    elm_box_pack_end(bx_opt, chk);
    evas_object_show(chk);
 
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "First item focus on first focus in");
+   elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  test_list_first_item_focus_on_first_focus_in_cb,
+                                  NULL);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
    // Focus Autoscroll Mode
    fr = _focus_autoscroll_mode_frame_create(bx);
    elm_box_pack_end(bx, fr);
index f535958..11c0757 100644 (file)
@@ -1081,6 +1081,13 @@ _test_toolbar_focus_focus_animate_check_changed(void *data, Evas_Object *obj,
 }
 
 static void
+_test_toolbar_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                                    void *event_info  EINA_UNUSED)
+{
+   elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+
+static void
 _toolbar_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
                            Evas_Object *obj EINA_UNUSED, void *event_info)
 {
@@ -1223,6 +1230,16 @@ test_toolbar_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e
                                   _test_toolbar_focus_focus_animate_check_changed,
                                   win);
 
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "First item focus on first focus in");
+   elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _test_toolbar_first_item_focus_on_first_focus_in_cb,
+                                  win);
+
    // Focus Autoscroll Mode
    fr = _focus_autoscroll_mode_frame_create(bx);
    elm_box_pack_end(bx, fr);
index b308928..96430ce 100644 (file)
@@ -529,6 +529,7 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, focus_move_policy, T_UCHAR);
    ELM_CONFIG_VAL(D, T, focus_autoscroll_mode, T_UCHAR);
    ELM_CONFIG_VAL(D, T, item_select_on_focus_disable, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, first_item_focus_on_first_focus_in, T_UCHAR);
    ELM_CONFIG_VAL(D, T, toolbar_shrink_mode, T_INT);
    ELM_CONFIG_VAL(D, T, fileselector_expand_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, fileselector_double_tap_navigation_enable, T_UCHAR);
@@ -1546,6 +1547,7 @@ _config_load(void)
    _elm_config->focus_highlight_animate = EINA_TRUE;
    _elm_config->focus_highlight_clip_disable = EINA_FALSE;
    _elm_config->focus_move_policy = ELM_FOCUS_MOVE_POLICY_CLICK;
+   _elm_config->first_item_focus_on_first_focus_in = EINA_FALSE;
    _elm_config->item_select_on_focus_disable = EINA_TRUE;
    _elm_config->toolbar_shrink_mode = 2;
    _elm_config->fileselector_expand_enable = EINA_FALSE;
@@ -2166,6 +2168,9 @@ _env_get(void)
    s = getenv("ELM_ITEM_SELECT_ON_FOCUS_DISABLE");
    if (s) _elm_config->item_select_on_focus_disable = !!atoi(s);
 
+   s = getenv("ELM_FIRST_ITEM_FOCUS_ON_FIRST_FOCUS_IN");
+   if (s) _elm_config->first_item_focus_on_first_focus_in = !!atoi(s);
+
    s = getenv("ELM_TOOLBAR_SHRINK_MODE");
    if (s) _elm_config->toolbar_shrink_mode = atoi(s);
 
@@ -2736,6 +2741,18 @@ elm_config_item_select_on_focus_disabled_set(Eina_Bool disable)
 }
 
 EAPI Eina_Bool
+elm_config_first_item_focus_on_first_focusin_get(void)
+{
+   return _elm_config->first_item_focus_on_first_focus_in;
+}
+
+EAPI void
+elm_config_first_item_focus_on_first_focusin_set(Eina_Bool enable)
+{
+   _elm_config->first_item_focus_on_first_focus_in = !!enable;
+}
+
+EAPI Eina_Bool
 elm_config_scroll_bounce_enabled_get(void)
 {
    return _elm_config->thumbscroll_bounce_enable;
index 9d29f37..7cf9a59 100644 (file)
@@ -1343,6 +1343,28 @@ EAPI Eina_Bool elm_config_item_select_on_focus_disabled_get(void);
 EAPI void elm_config_item_select_on_focus_disabled_set(Eina_Bool enabled);
 
 /**
+ * Get status of first item focus on first focusin feature.
+ *
+ * @return The first item focus on first focusin status
+ *
+ * @see elm_config_first_item_focus_on_first_focusin_set
+ * @since 1.11
+ * @ingroup Focus
+ */
+EAPI Eina_Bool elm_config_first_item_focus_on_first_focusin_get(void);
+
+/**
+ * Set the first item focus on first focusin feature.
+ *
+ * @param enable first_item_focus_on_first_focusin if @c EINA_TRUE, enable otherwise
+ *
+ * @see elm_config_first_item_focus_on_first_focusin_get
+ * @since 1.11
+ * @ingroup Focus
+ */
+EAPI void elm_config_first_item_focus_on_first_focusin_set(Eina_Bool enabled);
+
+/**
  * Get the system mirrored mode. This determines the default mirrored mode
  * of widgets.
  *
index e4c28f9..eb94d5f 100644 (file)
@@ -2949,13 +2949,12 @@ _elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd)
           it = sd->last_focused_item;
         else if (sd->last_selected_item)
           it = sd->last_selected_item;
-        /* TODO: make it optional on 1.11. Disable this until then
-        else if (elm_widget_focus_highlight_enabled_get(obj))
+        else if (_elm_config->first_item_focus_on_first_focus_in &&
+                 elm_widget_focus_highlight_enabled_get(obj))
           {
              it = elm_gengrid_first_item_get(obj);
              is_sel = EINA_TRUE;
           }
-        */
 
         if (it)
           {
index cdf9456..7857d37 100644 (file)
@@ -2932,13 +2932,12 @@ _elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd)
           it = sd->last_focused_item;
         else if (sd->last_selected_item)
           it = sd->last_selected_item;
-        /* TODO: make it optional on 1.11. Disable this until then
-        else if (elm_widget_focus_highlight_enabled_get(obj))
+        else if (_elm_config->first_item_focus_on_first_focus_in &&
+                 elm_widget_focus_highlight_enabled_get(obj))
           {
              it = elm_genlist_first_item_get(obj);
              is_sel = EINA_TRUE;
           }
-        */
 
         if (it)
           {
index 09b1649..fa9c03a 100644 (file)
@@ -1223,13 +1223,12 @@ _elm_list_elm_widget_on_focus(Eo *obj, Elm_List_Data *sd)
           it = sd->last_focused_item;
         else if (sd->last_selected_item)
           it = sd->last_selected_item;
-        /* TODO: make it optional on 1.11
-        else if (elm_widget_focus_highlight_enabled_get(obj))
+        else if (_elm_config->first_item_focus_on_first_focus_in &&
+                 elm_widget_focus_highlight_enabled_get(obj))
           {
-             it = eina_list_data_get(sd->items);
+             it = elm_list_first_item_get(obj);
              is_sel = EINA_TRUE;
           }
-        */
 
         if (it)
           {
index e84bad5..c8d3e97 100644 (file)
@@ -230,6 +230,7 @@ struct _Elm_Config
    unsigned char focus_highlight_clip_disable; /**< This shows disabled status of focus highlight clip feature. This value is false by default so the focus highlight is clipped. */
    unsigned char focus_move_policy; /**< This show how the elementary focus is moved to another object. Focus can be moved by click or mouse_in. */
    unsigned char item_select_on_focus_disable; /**< This shows the disabled status of select on focus feature. This value is false by default so that select on focus feature is enabled by default.*/
+   unsigned char first_item_focus_on_first_focus_in;  /**< This sets the first item focus on first focus in feature*/
    Elm_Focus_Autoscroll_Mode focus_autoscroll_mode; /**< This shows the focus auto scroll mode. By default, @c ELM_FOCUS_AUTOSCROLL_MODE_SHOW is set. */
    int           toolbar_shrink_mode;
    unsigned char fileselector_expand_enable;
index fdaa4e0..5467739 100644 (file)
@@ -740,10 +740,10 @@ _elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data *sd)
      {
         if (sd->last_focused_item)
           it = sd->last_focused_item;
-        /* TODO: make it optional on 1.11. Disable this until then
-        else
-          it = (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items);
-        */
+        else if (_elm_config->first_item_focus_on_first_focus_in &&
+                 elm_widget_focus_highlight_enabled_get(obj))
+          it = elm_toolbar_first_item_get(obj);
+
         if (it)
           {
              it = _elm_toolbar_nearest_visible_item_get(obj, it);