[Porting_2.4_UI_to_3.0] Tab Manager - delete tab with horizontal swipe 88/82988/5
authorm.kawonczyk <m.kawonczyk@samsung.com>
Mon, 8 Aug 2016 12:00:56 +0000 (14:00 +0200)
committerHye Kyoung Hwang <cookie@samsung.com>
Thu, 11 Aug 2016 00:52:31 +0000 (17:52 -0700)
[Issue]        http://suprem.sec.samsung.net/jira/browse/TWF-1869
[Problem]      Tab was not deleted when it was swiped.
[Solution]     Add gesture layer to genlist item.
[Verify]       Open tab manager. Try removing item with horizontal
               swipe.

Change-Id: I282b32f16e45e8c455fe57ec1b7d04e5f037b456

services/TabUI/TabUI.cpp
services/TabUI/TabUI.h

index 9cd6a149cc5a7bce41a0f9c34b47201f8a1ba167..c93829e9d47e1c6f8fe32ca95477c8aadc3a64ca 100644 (file)
@@ -37,6 +37,7 @@ TabUI::TabUI()
     , m_gengrid(nullptr)
     , m_empty_layout(nullptr)
     , m_itemToShow(nullptr)
+    , m_last_pressed_gengrid_item(nullptr)
     , m_item_class(nullptr)
 {
     m_edjFilePath = EDJE_DIR;
@@ -274,6 +275,25 @@ void TabUI::_cm_close_clicked(void* data, Evas_Object*, void*)
     }
 }
 
+Evas_Event_Flags TabUI::_gesture_occured(void * data, void * event_info)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    auto flag = EVAS_EVENT_FLAG_NONE;
+    if (data && event_info) {
+        auto tabUI = static_cast<TabUI*>(data);
+        auto info = static_cast<Elm_Gesture_Line_Info*>(event_info);
+        if (info->momentum.mx != 0) {
+            //ignore too small gestures
+            if (abs(info->momentum.mx) < tabUI->GESTURE_MOMENTUM_MIN)
+                return flag;
+            tabUI->_close_tab_clicked(data, nullptr, nullptr);
+        }
+    } else {
+        BROWSER_LOGW("[%s] data or event_info = nullptr", __PRETTY_FUNCTION__);
+    }
+    return flag;
+}
+
 void TabUI::_new_tab_clicked(void * data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -367,6 +387,11 @@ Evas_Object * TabUI::_gengrid_content_get(void *data, Evas_Object *obj, const ch
             auto button = elm_button_add(obj);
             elm_object_style_set(button, "invisible_button");
             evas_object_smart_callback_add(button, "clicked", _gengrid_tab_clicked, data);
+
+            auto gesture = elm_gesture_layer_add(obj);
+            elm_gesture_layer_attach(gesture, button);
+            elm_gesture_layer_cb_add(gesture, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_MOVE,
+                _gesture_occured, data);
             return button;
         }
     } else {
@@ -375,11 +400,13 @@ Evas_Object * TabUI::_gengrid_content_get(void *data, Evas_Object *obj, const ch
     return nullptr;
 }
 
-void TabUI::_gengrid_tab_pressed(void *, Evas_Object *, void *event_info)
+void TabUI::_gengrid_tab_pressed(void *data, Evas_Object *, void *event_info)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (event_info) {
         auto object_item = static_cast<Elm_Object_Item*>(event_info);
+        auto tabUI = static_cast<TabUI*>(data);
+        tabUI->m_last_pressed_gengrid_item = object_item;
         elm_object_signal_emit(
             elm_object_item_part_content_get(object_item, "elm.icon"),
             "on_mouse_down", "ui");
@@ -419,6 +446,17 @@ void TabUI::_close_tab_clicked(void *data, Evas_Object*, void*)
         TabData* itemData = static_cast<TabData*>(data);
 
         Elm_Object_Item* it = elm_gengrid_selected_item_get(itemData->tabUI->m_gengrid);
+
+        if (!it && itemData->tabUI->m_last_pressed_gengrid_item) {
+            it = itemData->tabUI->m_last_pressed_gengrid_item;
+            itemData->tabUI->m_last_pressed_gengrid_item = nullptr;
+        }
+
+        if (!it) {
+            BROWSER_LOGE("[%s] Delete called without selected and pressed item", __PRETTY_FUNCTION__);
+            return;
+        }
+
         auto prev = elm_gengrid_item_prev_get(it);
         auto next = elm_gengrid_item_next_get(it);
         elm_object_item_del(it);
index 0abc8512e579ec6d1750c7c7d0771add6e4c461b..1008e11327249bb287383e53f0d0567529dcccbc 100644 (file)
@@ -85,6 +85,7 @@ private:
     static void _cm_sync_clicked(void*, Evas_Object*, void*);
     static void _cm_secret_clicked(void*, Evas_Object*, void*);
     static void _cm_close_clicked(void*, Evas_Object*, void*);
+    static Evas_Event_Flags _gesture_occured(void * data, void * event_info);
 
     SharedNaviframeWrapper m_naviframe;
     void createTabUILayout();
@@ -102,6 +103,7 @@ private:
     Evas_Object *m_empty_layout;
 
     Elm_Object_Item* m_itemToShow;
+    Elm_Object_Item* m_last_pressed_gengrid_item;
 
     Elm_Gengrid_Item_Class * m_item_class;
     std::string m_edjFilePath;
@@ -110,6 +112,7 @@ private:
     const unsigned int GENGRID_ITEM_HEIGHT = 312;
     const unsigned int GENGRID_ITEM_WIDTH_LANDSCAPE = 636;
     const unsigned int GENGRID_ITEM_HEIGHT_LANDSCAPE = 274;
+    const unsigned int GESTURE_MOMENTUM_MIN = 2000;
 };
 }
 }