From dd66c58919eac45ed7950a86524c701f8daf7647 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 27 Mar 2019 18:53:11 +0300 Subject: [PATCH] Scrolling of map after object selection fixed. --- drape/overlay_tree.cpp | 13 +++++++++--- .../user_event_stream_tests.cpp | 2 +- drape_frontend/frontend_renderer.cpp | 18 ++++++++++++---- drape_frontend/frontend_renderer.hpp | 4 ++-- drape_frontend/user_event_stream.cpp | 21 +++++++------------ drape_frontend/user_event_stream.hpp | 4 ++-- 6 files changed, 37 insertions(+), 25 deletions(-) diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp index 7649ecb105..2eb8b78295 100644 --- a/drape/overlay_tree.cpp +++ b/drape/overlay_tree.cpp @@ -413,17 +413,24 @@ bool OverlayTree::GetSelectedFeatureRect(ScreenBase const & screen, m2::RectD & if (!m_selectedFeatureID.IsValid()) return false; - featureRect.MakeEmpty(); + auto resultRect = m2::RectD::GetEmptyRect(); for (auto const & handle : m_handlesCache) { CHECK(handle != nullptr, ()); if (handle->IsVisible() && handle->GetOverlayID().m_featureId == m_selectedFeatureID) { m2::RectD rect = handle->GetPixelRect(screen, screen.isPerspective()); - featureRect.Add(rect); + resultRect.Add(rect); } } - return true; + + if (resultRect.IsValid()) + { + featureRect = resultRect; + return true; + } + + return false; } void OverlayTree::Select(m2::PointD const & glbPoint, TOverlayContainer & result) const diff --git a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp index c3dca63aba..fa5474b6bc 100644 --- a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp +++ b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp @@ -37,7 +37,7 @@ public: void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const override {} void CorrectGlobalScalePoint(m2::PointD & pt) const override {} void OnScaleEnded() override {} - void OnTouchMapAction(df::TouchEvent::ETouchType touchType) override {} + void OnTouchMapAction(df::TouchEvent::ETouchType touchType, bool isMapTouch) override {} void OnAnimatedScaleEnded() override {} bool OnNewVisibleViewport(m2::RectD const & oldViewport, m2::RectD const & newViewport, m2::PointD & gOffset) override diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 72d7dd8e1d..f30e531b90 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1195,6 +1195,7 @@ bool FrontendRenderer::CheckTileGenerations(TileKey const & tileKey) void FrontendRenderer::OnCompassTapped() { m_myPositionController->OnCompassTapped(); + m_selectionTrackInfo.reset(); } FeatureID FrontendRenderer::GetVisiblePOI(m2::PointD const & pixelPoint) @@ -2001,6 +2002,7 @@ void FrontendRenderer::OnScaleEnded() m_myPositionController->ScaleEnded(); PullToBoundArea(false /* randomPlace */, false /* applyZoom */); m_firstLaunchAnimationInterrupted = true; + m_selectionTrackInfo.reset(); } void FrontendRenderer::OnAnimatedScaleEnded() @@ -2008,20 +2010,28 @@ void FrontendRenderer::OnAnimatedScaleEnded() m_myPositionController->ResetBlockAutoZoomTimer(); PullToBoundArea(false /* randomPlace */, false /* applyZoom */); m_firstLaunchAnimationInterrupted = true; + m_selectionTrackInfo.reset(); } -void FrontendRenderer::OnTouchMapAction(TouchEvent::ETouchType touchType) +void FrontendRenderer::OnTouchMapAction(TouchEvent::ETouchType touchType, bool isMapTouch) { // Here we block timer on start of touch actions. Timer will be unblocked on // the completion of touch actions. It helps to prevent the creation of redundant checks. auto const blockTimer = (touchType == TouchEvent::TOUCH_DOWN || touchType == TouchEvent::TOUCH_MOVE); m_myPositionController->ResetRoutingNotFollowTimer(blockTimer); - m_selectionTrackInfo.reset(); + if (isMapTouch) + m_selectionTrackInfo.reset(); } -bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport, - m2::RectD const & newViewport, m2::PointD & gOffset) +bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport, m2::RectD const & newViewport, + bool needOffset, m2::PointD & gOffset) { + if (!needOffset) + { + m_selectionTrackInfo.reset(); + return false; + } + gOffset = m2::PointD(0, 0); if (m_myPositionController->IsModeChangeViewport() || m_selectionShape == nullptr || oldViewport == newViewport || !m_selectionTrackInfo.is_initialized()) diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 14227e6651..6a1b191886 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -211,9 +211,9 @@ private: void CorrectGlobalScalePoint(m2::PointD & pt) const override; void OnScaleEnded() override; void OnAnimatedScaleEnded() override; - void OnTouchMapAction(TouchEvent::ETouchType touchType) override; + void OnTouchMapAction(TouchEvent::ETouchType touchType, bool isMapTouch) override; bool OnNewVisibleViewport(m2::RectD const & oldViewport, m2::RectD const & newViewport, - m2::PointD & gOffset) override; + bool needOffset, m2::PointD & gOffset) override; class Routine : public threads::IRoutine { diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 07ad88ebc6..3ad71b1dcc 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -434,6 +434,10 @@ bool UserEventStream::OnNewVisibleViewport(ref_ptr view m_visibleViewport = viewportEvent->GetRect(); m2::PointD gOffset; ScreenBase screen; + + auto const hasOffset = m_listener->OnNewVisibleViewport(prevVisibleViewport, m_visibleViewport, + !m_needTrackCenter, gOffset); + if (m_needTrackCenter) { GetTargetScreen(screen); @@ -441,7 +445,7 @@ bool UserEventStream::OnNewVisibleViewport(ref_ptr view ShrinkAndScaleInto(screen, df::GetWorldRect()); return SetScreen(screen, true /* isAnim */); } - else if (m_listener->OnNewVisibleViewport(prevVisibleViewport, m_visibleViewport, gOffset)) + else if (hasOffset) { screen = GetCurrentScreen(); screen.MoveG(gOffset); @@ -725,14 +729,14 @@ bool UserEventStream::ProcessTouch(TouchEvent const & touch) break; } + if (m_listener) + m_listener->OnTouchMapAction(touchEvent.GetTouchType(), isMapTouch); + return isMapTouch; } bool UserEventStream::TouchDown(array const & touches) { - if (m_listener) - m_listener->OnTouchMapAction(TouchEvent::TOUCH_DOWN); - size_t touchCount = GetValidTouchesCount(touches); bool isMapTouch = true; @@ -798,9 +802,6 @@ bool UserEventStream::CheckDrag(array const & touches, double threshol bool UserEventStream::TouchMove(array const & touches) { - if (m_listener) - m_listener->OnTouchMapAction(TouchEvent::TOUCH_MOVE); - double const kDragThreshold = pow(VisualParams::Instance().GetDragThreshold(), 2); size_t touchCount = GetValidTouchesCount(touches); bool isMapTouch = true; @@ -882,9 +883,6 @@ bool UserEventStream::TouchMove(array const & touches) bool UserEventStream::TouchCancel(array const & touches) { - if (m_listener) - m_listener->OnTouchMapAction(TouchEvent::TOUCH_CANCEL); - size_t touchCount = GetValidTouchesCount(touches); UNUSED_VALUE(touchCount); bool isMapTouch = true; @@ -926,9 +924,6 @@ bool UserEventStream::TouchCancel(array const & touches) bool UserEventStream::TouchUp(array const & touches) { - if (m_listener) - m_listener->OnTouchMapAction(TouchEvent::TOUCH_UP); - size_t touchCount = GetValidTouchesCount(touches); bool isMapTouch = true; switch (m_state) diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 9df9de03e8..09f7d3f4d1 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -377,10 +377,10 @@ public: virtual void OnScaleEnded() = 0; virtual void OnAnimatedScaleEnded() = 0; - virtual void OnTouchMapAction(TouchEvent::ETouchType touchType) = 0; + virtual void OnTouchMapAction(TouchEvent::ETouchType touchType, bool isMapTouch) = 0; virtual bool OnNewVisibleViewport(m2::RectD const & oldViewport, m2::RectD const & newViewport, - m2::PointD & gOffset) = 0; + bool needOffset, m2::PointD & gOffset) = 0; }; UserEventStream();