wearable/rotaryselector: Prevent flick while item dragged 14/203914/1
authorjinhyuk PARK <jh2174.park@samsung.com>
Thu, 23 Aug 2018 07:10:19 +0000 (16:10 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Thu, 18 Apr 2019 05:46:50 +0000 (14:46 +0900)
Product patch: http://slp-info.sec.samsung.net/gerrit/#/c/3253422/

[Model] TIZEN 4.0
[BinType] AP
[Customer] N/A

[Issue#] N/A
[Request] Prevent flick while item dragged
[Occurrence Version] Latest

[Problem]  N/A
[Measure] N/A
[Checking Method] Drag item on rotary selector, edit mode

[Team] UIFW
[Developer] jinhyuk Park
[Solution company] Samsung
[Change Type] N/A

Change-Id: I1a177d1b4f695327c50bb1de876c87da46af558f
Signed-off-by: jinhyuk PARK <jh2174.park@samsung.com>
src/wearable/efl_extension_rotary_selector.c

index 6da84c76b7e3f7c23a3def1ac0640c1cf9dc604c..5d8ce95b79c69dfd4aff20d8756fd2de6342b0ba 100644 (file)
@@ -419,12 +419,74 @@ _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it)
    rsd->item_del_timer = ecore_timer_add(_ROTARY_SELECTOR_DEL_ANIMATION_DURATION, _del_item_timer_cb, rsd);
 }
 
+static Evas_Event_Flags
+_on_flick_end_cb(void *data, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd) return EINA_FALSE;
+   Evas_Coord x_diff, y_diff;
+
+   if (rsd->previous_page_animator || rsd->next_page_animator)
+     return EVAS_EVENT_FLAG_ON_HOLD;
+
+   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   int previous_item_index = rsd->selected_index;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   if (last_index > rsd->item_count - 1)
+     {
+        last_index = rsd->item_count - 1;
+     }
+
+   x_diff = p->momentum.x2 - p->momentum.x1;
+   y_diff = p->momentum.y2 - p->momentum.y1;
+
+   if (abs(x_diff) < abs(y_diff)) return EVAS_EVENT_FLAG_ON_HOLD;
+
+   if (p->momentum.x2 > p->momentum.x1) //right swipe
+     {
+        if (rsd->current_page > 0)
+          {
+             rsd->selected_index = first_index - 1;
+             _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+             _page_animation_run(rsd, EINA_FALSE);
+             _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+             evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+          }
+     }
+   else
+     {
+        if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX))
+          {
+             rsd->selected_index = last_index + 1;
+             _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+             _page_animation_run(rsd, EINA_TRUE);
+             _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+             evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+          }
+     }
+   return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
 static void
 _dnd_end(Eext_Rotary_Selector_Data *data)
 {
    Eext_Rotary_Selector_Data *rsd = data;
 
    rsd->drag_done = EINA_TRUE;
+
+   elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                             ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
+
    if (rsd->stand_timer)
      {
         ecore_timer_del(rsd->stand_timer);
@@ -874,6 +936,9 @@ _item_longpress_cb(void *data)
    rsd->on_delete_icon = EINA_FALSE;
    rsd->drag_done = EINA_FALSE;
 
+   elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                             ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
+
    _image_create_icon(rsd);
 
    rsd->longpress_timer = NULL;
@@ -3137,64 +3202,6 @@ _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emissi
      }
 }
 
-static Evas_Event_Flags
-_on_flick_end_cb(void *data, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (!rsd) return EINA_FALSE;
-   Evas_Coord x_diff, y_diff;
-
-   if (rsd->previous_page_animator || rsd->next_page_animator)
-     return EVAS_EVENT_FLAG_ON_HOLD;
-
-   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
-
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int last_index = 0;
-   int previous_item_index = rsd->selected_index;
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   if (last_index > rsd->item_count - 1)
-     {
-        last_index = rsd->item_count - 1;
-     }
-
-   x_diff = p->momentum.x2 - p->momentum.x1;
-   y_diff = p->momentum.y2 - p->momentum.y1;
-
-   if (abs(x_diff) < abs(y_diff)) return EVAS_EVENT_FLAG_ON_HOLD;
-
-   if (p->momentum.x2 > p->momentum.x1) //right swipe
-     {
-        if (rsd->current_page > 0)
-          {
-             rsd->selected_index = first_index - 1;
-             _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-             _page_animation_run(rsd, EINA_FALSE);
-             _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
-             evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-          }
-     }
-   else
-     {
-        if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX))
-          {
-             rsd->selected_index = last_index + 1;
-             _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-             _page_animation_run(rsd, EINA_TRUE);
-             _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
-             evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-          }
-     }
-   return EVAS_EVENT_FLAG_ON_HOLD;
-}
-
 // ----------------------------------------- public API implementation --------------------------------------//
 EAPI Evas_Object *
 eext_rotary_selector_add(Evas_Object *parent)