TizenRefApp-8359 [Gallery] Add parsing Hold gesture into TouchParser 51/124551/1
authorIgor Nazarov <i.nazarov@samsung.com>
Tue, 11 Apr 2017 15:29:38 +0000 (18:29 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Tue, 11 Apr 2017 15:29:38 +0000 (18:29 +0300)
- Added Tap and Hold gesture to the ToouchParser;
- Integrated Tap and Hold gesture into ImageGrid.

Change-Id: Ie7081a8cb5ccdd08a53e236cfcc58af4880e07a8

inc/view/ImageGrid.h
inc/view/TouchParser.h
src/view/ImageGrid.cpp
src/view/TouchParser.cpp

index d251b86537665ffe417bd7c1d47b26b66124b266..9c7756c7f445d0baddc6cfca052f68f72cb545e1 100644 (file)
@@ -34,7 +34,8 @@ namespace gallery {
 
                enum ItemEvent {
                        ITEM_EVENT_CLICK,
-                       ITEM_EVENT_DOUBLE_TAP
+                       ITEM_EVENT_DOUBLE_TAP,
+                       ITEM_EVENT_TAP_AND_HOLD
                };
 
                class Builder {
index 98334e530d9b2867b2ce85d8612eeb062d2ba003..6551e3c8fbbef62f862264e7f69555b9c85e8d97 100644 (file)
@@ -35,6 +35,7 @@ namespace gallery {
        public:
                void setTapHandler(TapHandler handler);
                void setDoubleTapHandler(TapHandler handler);
+               void setTapAndHoldHandler(TapHandler handler);
 
        private:
                void onMouseDown(ucl::Widget &widget, void *eventInfo);
@@ -46,9 +47,15 @@ namespace gallery {
                bool isFastTap(ucl::UInt curTime, int curX, int curY) const;
                double calcDownDistance(int curX, int curY) const;
 
+               void restartHoldTimer();
+               void stopHoldTimer();
+               Eina_Bool onHoldTimer();
+
        private:
                TapHandler m_tapHandler;
                TapHandler m_doubleTapHandler;
+               TapHandler m_tapAndHoldHandler;
+               Ecore_Timer *m_holdTimer;
                ucl::UInt m_downTime;
                int m_downX;
                int m_downY;
index da5b42798e2f5c52500929fad152da9f359679e7..adb8791a4e0e4f09eee828b88bb234ef06bee941 100644 (file)
@@ -244,6 +244,8 @@ namespace gallery {
                                m_touchParser = makeShared<TouchParser>(m_btn);
                                m_touchParser->setDoubleTapHandler(
                                                DELEGATE(Item::onDoubleTap, this));
+                               m_touchParser->setTapAndHoldHandler(
+                                               DELEGATE(Item::onTapAndHold, this));
                        }
 
                        Widget &getWidget()
@@ -402,6 +404,14 @@ namespace gallery {
                                }
                        }
 
+                       void onTapAndHold(const int x, const int y)
+                       {
+                               if (isRealized()) {
+                                       m_imageGrid.handleItemEvent(m_realizeIndex,
+                                                       ITEM_EVENT_TAP_AND_HOLD, x, y);
+                               }
+                       }
+
                private:
                        const ImageGrid &m_imageGrid;
                        StyledWidget m_btn;
index ed1d6003108451597d8655c342afabb1f7c4ea37..119a7ebc6b21b8b6abaf0034d067360c04f16c8a 100644 (file)
@@ -23,6 +23,7 @@ namespace gallery { namespace { namespace impl {
        constexpr auto TAP_MOVE_THRESHOLD = 30;
        constexpr auto FAST_TAP_DISTANCE = 60;
        constexpr auto FAST_TAP_DELAY_MS = 300;
+       constexpr auto TAP_AND_HOLD_DELAY_SEC = (500.0 / 1000.0);
 }}}
 
 namespace gallery {
@@ -31,6 +32,7 @@ namespace gallery {
 
        TouchParser::TouchParser(RefCountObjBase &rc, Widget &eventSource) :
                RefCountAware(&rc),
+               m_holdTimer(nullptr),
                m_downTime(0),
                m_downX(0),
                m_downY(0),
@@ -50,6 +52,7 @@ namespace gallery {
 
        TouchParser::~TouchParser()
        {
+               stopHoldTimer();
        }
 
        void TouchParser::setTapHandler(TapHandler handler)
@@ -62,6 +65,11 @@ namespace gallery {
                m_doubleTapHandler = handler;
        }
 
+       void TouchParser::setTapAndHoldHandler(TapHandler handler)
+       {
+               m_tapAndHoldHandler = handler;
+       }
+
        void TouchParser::onMouseDown(Widget &widget, void *eventInfo)
        {
                if (m_isMouseDown) {
@@ -73,6 +81,7 @@ namespace gallery {
 
                if (!isFastTap(e->timestamp, e->canvas.x, e->canvas.y)) {
                        m_tapCounter = 0;
+                       restartHoldTimer();
                } else if (m_doubleTapHandler && (m_tapCounter == 1)) {
                        m_doubleTapHandler(m_downX, m_downY);
                }
@@ -92,6 +101,7 @@ namespace gallery {
 
                const auto e = static_cast<Evas_Event_Mouse_Up *>(eventInfo);
 
+               stopHoldTimer();
                updateIsTapPossible(e->event_flags, e->canvas.x, e->canvas.y);
 
                if (!m_isTapPossible) {
@@ -115,6 +125,10 @@ namespace gallery {
                const auto e = static_cast<Evas_Event_Mouse_Move *>(eventInfo);
 
                updateIsTapPossible(e->event_flags, e->cur.canvas.x, e->cur.canvas.y);
+
+               if (!m_isTapPossible) {
+                       stopHoldTimer();
+               }
        }
 
        void TouchParser::updateIsTapPossible(const int flags,
@@ -144,4 +158,28 @@ namespace gallery {
 
                return sqrt(1.0 * dx * dx + 1.0 * dy * dy);
        }
+
+       void TouchParser::restartHoldTimer()
+       {
+               stopHoldTimer();
+               m_holdTimer = ecore_timer_add(impl::TAP_AND_HOLD_DELAY_SEC,
+                               CALLBACK_A(TouchParser::onHoldTimer), this);
+       }
+
+       void TouchParser::stopHoldTimer()
+       {
+               if (m_holdTimer) {
+                       ecore_timer_del(m_holdTimer);
+                       m_holdTimer = nullptr;
+               }
+       }
+
+       Eina_Bool TouchParser::onHoldTimer()
+       {
+               m_holdTimer = nullptr;
+               if (m_tapAndHoldHandler) {
+                       m_tapAndHoldHandler(m_downX, m_downY);
+               }
+               return ECORE_CALLBACK_CANCEL;
+       }
 }