[search] Fix some hard logic in viewport recaculation. Если сами белые!

This commit is contained in:
vng 2012-02-11 01:02:28 +03:00 committed by Alex Zolotarev
parent f8209a8981
commit fb8a3ebf01
3 changed files with 26 additions and 10 deletions

View file

@ -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));

View file

@ -55,6 +55,7 @@ private:
threads::Mutex m_searchMutex, m_updateMutex;
SearchParams m_params;
m2::RectD m_viewport;
Index const * m_pIndex;
scoped_ptr<search::Query> m_pQuery;

View file

@ -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;