diff --git a/map/framework.cpp b/map/framework.cpp index 5e35baa118..0da79781d2 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -433,7 +433,7 @@ void Framework::CenterAndScaleViewport() m2::PointD const pt = m_locationState.Position(); m_navigator.CenterViewport(pt); - m2::RectD clipRect = m_navigator.Screen().ClipRect(); + m2::RectD clipRect = GetCurrentViewport(); double const xMinSize = theMetersFactor * max(m_locationState.ErrorRadius(), MercatorBounds::ConvertMetresToX(pt.x, m_metresMinWidth)); @@ -689,12 +689,12 @@ search::Engine * Framework::GetSearchEngine() void Framework::PrepareSearch(bool nearMe, double lat, double lon) { - GetSearchEngine()->PrepareSearch(m_navigator.Screen().ClipRect(), nearMe, lat, lon); + GetSearchEngine()->PrepareSearch(GetCurrentViewport(), nearMe, lat, lon); } void Framework::Search(search::SearchParams const & params) { - GetSearchEngine()->Search(params); + GetSearchEngine()->Search(params, GetCurrentViewport()); } bool Framework::GetCurrentPosition(double & lat, double & lon) diff --git a/map/framework.hpp b/map/framework.hpp index 7c11072f53..98b8b1e59d 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -139,6 +139,7 @@ public: bool isTiling); private: + inline m2::RectD GetCurrentViewport() const { return m_navigator.Screen().ClipRect(); } search::Engine * GetSearchEngine(); public: void PrepareSearch(bool nearMe, double lat = 0.0, double lon = 0.0); diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 7b3c4de28a..2f23314703 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -110,14 +110,24 @@ void Engine::PrepareSearch(m2::RectD const & viewport, bool nearMe, GetPlatform().RunAsync(bind(&Engine::SetViewportAsync, this, r)); } -void Engine::Search(SearchParams const & params) +void Engine::Search(SearchParams const & params, m2::RectD const & viewport) { + Platform & p = GetPlatform(); + { threads::MutexGuard guard(m_updateMutex); + + // if we need to restore viewport search ... + bool const changed = ((m_params.m_mode != params.m_mode) && !params.IsNearMeMode()); + m_params = params; + + // ... so update current viewport + if (changed) + p.RunAsync(bind(&Engine::SetViewportAsync, this, viewport)); } - GetPlatform().RunAsync(bind(&Engine::SearchAsync, this)); + p.RunAsync(bind(&Engine::SearchAsync, this)); } void Engine::SetViewportAsync(m2::RectD const & viewport) diff --git a/search/search_engine.hpp b/search/search_engine.hpp index d0c518dcc5..4d1efbb5f5 100644 --- a/search/search_engine.hpp +++ b/search/search_engine.hpp @@ -42,7 +42,7 @@ public: void PrepareSearch(m2::RectD const & viewport, bool nearMe, double lat, double lon); - void Search(SearchParams const & params); + void Search(SearchParams const & params, m2::RectD const & viewport); string GetCountryFile(m2::PointD const & pt) const;