elm_spinner: change the key event operation on spinner 33/94033/1
authorWooHyun Jung <wh0705.jung@samsung.com>
Thu, 27 Oct 2016 01:26:10 +0000 (10:26 +0900)
committerWooHyun Jung <wh0705.jung@samsung.com>
Thu, 27 Oct 2016 01:26:10 +0000 (10:26 +0900)
Left/Right(or Up/Down with vertical one) changed the value of
spinner previously. However, it gave uneasy because focus could not be
moved to another winset until the value met the min or max.
Now, inc/dec button can get focus, and enter input on them change
the value.
Additionally, central text button changes to the entry automatically
when it gets focus. i.e. toggle on the text button is removed.

@fix

upstream commit: a659fe3484d3631c3d451299e5181789cecc5e00

Change-Id: I37b76f910f56689e8527384dd676de5d1d0b39ef

src/lib/elm_spinner.c
src/lib/elm_widget_spinner.h

index 5f5a7e3..102cc1b 100644 (file)
@@ -45,7 +45,6 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {NULL, NULL}
 };
 
-static Eina_Bool _key_action_spin(Evas_Object *obj, const char *params);
 static Eina_Bool _key_action_toggle(Evas_Object *obj, const char *params);
 
 static Eina_Bool
@@ -60,12 +59,12 @@ _inc_dec_button_unpressed_cb(void *data, Eo *obj EINA_UNUSED,
 static Eina_Bool
 _inc_dec_button_mouse_move_cb(void *data, Eo *obj EINA_UNUSED,
                        const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED);
-
-static const Elm_Action key_actions[] = {
-   {"spin", _key_action_spin},
-   {"toggle", _key_action_toggle},
-   {NULL, NULL}
-};
+static Eina_Bool
+_text_button_focused_cb(void *data, Eo *obj EINA_UNUSED,
+                        const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED);
+static Eina_Bool
+_entry_unfocused_cb(void *data, Eo *obj EINA_UNUSED,
+                    const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED);
 
 EO_CALLBACKS_ARRAY_DEFINE(_inc_dec_button_cb,
    { EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _inc_dec_button_clicked_cb},
@@ -392,7 +391,9 @@ _entry_hide(Evas_Object *obj)
    if (sd->button_layout)
      {
         elm_layout_signal_emit(obj, "elm,state,entry,inactive", "elm");
+        evas_object_hide(sd->ent);
         elm_layout_signal_emit(obj, "elm,state,button,active", "elm");
+        evas_object_show(sd->text_button);
      }
    else
      elm_layout_signal_emit(obj, "elm,state,inactive", "elm");
@@ -420,7 +421,7 @@ _entry_value_apply(Evas_Object *obj)
 
    //TIZEN_ONLY(20161007): If user set special value as number. spinner value
    //                      should not set as special value.
-   const char *special_value = elm_spinner_special_value_get(obj, sd->val);
+   char *special_value = elm_spinner_special_value_get(obj, sd->val);
    if (special_value && !strcmp(special_value, str)) return;
    //
 
@@ -434,16 +435,6 @@ _entry_value_apply(Evas_Object *obj)
                                             _delay_change_timer_cb, obj);
 }
 
-static Eina_Bool
-_entry_activated_cb(void *data,
-                    Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
-                    void *event_info EINA_UNUSED)
-{
-   _entry_value_apply(data);
-
-   return EINA_TRUE;
-}
-
 static int
 _decimal_points_get(const char *label)
 {
@@ -654,6 +645,7 @@ _entry_show_cb(void *data,
    elm_entry_select_all(obj);
    sd->entry_visible = EINA_TRUE;
    elm_layout_signal_emit(data, "elm,state,button,inactive", "elm");
+   evas_object_hide(sd->text_button);
    //TIZEN_ONLY(20160606): Forcefully setting highlight frame on spinner entry as on entry activation frame goes to window again.
    if (_elm_atspi_enabled()) eo_do(obj, elm_interface_atspi_component_highlight_grab());
    //
@@ -697,13 +689,13 @@ _toggle_entry(Evas_Object *obj)
                   //
                }
              elm_entry_single_line_set(sd->ent, EINA_TRUE);
-             eo_do(sd->ent, eo_event_callback_add
-               (ELM_ENTRY_EVENT_ACTIVATED, _entry_activated_cb, obj));
              elm_layout_content_set(obj, "elm.swallow.entry", sd->ent);
              _entry_accept_filter_add(obj);
              elm_entry_markup_filter_append(sd->ent, _invalid_input_validity_filter, NULL);
              if (_elm_config->spinner_min_max_filter_enable)
                elm_entry_markup_filter_append(sd->ent, _min_max_validity_filter, obj);
+             eo_do(sd->ent, eo_event_callback_add
+                   (ELM_WIDGET_EVENT_UNFOCUSED, _entry_unfocused_cb, obj));
           }
         if (!sd->button_layout)
           {
@@ -714,6 +706,7 @@ _toggle_entry(Evas_Object *obj)
              sd->entry_visible = EINA_TRUE;
           }
         elm_layout_signal_emit(obj, "elm,state,entry,active", "elm");
+        evas_object_show(sd->ent);
      }
 }
 
@@ -758,7 +751,7 @@ _val_inc_dec_start(void *data)
    ELM_SPINNER_DATA_GET(data, sd);
 
    sd->interval = sd->first_interval;
-   sd->spin_speed = sd->inc_clicked ? sd->step : -sd->step;
+   sd->spin_speed = sd->inc_btn_activated ? sd->step : -sd->step;
    sd->longpress_timer = NULL;
    //TIZEN_ONLY(20160419): This is not SPIN UX.
    //ecore_timer_del(sd->spin_timer);
@@ -786,32 +779,6 @@ _spin_stop(Evas_Object *obj)
 }
 
 static Eina_Bool
-_key_action_spin(Evas_Object *obj, const char *params)
-{
-   const char *dir = params;
-   Eina_Bool horz = !!strncmp(elm_widget_style_get(obj), "vertical", 8);
-   ELM_SPINNER_DATA_GET(obj, sd);
-
-   if (((!strcmp(dir, "left")) && horz) ||
-       ((!strcmp(dir, "down")) && !horz))
-     {
-        sd->inc_clicked = EINA_FALSE;
-        _val_inc_dec_start(obj);
-        elm_layout_signal_emit(obj, "elm,left,anim,activate", "elm");
-     }
-   else if (((!strcmp(dir, "right")) && horz) ||
-            ((!strcmp(dir, "up")) && !horz))
-     {
-        sd->inc_clicked = EINA_TRUE;
-        _val_inc_dec_start(obj);
-        elm_layout_signal_emit(obj, "elm,right,anim,activate", "elm");
-     }
-   else return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
 _key_action_toggle(Evas_Object *obj, const char *params EINA_UNUSED)
 {
    ELM_SPINNER_DATA_GET(obj, sd);
@@ -830,15 +797,9 @@ _elm_spinner_elm_widget_event(Eo *obj, Elm_Spinner_Data *sd EINA_UNUSED, Evas_Ob
 
    if (type == EVAS_CALLBACK_KEY_DOWN)
      {
-        Eina_Bool ret;
-
         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
-        ret = _elm_config_key_binding_call(obj, ev, key_actions);
-        if (!ret)
-          {
-             if (sd->spin_timer) _spin_stop(obj);
-             else return EINA_FALSE;
-          }
+        if (sd->spin_timer) _spin_stop(obj);
+        else return EINA_FALSE;
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
    else if (type == EVAS_CALLBACK_KEY_UP)
@@ -879,8 +840,8 @@ _button_inc_dec_start_cb(void *data,
 {
    ELM_SPINNER_DATA_GET(data, sd);
 
-   sd->inc_clicked = !strcmp(emission, "elm,action,increment,start")
-                     ? EINA_TRUE : EINA_FALSE;
+   sd->inc_btn_activated =
+      !strcmp(emission, "elm,action,increment,start") ? EINA_TRUE : EINA_FALSE;
 
    if (sd->entry_visible)
      {
@@ -888,7 +849,7 @@ _button_inc_dec_start_cb(void *data,
 
         if (sd->val_updated)
           {
-             if (sd->inc_clicked)
+             if (sd->inc_btn_activated)
                {
                   if (sd->val == sd->val_min) return;
                }
@@ -916,7 +877,7 @@ _button_inc_dec_stop_cb(void *data,
      {
         ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
 
-        if (sd->inc_clicked)
+        if (sd->inc_btn_activated)
           sd->spin_speed = sd->step;
         else
           sd->spin_speed = -sd->step;
@@ -934,12 +895,9 @@ _inc_dec_button_clicked_cb(void *data,
 {
    ELM_SPINNER_DATA_GET(data, sd);
 
-   //TIZEN_ONLY(20160602): fix for atspi inc/dec bug
-   sd->inc_clicked = sd->inc_button == obj ? EINA_TRUE : EINA_FALSE;
-   //
-
    _spin_stop(data);
-   sd->spin_speed = sd->inc_clicked ? sd->step : -sd->step;
+   sd->inc_btn_activated = sd->inc_button == obj ? EINA_TRUE : EINA_FALSE;
+   sd->spin_speed = sd->inc_btn_activated ? sd->step : -sd->step;
    _spin_value(data);
 
    if (sd->entry_visible) _entry_value_apply(data);
@@ -956,7 +914,7 @@ _inc_dec_button_pressed_cb(void *data,
 {
    ELM_SPINNER_DATA_GET(data, sd);
 
-   sd->inc_clicked = sd->inc_button == obj ? EINA_TRUE : EINA_FALSE;
+   sd->inc_btn_activated = sd->inc_button == obj ? EINA_TRUE : EINA_FALSE;
 
    if (sd->longpress_timer) ecore_timer_del(sd->longpress_timer);
 
@@ -991,10 +949,39 @@ _inc_dec_button_unpressed_cb(void *data,
 }
 
 static Eina_Bool
+_text_button_focused_cb(void *data,
+                   Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   ELM_SPINNER_DATA_GET(data, sd);
+
+   sd->entry_visible = EINA_FALSE;
+   _toggle_entry(data);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_entry_unfocused_cb(void *data,
+                    Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   ELM_SPINNER_DATA_GET(data, sd);
+
+   sd->entry_visible = EINA_TRUE;
+   _toggle_entry(data);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
 _text_button_clicked_cb(void *data,
                         Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
                         void *event_info EINA_UNUSED)
 {
+   ELM_SPINNER_DATA_GET(data, sd);
+
+   if (sd->entry_visible) return;
    _toggle_entry(data);
 
    return EINA_TRUE;
@@ -1084,7 +1071,7 @@ _access_activate_cb(void *data,
 
    if (part_obj != inc_btn)
      {
-        sd->inc_clicked = EINA_FALSE;
+        sd->inc_btn_activated = EINA_FALSE;
         _val_inc_dec_start(data);
         elm_layout_signal_emit(data, "elm,left,anim,activate", "elm");
         _spin_stop(data);
@@ -1092,7 +1079,7 @@ _access_activate_cb(void *data,
      }
    else
      {
-        sd->inc_clicked = EINA_TRUE;
+        sd->inc_btn_activated = EINA_TRUE;
         _val_inc_dec_start(data);
         elm_layout_signal_emit(data, "elm,right,anim,activate", "elm");
         _spin_stop(data);
@@ -1325,6 +1312,8 @@ _elm_spinner_evas_object_smart_add(Eo *obj, Elm_Spinner_Data *priv)
 
         eo_do(priv->text_button, eo_event_callback_add
           (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _text_button_clicked_cb, obj));
+        eo_do(priv->text_button, eo_event_callback_add
+              (ELM_WIDGET_EVENT_FOCUSED, _text_button_focused_cb, obj));
 
         elm_layout_content_set(obj, "elm.swallow.text_button", priv->text_button);
         elm_widget_sub_object_add(obj, priv->text_button);
@@ -1472,6 +1461,7 @@ _elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Ev
      return EINA_FALSE;
 
    list_data_get = eina_list_data_get;
+
    items = eina_list_append(items, _pd->inc_button);
    if (_pd->entry_visible)
      items = eina_list_append(items, _pd->ent);
@@ -1480,7 +1470,7 @@ _elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Ev
    items = eina_list_append(items, _pd->dec_button);
 
    ret = elm_widget_focus_list_direction_get
-        (obj, base, items, list_data_get, degree, direction, direction_item, weight);
+      (obj, base, items, list_data_get, degree, direction, direction_item, weight);
    eina_list_free(items);
 
    return ret;
@@ -1514,18 +1504,15 @@ _elm_spinner_elm_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd, Elm_Focus_Dir
      }
    if (!elm_widget_disabled_get(obj))
      {
-       items = eina_list_append(items, _pd->dec_button);
-        items = eina_list_append(items, _pd->inc_button);
+        items = eina_list_append(items, _pd->dec_button);
         if (_pd->entry_visible)
           items = eina_list_append(items, _pd->ent);
         else
-        //TIZEN_ONLY(20160623): Add entry visible, focus check flag for reactivating entry.
           {
              if (_pd->entry_reactivate) _pd->entry_reactivate = EINA_FALSE;
              items = eina_list_append(items, _pd->text_button);
           }
-        //items = eina_list_append(items, _pd->text_button);
-        //
+        items = eina_list_append(items, _pd->inc_button);
      }
    return elm_widget_focus_list_next_get
             (obj, items, eina_list_data_get, dir, next, next_item);
@@ -1553,7 +1540,7 @@ _elm_spinner_eo_base_constructor(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED)
    eo_do(obj,
          evas_obj_type_set(MY_CLASS_NAME_LEGACY),
          evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
-         elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_SPIN_BUTTON));
+         elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_FILLER));
 
    return obj;
 }
@@ -1798,10 +1785,6 @@ EOLIAN static const Elm_Atspi_Action *
 _elm_spinner_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Spinner_Data *sd EINA_UNUSED)
 {
    static Elm_Atspi_Action atspi_actions[] = {
-      { "spin,left", "spin", "left", _key_action_spin},
-      { "spin,right", "spin", "right", _key_action_spin},
-      { "spin,up", "spin", "up", _key_action_spin},
-      { "spin,down", "spin", "down", _key_action_spin},
       { "toggle", "toggle", NULL, _key_action_toggle},
       { NULL, NULL, NULL, NULL }
    };
index eba6714..efba7c0 100644 (file)
@@ -51,7 +51,7 @@ struct _Elm_Spinner_Data
    Eina_Bool             wrap : 1;
    Eina_Bool             val_updated : 1;
    Eina_Bool             button_layout : 1;
-   Eina_Bool             inc_clicked: 1;
+   Eina_Bool             inc_btn_activated: 1;
 };
 
 typedef struct _Elm_Spinner_Special_Value Elm_Spinner_Special_Value;