spinner: flick to open feature
authorHyukSoon Choi <hs619.choi@samsung.com>
Mon, 13 Apr 2020 10:10:41 +0000 (19:10 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Fri, 17 Apr 2020 23:00:11 +0000 (08:00 +0900)
Change-Id: Ice51bbca22d07552193e3c10bb1a22c33481e365
Signed-off-by: HyukSoon Choi <hs619.choi@samsung.com>
src/lib/elementary/elm_spinner.c
src/lib/elementary/elm_widget_spinner.h
src/lib/elementary_tizen/elm_genlist.c

index 9480241..3c6179a 100644 (file)
@@ -87,6 +87,10 @@ _genlist_unfocused_cb(void *data,
                     Eo *obj EINA_UNUSED,
                     void *event_info EINA_UNUSED);
 //
+//TIZEN_ONLY(20200413): flick to open feature
+static Evas_Event_Flags _text_button_flick_end(void *data, void *event_info);
+static Evas_Event_Flags _text_button_flick_move(void *data, void *event_info);
+//
 
 EFL_CALLBACKS_ARRAY_DEFINE(_inc_dec_button_cb,
    { EFL_INPUT_EVENT_CLICKED, _inc_dec_button_clicked_cb},
@@ -612,7 +616,9 @@ _genlist_realized_cb(void *data,
    Elm_Object_Item* item = event_info;
    Elm_Spinner_Data* sd = (Elm_Spinner_Data*)data;
 
-   if (!item) return;
+   //TIZEN_ONLY(20200413): flick to open feature
+   if (!item || sd->flick_dir) return;
+   //
 
    if (item == sd->prev_item)
      elm_object_item_signal_emit(sd->prev_item, "elm,state,up", "elm");
@@ -662,12 +668,30 @@ _genlist_item_aligned_cb(void *data,
 {
    ELM_SPINNER_DATA_GET(data, sd);
 
-   if (event_info)
-     {
-        sd->aligned_item = (Elm_Object_Item *)event_info;
+   if (!event_info) return;
+
+   sd->aligned_item = (Elm_Object_Item *)event_info;
 
-        _genlist_item_value_apply(data);
+   //TIZEN_ONLY(20200413): flick to open feature
+   Elm_Object_Item* next_item = NULL;
+   if (sd->flick_dir == -1)
+     {
+        if (sd->aligned_item == elm_genlist_first_item_get(sd->genlist))
+          next_item = elm_genlist_last_item_get(sd->genlist);
+        else
+          next_item = elm_genlist_item_prev_get(sd->aligned_item);
      }
+   else if (sd->flick_dir == 1)
+     {
+        if (sd->aligned_item == elm_genlist_last_item_get(sd->genlist))
+          next_item = elm_genlist_first_item_get(sd->genlist);
+        else
+          next_item = elm_genlist_item_next_get(sd->aligned_item);
+     }
+   sd->flick_dir = 0;
+   if (next_item) __elm_genlist_item_show_center_adjust(next_item, EINA_TRUE);
+   //
+   _genlist_item_value_apply(data);
 }
 
 static void
@@ -949,6 +973,9 @@ _genlist_item_default_cb(void *data EINA_UNUSED,
    if (sd->next_item) elm_object_item_signal_emit(sd->next_item, "elm,state,set_default", "elm");
    sd->prev_item = NULL;
    sd->next_item = NULL;
+   //TIZEN_ONLY(20200413): flick to open feature
+   evas_object_smart_callback_del(sd->genlist, "realized", _genlist_realized_cb);
+   //
 }
 
 static void
@@ -963,7 +990,12 @@ _genlist_show_cb(void *data,
 
    elm_object_focus_set(obj, EINA_TRUE);
    sd->genlist_visible = EINA_TRUE;
-   elm_layout_signal_emit(data, "elm,state,button,inactive,anim", "elm");
+   //TIZEN_ONLY(20200413): flick to open feature
+   if (sd->flick_dir)
+     elm_layout_signal_emit(data, "elm,state,button,inactive", "elm");
+   else
+     elm_layout_signal_emit(data, "elm,state,button,inactive,anim", "elm");
+   //
    evas_object_hide(sd->text_button);
 
    if (sd->aligned_item)
@@ -988,6 +1020,10 @@ _toggle_genlist(Evas_Object *obj)
    if (sd->genlist_visible)
      {
         _genlist_value_apply(obj);
+        //TIZEN_ONLY(20200413): flick to open feature
+        elm_gesture_layer_cb_set(sd->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _text_button_flick_end, obj);
+        elm_gesture_layer_cb_set(sd->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE, _text_button_flick_move, obj);
+        //
         evas_object_smart_callback_call(obj, SIG_LIST_HIDE, NULL);
      }
    else
@@ -1041,6 +1077,10 @@ _toggle_genlist(Evas_Object *obj)
         _set_genlist_item_state(sd);
         sd->scrolling = EINA_FALSE;
 
+        //TIZEN_ONLY(20200413): flick to open feature
+        elm_gesture_layer_cb_del(sd->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _text_button_flick_end, obj);
+        elm_gesture_layer_cb_del(sd->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE, _text_button_flick_move, obj);
+        //
         evas_object_smart_callback_add
           (sd->genlist, "aligned,item,detected", _genlist_item_aligned_cb, obj);
         evas_object_smart_callback_add
@@ -1169,6 +1209,66 @@ _genlist_toggle_cb(void *data EINA_UNUSED,
 }
 //
 
+//TIZEN_ONLY(20200413): flick to open feature
+static Evas_Event_Flags
+_text_button_flick_move(void *data, void *event_info)
+{
+   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *)event_info;
+   Evas_Coord x_diff, y_diff;
+   Evas_Object* obj = (Evas_Object*)data;
+   ELM_SPINNER_DATA_GET(obj, sd);
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     return EVAS_EVENT_FLAG_NONE;
+
+   x_diff = abs(p->momentum.x2 - p->momentum.x1);
+   y_diff = abs(p->momentum.y2 - p->momentum.y1);
+   if (y_diff < x_diff) return EVAS_EVENT_FLAG_NONE;
+   if (y_diff < elm_gesture_layer_line_min_length_get(sd->g_layer))
+     {
+        ERR("INFO: Finger movement is less that line gesture threshold");
+        return EVAS_EVENT_FLAG_NONE;
+     }
+
+   return EVAS_EVENT_FLAG_ON_HOLD;//So that on mouse_up focus cycle does not give focus to text_button in case of flick
+}
+
+static Evas_Event_Flags
+_text_button_flick_end(void *data, void *event_info)
+{
+   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+   Evas_Object* obj = (Evas_Object*)data;
+   Evas_Coord x_diff, y_diff;
+   ELM_SPINNER_DATA_GET(obj, sd);
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled()) return EVAS_EVENT_FLAG_NONE;
+
+   x_diff = abs(p->momentum.x2 - p->momentum.x1);
+   y_diff = abs(p->momentum.y2 - p->momentum.y1);
+   if (y_diff < x_diff)
+     {
+        ERR("INFO: Flick happened in horizontal direction");
+        return EVAS_EVENT_FLAG_NONE;
+     }
+
+   if (p->momentum.y2 >= p->momentum.y1)
+     {
+        sd->flick_dir = -1;
+        elm_object_focus_set(obj, EINA_TRUE);
+        _toggle_genlist(obj);
+        ERR("INFO: spinner toggled: %p", obj);
+        return EVAS_EVENT_FLAG_ON_HOLD;
+     }
+   else
+     {
+        sd->flick_dir = 1;
+        elm_object_focus_set(obj, EINA_TRUE);
+        _toggle_genlist(obj);
+        ERR("INFO: spinner toggled: %p", obj);
+        return EVAS_EVENT_FLAG_ON_HOLD;
+     }
+   return EVAS_EVENT_FLAG_NONE;
+}
+//
+
 static Eina_Bool
 _spin_value(void *data)
 {
@@ -1765,6 +1865,32 @@ _access_spinner_register(Evas_Object *obj, Eina_Bool is_access)
      }
 }
 
+//TIZEN_ONLY(20200413): flick to open feature
+static void
+_on_obj_move(void * data,
+           Evas *e EINA_UNUSED,
+           Evas_Object *obj,
+           void *event_info EINA_UNUSED)
+{
+   Elm_Spinner_Data *sd = data;
+   Evas_Coord x, y;
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+   evas_object_move(sd->g_rect, x, y);
+}
+
+static void
+_on_obj_resize(void * data,
+           Evas *e EINA_UNUSED,
+           Evas_Object *obj,
+           void *event_info EINA_UNUSED)
+{
+   Elm_Spinner_Data *sd = data;
+   Evas_Coord w, h;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_resize(sd->g_rect, w, h);
+}
+//
+
 EOLIAN static void
 _elm_spinner_efl_canvas_group_group_add(Eo *obj, Elm_Spinner_Data *priv)
 {
@@ -1848,6 +1974,23 @@ _elm_spinner_efl_canvas_group_group_add(Eo *obj, Elm_Spinner_Data *priv)
 
         elm_layout_content_set(obj, "elm.swallow.text_button", priv->text_button);
         elm_widget_sub_object_add(obj, priv->text_button);
+        //TIZEN_ONLY(20200413): flick to open feature
+        if (priv->list_spinner)
+          {
+             priv->g_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
+             evas_object_smart_member_add(priv->g_rect, obj);
+             elm_widget_sub_object_add(obj, priv->g_rect);
+             evas_object_color_set(priv->g_rect, 0, 0, 0, 0);
+             evas_object_show(priv->g_rect);
+             evas_object_repeat_events_set(priv->g_rect, EINA_TRUE);
+             evas_object_raise(priv->g_rect);
+
+             priv->g_layer = elm_gesture_layer_add(obj);
+             elm_gesture_layer_attach(priv->g_layer, priv->g_rect);
+             elm_gesture_layer_cb_set(priv->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _text_button_flick_end, obj);
+             elm_gesture_layer_cb_set(priv->g_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE, _text_button_flick_move, obj);
+          }
+        //
 
         priv->dec_button = elm_button_add(obj);
         /* TIZEN_ONLY(20161115): apply UI Mirroring for Tizen 3.0 UX.
index f3c1794..579ec55 100644 (file)
@@ -43,11 +43,17 @@ struct _Elm_Spinner_Data
    Elm_Genlist_Item_Class *itc;
    Elm_Object_Item      *aligned_item, *next_item, *prev_item;
    //
+   //TIZEN_ONLY(20200413): flick to open feature
+   Evas_Object           *g_layer;
+   //
    const char           *label;
    double                val, val_min, val_max, val_base;
    double                step; /**< step for the value change. 1 by default. */
    double                drag_prev_pos, drag_val_step;
    double                spin_speed, interval, first_interval;
+   //TIZEN_ONLY(20200413): flick to open feature
+   int                   flick_dir;
+   //
    int                   round;
    int                   decimal_points;
    Ecore_Timer          *delay_change_timer; /**< a timer for a delay,changed smart callback */
index e594bc8..5e6fb85 100644 (file)
@@ -9150,11 +9150,12 @@ _EAPI void
 __elm_genlist_item_show_center_adjust(Eo *eo_item, Eina_Bool anim)
 {
    Elm_Gen_Item *it = efl_data_scope_get(eo_item, ELM_GENLIST_ITEM_CLASS);
+   ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
    Elm_Genlist_Data *sd = it->item->wsd;
 
-   it = _adjust_item_align(it, EINA_FALSE);
-
-   sd->show_item = it;
+   it = _adjust_item_align(it, EINA_TRUE);
+   if (!it) return;
+   sd->adjusted_item = sd->show_item = it;
    sd->scroll_to_type = ELM_GENLIST_ITEM_SCROLLTO_MIDDLE;
    sd->bring_in = !!anim;
    sd->center_align_mode = EINA_TRUE;