diff options
author | Sergey Pisarchik <pisarchik@mapswithme.com> | 2014-06-30 01:09:12 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:19:16 +0300 |
commit | f0ec95b281860951d63ed30dacd5bab08ceeb99d (patch) | |
tree | 3ba33517a8c381b019b3e3bbc2595196ba670888 /tizen | |
parent | b06194d56c4ce056d0a03957fb0cfaaa88903a38 (diff) |
[Tizen]
Scale on doubleclick.
Rewrited navigation (move, rotate, etc). Now works more stable.
Diffstat (limited to 'tizen')
-rw-r--r-- | tizen/MapsWithMe/inc/Constants.hpp | 3 | ||||
-rw-r--r-- | tizen/MapsWithMe/inc/TouchProcessor.cpp | 167 | ||||
-rw-r--r-- | tizen/MapsWithMe/inc/TouchProcessor.hpp | 22 | ||||
-rw-r--r-- | tizen/MapsWithMe/src/Constants.cpp | 2 |
4 files changed, 136 insertions, 58 deletions
diff --git a/tizen/MapsWithMe/inc/Constants.hpp b/tizen/MapsWithMe/inc/Constants.hpp index ca179465e8..4855ba9a4c 100644 --- a/tizen/MapsWithMe/inc/Constants.hpp +++ b/tizen/MapsWithMe/inc/Constants.hpp @@ -49,4 +49,7 @@ extern int const distanceWidth; // bookmark categories extern int const deleteWidth; +//timer +extern int const double_click_timout; + }//consts diff --git a/tizen/MapsWithMe/inc/TouchProcessor.cpp b/tizen/MapsWithMe/inc/TouchProcessor.cpp index 804a1baefb..9275b8b380 100644 --- a/tizen/MapsWithMe/inc/TouchProcessor.cpp +++ b/tizen/MapsWithMe/inc/TouchProcessor.cpp @@ -1,6 +1,7 @@ #include "TouchProcessor.hpp" #include "MapsWithMeForm.hpp" #include "Framework.hpp" +#include "Constants.hpp" #include "../../../map/framework.hpp" #include "../../../gui/controller.hpp" @@ -11,15 +12,15 @@ using namespace Tizen::Ui; using Tizen::Ui::TouchEventManager; using namespace Tizen::Graphics; +using namespace Tizen::Base::Runtime; +using namespace consts; using Tizen::Base::Collection::IListT; namespace detail { -typedef vector<pair<double, double> > TPointPairs; - -TPointPairs GetTouchedPoints(Rectangle const & rect) +TouchProcessor::TPointPairs GetTouchedPoints(Rectangle const & rect) { - TPointPairs res; + TouchProcessor::TPointPairs res; IListT<TouchEventInfo *> * pList = TouchEventManager::GetInstance()->GetTouchInfoListN(); if (pList) { @@ -41,32 +42,75 @@ TPointPairs GetTouchedPoints(Rectangle const & rect) using namespace detail; - TouchProcessor::TouchProcessor(MapsWithMeForm * pForm) -:m_pForm(pForm) +:m_state(st_empty), + m_pForm(pForm) { + m_timer.Construct(*this); +} +void TouchProcessor::StartMove(TPointPairs const & pts) +{ + ::Framework * pFramework = tizen::Framework::GetInstance(); + if (pts.size() == 1) + { + pFramework->StartDrag(DragEvent(m_startTouchPoint.first, m_startTouchPoint.second)); + pFramework->DoDrag(DragEvent(pts[0].first, pts[0].second)); + m_state = st_moving; + } + else if (pts.size() > 1) + { + pFramework->StartScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); + m_state = st_rotating; + } } + void TouchProcessor::OnTouchPressed(Tizen::Ui::Control const & source, Point const & currentPosition, Tizen::Ui::TouchEventInfo const & touchInfo) { - m_wasLongPress = false; - TPointPairs pts = detail::GetTouchedPoints(m_pForm->GetClientAreaBounds()); - ::Framework * pFramework = tizen::Framework::GetInstance(); - // pFramework->GetBalloonManager().OnShowMark(pFramework->GetUserMark(m2::PointD(pts[0].first, pts[0].second), false)); + m_bWasReleased = false; + m_prev_pts = detail::GetTouchedPoints(m_pForm->GetClientAreaBounds()); + m_startTouchPoint = make_pair(m_prev_pts[0].first, m_prev_pts[0].second); - m_startTouchPoint = make_pair(pts[0].first, pts[0].second); - if (!pFramework->GetGuiController()->OnTapStarted(m2::PointD(pts[0].first, pts[0].second))) + if (m_state == st_waitTimer) // double click { - if (pts.size() == 1) - pFramework->StartDrag(DragEvent(pts[0].first, pts[0].second)); - else if (pts.size() > 1) - pFramework->StartScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); + m_state = st_empty; + ::Framework * pFramework = tizen::Framework::GetInstance(); + pFramework->ScaleToPoint(ScaleToPointEvent(m_prev_pts[0].first, m_prev_pts[0].second, 2.0)); + m_timer.Cancel(); + return; } + else + { + m_state = st_waitTimer; + m_timer.Start(double_click_timout); + } +} - std::swap(m_prev_pts, pts); +void TouchProcessor::OnTimerExpired (Timer &timer) +{ + if (m_state != st_waitTimer) + LOG(LERROR, ("Undefined behavior, on timer")); + + m_state = st_empty; + if (m_prev_pts.empty()) + return; + ::Framework * pFramework = tizen::Framework::GetInstance(); + if (pFramework->GetGuiController()->OnTapStarted(m2::PointD(m_startTouchPoint.first, m_startTouchPoint.second))) + { + pFramework->GetGuiController()->OnTapEnded(m2::PointD(m_startTouchPoint.first, m_startTouchPoint.second)); + } + else if (m_bWasReleased) + { + pFramework->GetBalloonManager().OnShowMark(pFramework->GetUserMark(m2::PointD(m_startTouchPoint.first, m_startTouchPoint.second), false)); + m_bWasReleased = false; + } + else + { + StartMove(m_prev_pts); + } } void TouchProcessor::OnTouchLongPressed(Tizen::Ui::Control const & source, @@ -82,42 +126,58 @@ void TouchProcessor::OnTouchLongPressed(Tizen::Ui::Control const & source, } } -void TouchProcessor::OnTouchDoublePressed(Tizen::Ui::Control const & source, - Tizen::Graphics::Point const & currentPosition, - Tizen::Ui::TouchEventInfo const & touchInfo) -{ - ::Framework * pFramework = tizen::Framework::GetInstance(); - pFramework->ScaleDefault(true); - -} - void TouchProcessor::OnTouchMoved(Tizen::Ui::Control const & source, Point const & currentPosition, Tizen::Ui::TouchEventInfo const & touchInfo) { + if (m_state == st_empty) + { + LOG(LERROR, ("Undefined behavior, OnTouchMoved")); + return; + } + TPointPairs pts = detail::GetTouchedPoints(m_pForm->GetClientAreaBounds()); + if (pts.empty()) + return; + ::Framework * pFramework = tizen::Framework::GetInstance(); + if (m_state == st_waitTimer) + { + double dist = sqrt(pow(pts[0].first - m_startTouchPoint.first, 2) + pow(pts[0].second - m_startTouchPoint.second, 2)); + if (dist > 20) + { + m_timer.Cancel(); + StartMove(pts); + } + else + return; + } - if (!pFramework->GetGuiController()->OnTapMoved(m2::PointD(pts[0].first, pts[0].second))) + if (pts.size() == 1) { - if (pts.size() == 1 && m_prev_pts.size() > 1) + if (m_state == st_rotating) { - pFramework->StopScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); + pFramework->StopScale(ScaleEvent(m_prev_pts[0].first, m_prev_pts[0].second, m_prev_pts[1].first, m_prev_pts[1].second)); pFramework->StartDrag(DragEvent(pts[0].first, pts[0].second)); } - else if (pts.size() == 1) + else if (m_state == st_moving) { pFramework->DoDrag(DragEvent(pts[0].first, pts[0].second)); } - else if (pts.size() > 1 && m_prev_pts.size() == 1) + m_state = st_moving; + } + else if (pts.size() > 1) + { + if (m_state == st_rotating) { - pFramework->StopDrag(DragEvent(m_prev_pts[0].first, m_prev_pts[0].second)); - pFramework->StartScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); + pFramework->DoScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); } - else if (pts.size() > 1) + else if (m_state == st_moving) { - pFramework->DoScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); + pFramework->StopDrag(DragEvent(m_prev_pts[0].first, m_prev_pts[0].second)); + pFramework->StartScale(ScaleEvent(pts[0].first, pts[0].second, pts[1].first, pts[1].second)); } + m_state = st_rotating; } std::swap(m_prev_pts, pts); } @@ -126,27 +186,26 @@ void TouchProcessor::OnTouchReleased(Tizen::Ui::Control const & source, Point const & currentPosition, Tizen::Ui::TouchEventInfo const & touchInfo) { - TPointPairs pts = detail::GetTouchedPoints(m_pForm->GetClientAreaBounds()); - ::Framework * pFramework = tizen::Framework::GetInstance(); + if (m_state == st_empty) + { + LOG(LERROR, ("Undefined behavior")); + return; + } + if (m_state == st_waitTimer) + { + m_bWasReleased = true; + return; + } - //using prev_pts because pts contains not all points - if (!m_prev_pts.empty()) + ::Framework * pFramework = tizen::Framework::GetInstance(); + if (m_state == st_moving) { - pair<double, double> cur = make_pair(m_prev_pts[0].first, m_prev_pts[0].second); - double dist = sqrt(pow(cur.first - m_startTouchPoint.first, 2) + pow(cur.second - m_startTouchPoint.second, 2)); - if (dist < 20 && !m_wasLongPress) - { - ::Framework * pFramework = tizen::Framework::GetInstance(); - pFramework->GetBalloonManager().OnShowMark(pFramework->GetUserMark(m2::PointD(m_startTouchPoint.first, m_startTouchPoint.second), false)); - } - if (!pFramework->GetGuiController()->OnTapEnded(m2::PointD(m_prev_pts[0].first, m_prev_pts[0].second))) - { - if (m_prev_pts.size() == 1) - pFramework->StopDrag(DragEvent(m_prev_pts[0].first, m_prev_pts[0].second)); - else if (m_prev_pts.size() > 1) - pFramework->StopScale(ScaleEvent(m_prev_pts[0].first, m_prev_pts[0].second, m_prev_pts[1].first, m_prev_pts[1].second)); - } - m_prev_pts.clear(); + pFramework->StopDrag(DragEvent(m_prev_pts[0].first, m_prev_pts[0].second)); + } + else if (m_state == st_rotating) + { + pFramework->StopScale(ScaleEvent(m_prev_pts[0].first, m_prev_pts[0].second, m_prev_pts[1].first, m_prev_pts[1].second)); } + m_state = st_empty; } diff --git a/tizen/MapsWithMe/inc/TouchProcessor.hpp b/tizen/MapsWithMe/inc/TouchProcessor.hpp index 6dc26a061a..a7ba759892 100644 --- a/tizen/MapsWithMe/inc/TouchProcessor.hpp +++ b/tizen/MapsWithMe/inc/TouchProcessor.hpp @@ -1,12 +1,14 @@ #pragma once #include <FUiITouchEventListener.h> + #include "../../../std/utility.hpp" #include "../../../std/vector.hpp" class MapsWithMeForm; class TouchProcessor: public Tizen::Ui::ITouchEventListener + , public Tizen::Base::Runtime::ITimerEventListener { public: TouchProcessor(MapsWithMeForm * pForm); @@ -29,14 +31,26 @@ public: virtual void OnTouchLongPressed(Tizen::Ui::Control const & source, Tizen::Graphics::Point const & currentPosition, Tizen::Ui::TouchEventInfo const & touchInfo); - virtual void OnTouchDoublePressed(Tizen::Ui::Control const & source, - Tizen::Graphics::Point const & currentPosition, - Tizen::Ui::TouchEventInfo const & touchInfo); + // ITimerEventListener + virtual void OnTimerExpired (Tizen::Base::Runtime::Timer & timer); + + typedef vector<pair<double, double> > TPointPairs; private: - MapsWithMeForm * m_pForm; + void StartMove(TPointPairs const & pts); + enum EState + { + st_waitTimer, + st_moving, + st_rotating, + st_empty + }; + EState m_state; + MapsWithMeForm * m_pForm; bool m_wasLongPress; + bool m_bWasReleased; pair<double, double> m_startTouchPoint; vector<pair<double, double> > m_prev_pts; + Tizen::Base::Runtime::Timer m_timer; }; diff --git a/tizen/MapsWithMe/src/Constants.cpp b/tizen/MapsWithMe/src/Constants.cpp index 08b385f5eb..3ef3b58bc9 100644 --- a/tizen/MapsWithMe/src/Constants.cpp +++ b/tizen/MapsWithMe/src/Constants.cpp @@ -46,4 +46,6 @@ const char * BM_COLOR_PINK = "placemark-pink"; int const distanceWidth = 200; // bookmark categories int const deleteWidth = 200; + +int const double_click_timout = 200; } |