diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 2f23314703..59600a0349 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -117,14 +117,8 @@ void Engine::Search(SearchParams const & params, m2::RectD const & viewport) { 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)); + m_viewport = viewport; } p.RunAsync(bind(&Engine::SearchAsync, this)); @@ -151,14 +145,19 @@ void Engine::SearchAsync() // Get current search params. SearchParams params; + m2::RectD viewport; + { threads::MutexGuard updateGuard(m_updateMutex); params = m_params; + viewport = m_viewport; } // Initialize query. if (params.IsNearMeMode()) m_pQuery->SetViewport(GetViewportRect(params.m_lat, params.m_lon)); + else + m_pQuery->SetViewport(viewport); if (params.m_validPos) m_pQuery->SetPosition(GetViewportXY(params.m_lat, params.m_lon)); diff --git a/search/search_engine.hpp b/search/search_engine.hpp index 4d1efbb5f5..334fbeb983 100644 --- a/search/search_engine.hpp +++ b/search/search_engine.hpp @@ -55,6 +55,7 @@ private: threads::Mutex m_searchMutex, m_updateMutex; SearchParams m_params; + m2::RectD m_viewport; Index const * m_pIndex; scoped_ptr m_pQuery; diff --git a/search/search_query.cpp b/search/search_query.cpp index 9d8b0fba1f..7b2517cf2c 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -45,11 +45,27 @@ Query::~Query() { } +namespace +{ + inline bool IsEqual(m2::RectD const & r1, m2::RectD const & r2, double eps) + { + m2::RectD r = r1; + r.Inflate(eps, eps); + if (!r.IsRectInside(r2)) return false; + + r = r2; + r.Inflate(eps, eps); + if (!r.IsRectInside(r1)) return false; + + return true; + } +} + void Query::SetViewport(m2::RectD const & viewport) { - // TODO: Set m_bOffsetsCacheIsValid = false when mwm index is added or removed! - - if (m_viewport != viewport || !m_bOffsetsCacheIsValid) + // Check if viewports are equal. + // 10.0 - is 10 meters + if (!m_bOffsetsCacheIsValid || !IsEqual(m_viewport, viewport, 10.0)) { m_viewport = viewport; m_viewportExtended = m_viewport;