From 6f608be73d1cb443587ea33c0a00d83b24bdbd0f Mon Sep 17 00:00:00 2001 From: vng Date: Mon, 17 May 2021 21:30:10 +0300 Subject: [PATCH] Fixed bug with viewport centering for ShowMapForURL. Signed-off-by: vng --- map/framework.cpp | 19 +++++++++++++------ map/map_tests/mwm_url_tests.cpp | 9 +-------- map/mwm_url.cpp | 10 +++++----- map/mwm_url.hpp | 3 ++- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/map/framework.cpp b/map/framework.cpp index 8cc3786d02..0837b35c1e 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1767,7 +1767,7 @@ void Framework::SetWidgetLayout(gui::TWidgetsLayoutInfo && layout) bool Framework::ShowMapForURL(string const & url) { m2::PointD point; - m2::RectD rect; + double scale; string name; ApiMarkPoint const * apiMark = nullptr; @@ -1782,15 +1782,18 @@ bool Framework::ShowMapForURL(string const & url) if (parser.Parse(url, parseResult)) { point = mercator::FromLatLon(parseResult.m_lat, parseResult.m_lon); - rect = df::GetRectForDrawScale(parseResult.m_zoomLevel, point); + scale = parseResult.m_zoomLevel; name = move(parseResult.m_name); result = NEED_CLICK; } } else if (m_parsedMapApi.IsValid()) { - if (!m_parsedMapApi.GetViewportRect(rect)) - rect = df::GetWorldRect(); + if (!m_parsedMapApi.GetViewportParams(point, scale)) + { + point = {0, 0}; + scale = 0; + } apiMark = m_parsedMapApi.GetSinglePoint(); result = apiMark ? NEED_CLICK : NO_NEED_CLICK; @@ -1801,7 +1804,7 @@ bool Framework::ShowMapForURL(string const & url) if (info.IsValid()) { point = mercator::FromLatLon(info.m_lat, info.m_lon); - rect = df::GetRectForDrawScale(info.m_zoom, point); + scale = info.m_zoom; result = NEED_CLICK; } } @@ -1813,7 +1816,11 @@ bool Framework::ShowMapForURL(string const & url) // Set viewport and stop follow mode. StopLocationFollow(); - ShowRect(rect); + + // ShowRect function interferes with ActivateMapSelection and we have strange behaviour as a result. + // Use more obvious SetModelViewCenter here. + if (m_drapeEngine) + m_drapeEngine->SetModelViewCenter(point, scale, true, true); if (result != NO_NEED_CLICK) { diff --git a/map/map_tests/mwm_url_tests.cpp b/map/map_tests/mwm_url_tests.cpp index 81aba0f669..16e48741db 100644 --- a/map/map_tests/mwm_url_tests.cpp +++ b/map/map_tests/mwm_url_tests.cpp @@ -47,16 +47,10 @@ public: m_m = &m_framework.GetBookmarkManager(); m_api.SetBookmarkManager(m_m); - auto const res = m_api.SetUrlAndParse(urlString); - if (res.m_isSuccess) - { - if (!m_api.GetViewportRect(m_viewportRect)) - m_viewportRect = df::GetWorldRect(); - } + m_api.SetUrlAndParse(urlString); } bool IsValid() const { return m_api.IsValid(); } - m2::RectD GetViewport() const { return m_viewportRect; } string const & GetAppTitle() const { return m_api.GetAppTitle(); } bool GoBackOnBalloonClick() const { return m_api.GoBackOnBalloonClick(); } @@ -107,7 +101,6 @@ private: private: Framework m_framework; ParsedMapApi m_api; - m2::RectD m_viewportRect; BookmarkManager * m_m; }; diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp index 4ce4671b4c..582ea513f8 100644 --- a/map/mwm_url.cpp +++ b/map/mwm_url.cpp @@ -376,14 +376,13 @@ void ParsedMapApi::Reset() m_isValid = false; } -bool ParsedMapApi::GetViewportRect(m2::RectD & rect) const +bool ParsedMapApi::GetViewportParams(m2::PointD & center, double & scale) const { - ASSERT(m_bmManager != nullptr, ()); auto const & markIds = m_bmManager->GetUserMarkIds(UserMark::Type::API); if (markIds.size() == 1 && m_zoomLevel >= 1) { - double zoom = min(static_cast(scales::GetUpperComfortScale()), m_zoomLevel); - rect = df::GetRectForDrawScale(zoom, m_bmManager->GetUserMark(*markIds.begin())->GetPivot()); + scale = min(static_cast(scales::GetUpperComfortScale()), m_zoomLevel); + center = m_bmManager->GetUserMark(*markIds.begin())->GetPivot(); return true; } else @@ -394,7 +393,8 @@ bool ParsedMapApi::GetViewportRect(m2::RectD & rect) const if (result.IsValid()) { - rect = result; + center = result.Center(); + scale = df::GetDrawTileScale(result); return true; } diff --git a/map/mwm_url.hpp b/map/mwm_url.hpp index 801b2f7d7e..2060692a09 100644 --- a/map/mwm_url.hpp +++ b/map/mwm_url.hpp @@ -75,7 +75,8 @@ public: bool GoBackOnBalloonClick() const { return m_goBackOnBalloonClick; } /// @name Used in settings map viewport after invoking API. - bool GetViewportRect(m2::RectD & rect) const; + bool GetViewportParams(m2::PointD & center, double & scale) const; + ApiMarkPoint const * GetSinglePoint() const; std::vector const & GetRoutePoints() const { return m_routePoints; } std::string const & GetRoutingType() const { return m_routingType; }