wearable/rotaryselector: Add flick support 11/203911/1
authorShilpa Singh <shilpa.singh@samsung.com>
Tue, 14 Aug 2018 08:20:37 +0000 (13:50 +0530)
committerTaehyub Kim <taehyub.kim@samsung.com>
Thu, 18 Apr 2019 05:46:15 +0000 (14:46 +0900)
product patch: http://slp-info.sec.samsung.net/gerrit/#/c/3251930/

Change-Id: If1144bd921010dac4c87a9ae13ea5f24e802a8b3
Signed-off-by: Shilpa Singh <shilpa.singh@samsung.com>
inc/wearable/efl_extension_common_private.h
src/wearable/efl_extension_rotary_selector.c

index b272613edda6dfbe1df70717f98d3e6e1e2609bd..3c8e93082dce16a2f17295ab75a869be7199577c 100644 (file)
@@ -109,6 +109,7 @@ struct _Eext_Rotary_Selector_Data {
    Evas_Object *parent;
    Evas_Object *rotary_selector;
    Evas_Object *event_area;
+   Evas_Object *gesture_layer;
    Eina_List *item_list;
    int item_count;
    int selected_index;
index ce281798c3a7798c2c4942f86d2ad2ab55613ac6..180f6e148b1744c4750749dd3398c6028caeac17 100644 (file)
@@ -3129,6 +3129,64 @@ _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)
@@ -3159,6 +3217,11 @@ eext_rotary_selector_add(Evas_Object *parent)
 
    evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
 
+   rsd->gesture_layer = elm_gesture_layer_add(rotary_selector);
+   elm_gesture_layer_attach(rsd->gesture_layer, rotary_selector);
+   elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                            ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
+
    edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
    edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);