From be152241df15f6209a8d0045ad3e880e5fa85c15 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Thu, 7 Mar 2019 20:17:31 +0300 Subject: [PATCH] Added new user event Move for scrolling the map by buttons. --- drape_frontend/drape_engine.cpp | 5 +++++ drape_frontend/drape_engine.hpp | 1 + drape_frontend/user_event_stream.cpp | 22 ++++++++++++++++++++++ drape_frontend/user_event_stream.hpp | 25 ++++++++++++++++++++++++- map/framework.cpp | 6 ++++++ map/framework.hpp | 6 ++++++ 6 files changed, 64 insertions(+), 1 deletion(-) diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 12f6abe1a4..e160a79c73 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -188,6 +188,11 @@ void DrapeEngine::Scale(double factor, m2::PointD const & pxPoint, bool isAnim) AddUserEvent(make_unique_dp(factor, pxPoint, isAnim)); } +void DrapeEngine::Move(double factorX, double factorY, bool isAnim) +{ + AddUserEvent(make_unique_dp(factorX, factorY, isAnim)); +} + void DrapeEngine::SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, bool trackVisibleViewport) { diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 2c4f21fd43..af1423cc03 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -126,6 +126,7 @@ public: void AddTouchEvent(TouchEvent const & event); void Scale(double factor, m2::PointD const & pxPoint, bool isAnim); + void Move(double factorX, double factorY, bool isAnim); // If zoom == -1 then current zoom will not be changed. void SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index b62be4ea7d..07ad88ebc6 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -177,6 +177,13 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChanged, bool TouchCancel(m_touches); } break; + case UserEvent::EventType::Move: + { + ref_ptr moveEvent = make_ref(e); + breakAnim = OnMove(moveEvent); + TouchCancel(m_touches); + } + break; case UserEvent::EventType::Resize: { ref_ptr resizeEvent = make_ref(e); @@ -360,6 +367,21 @@ bool UserEventStream::OnSetScale(ref_ptr scaleEvent) return true; } +bool UserEventStream::OnMove(ref_ptr moveEvent) +{ + double const factorX = moveEvent->GetFactorX(); + double const factorY = moveEvent->GetFactorY(); + + ScreenBase screen; + GetTargetScreen(screen); + auto const & rect = screen.PixelRectIn3d(); + screen.Move(factorX * rect.SizeX(), -factorY * rect.SizeY()); + + ShrinkAndScaleInto(screen, df::GetWorldRect()); + + return SetScreen(screen, moveEvent->IsAnim()); +} + bool UserEventStream::OnSetAnyRect(ref_ptr anyRectEvent) { return SetRect(anyRectEvent->GetRect(), anyRectEvent->IsAnim(), anyRectEvent->FitInViewport()); diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index ac83bd4c00..9df9de03e8 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -40,7 +40,8 @@ public: Rotate, FollowAndRotate, AutoPerspective, - VisibleViewport + VisibleViewport, + Move }; virtual ~UserEvent() = default; @@ -134,6 +135,27 @@ private: bool m_isAnim; }; +class MoveEvent : public UserEvent +{ +public: + MoveEvent(double factorX, double factorY, bool isAnim) + : m_factorX(factorX) + , m_factorY(factorY) + , m_isAnim(isAnim) + {} + + EventType GetType() const override { return UserEvent::EventType::Move; } + + double GetFactorX() const { return m_factorX; } + double GetFactorY() const { return m_factorY; } + bool IsAnim() const { return m_isAnim; } + +private: + double m_factorX; + double m_factorY; + bool m_isAnim; +}; + class SetCenterEvent : public UserEvent { public: @@ -402,6 +424,7 @@ public: private: bool OnSetScale(ref_ptr scaleEvent); + bool OnMove(ref_ptr moveEvent); bool OnSetAnyRect(ref_ptr anyRectEvent); bool OnSetRect(ref_ptr rectEvent); bool OnSetCenter(ref_ptr centerEvent); diff --git a/map/framework.cpp b/map/framework.cpp index 94c214e911..8ca36d1b40 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1274,6 +1274,12 @@ void Framework::Scale(double factor, m2::PointD const & pxPoint, bool isAnim) m_drapeEngine->Scale(factor, pxPoint, isAnim); } +void Framework::Move(double factorX, double factorY, bool isAnim) +{ + if (m_drapeEngine != nullptr) + m_drapeEngine->Move(factorX, factorY, isAnim); +} + void Framework::TouchEvent(df::TouchEvent const & touch) { if (m_drapeEngine != nullptr) diff --git a/map/framework.hpp b/map/framework.hpp index c6c223fe2d..2cafbbe875 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -655,6 +655,12 @@ public: void Scale(double factor, bool isAnim); void Scale(double factor, m2::PointD const & pxPoint, bool isAnim); + /// Moves the viewport a distance of factorX * viewportWidth and factorY * viewportHeight. + /// E.g. factorX == 1.0 moves the map one screen size to the right, factorX == -0.5 moves the map + /// half screen size to the left, factorY == -2.0 moves the map two sizes down, + /// factorY = 1.5 moves the map one and a half size up. + void Move(double factorX, double factorY, bool isAnim); + void TouchEvent(df::TouchEvent const & touch); //@}