Add search settings.

This commit is contained in:
vng 2012-11-21 21:12:41 +03:00 committed by Alex Zolotarev
parent c408080c27
commit dc21bffc67
6 changed files with 48 additions and 56 deletions

View file

@ -191,7 +191,7 @@ Java_com_mapswithme_maps_SearchActivity_nativeRunSearch(
params.m_query = jni::ToNativeString(env, s);
params.SetInputLanguage(jni::ToNativeString(env, lang));
if (mode % 2 == 0) params.SetResetMode(true);
if (mode % 2 == 0) params.SetForceSearch(true);
if (mode >= 2) params.SetPosition(lat, lon);
return SearchAdapter::Instance().RunSearch(env, params, queryID);

View file

@ -493,11 +493,9 @@ namespace qt
bool DrawWidget::Search(search::SearchParams params)
{
if (m_framework->GetCurrentPosition(params.m_lat, params.m_lon))
{
//params.SetNearMeMode(true);
params.m_validPos = true;
}
double lat, lon;
if (m_framework->GetCurrentPosition(lat, lon))
params.SetPosition(lat, lon);
return m_framework->Search(params);
}

View file

@ -57,6 +57,8 @@ SearchPanel::SearchPanel(DrawWidget * drawWidget, QWidget * parent)
setFocusPolicy(Qt::StrongFocus);
setFocusProxy(m_pEditor);
m_params.m_callback = bind(&SearchPanel::SearchResultThreadFunc, this, _1);
}
void SearchPanel::SearchResultThreadFunc(ResultsT const & result)
@ -180,8 +182,6 @@ void SearchPanel::OnSearchTextChanged(QString const & str)
//if (!normalized.isEmpty())
{
m_params.m_query = normalized.toUtf8().constData();
m_params.m_callback = bind(&SearchPanel::SearchResultThreadFunc, this, _1);
if (m_pDrawWidget->Search(m_params))
{
// show busy indicator

View file

@ -8,27 +8,10 @@ namespace search
SearchParams::SearchParams()
: m_inputLanguageCode(StringUtf8Multilang::UNSUPPORTED_LANGUAGE_CODE),
m_validPos(false), m_mode(0)
m_searchMode(ALL), m_validPos(false)
{
}
void SearchParams::SetResetMode(bool b)
{
if (b) m_mode |= ResetBit;
else m_mode &= (~ResetBit);
}
bool SearchParams::IsResetMode() const
{
return ((m_mode & ResetBit) != 0);
}
void SearchParams::SetNearMeMode(bool b)
{
if (b) m_mode |= NearMeBit;
else m_mode &= (~NearMeBit);
}
void SearchParams::SetPosition(double lat, double lon)
{
m_lat = lat;
@ -45,12 +28,6 @@ void SearchParams::SetInputLanguage(string const & language)
delimPos == string::npos ? language : language.substr(0, delimPos));
}
bool SearchParams::IsNearMeMode() const
{
// this mode is valid only with correct My Position
return (((m_mode & NearMeBit) != 0) && m_validPos);
}
bool SearchParams::IsLanguageValid() const
{
return (m_inputLanguageCode != StringUtf8Multilang::UNSUPPORTED_LANGUAGE_CODE);

View file

@ -16,14 +16,31 @@ namespace search
public:
SearchParams();
void SetResetMode(bool b);
void SetNearMeMode(bool b);
/// @name Force run search without comparing with previous search params.
//@{
void SetForceSearch(bool b) { m_forceSearch = b; }
bool IsForceSearch() const { return m_forceSearch; }
//@}
/// @name Search modes.
//@{
enum SearchModeT
{
AROUND_POSITION = 1,
IN_VIEWPORT = 2,
SEARCH_WORLD = 4,
ALL = AROUND_POSITION | IN_VIEWPORT | SEARCH_WORLD
};
void SetSearchMode(int mode) { m_searchMode = mode; }
bool NeedSearch(SearchModeT mode) const { return ((m_searchMode & mode) != 0);}
//@}
void SetPosition(double lat, double lon);
bool IsValidPosition() const { return m_validPos; }
/// @param[in] language can be "fr", "en-US", "ru_RU" etc.
void SetInputLanguage(string const & language);
bool IsResetMode() const;
bool IsNearMeMode() const;
bool IsLanguageValid() const;
bool IsEqualCommon(SearchParams const & rhs) const;
@ -37,11 +54,10 @@ namespace search
int8_t m_inputLanguageCode;
double m_lat, m_lon;
bool m_validPos;
private:
enum { ResetBit = 0x1, NearMeBit = 0x2 };
int m_mode;
int m_searchMode;
bool m_forceSearch, m_validPos;
};
string DebugPrint(SearchParams const & params);

View file

@ -146,11 +146,11 @@ bool Engine::Search(SearchParams const & params, m2::RectD const & viewport)
// There is no need to put synch here for reading m_params,
// because this function is always called from main thread (one-by-one for queries).
if (!params.IsResetMode() &&
if (!params.IsForceSearch() &&
m_params.IsEqualCommon(params) &&
m2::IsEqual(m_viewport, viewport, epsEqualRects, epsEqualRects))
{
if (!m_params.m_validPos)
if (!m_params.IsValidPosition())
return false;
m2::PointD const p1 = GetViewportXY(m_params.m_lat, m_params.m_lon);
@ -222,27 +222,28 @@ void Engine::SearchAsync()
// Initialize query.
m_pQuery->Init();
bool worldSearch = true;
if (params.m_validPos)
// Set search viewports according to search params.
if (params.IsValidPosition())
{
m_pQuery->SetPosition(GetViewportXY(params.m_lat, params.m_lon));
arrRects[NEARME_RECT] = GetViewportRect(params.m_lat, params.m_lon);
// Do not search in viewport for "NearMe" mode.
if (params.IsNearMeMode())
if (params.NeedSearch(SearchParams::AROUND_POSITION))
{
worldSearch = false;
arrRects[VIEWPORT_RECT].MakeEmpty();
m_pQuery->SetPosition(GetViewportXY(params.m_lat, params.m_lon));
arrRects[NEARME_RECT] = GetViewportRect(params.m_lat, params.m_lon);
}
else
AnalyzeRects(arrRects);
}
else
m_pQuery->NullPosition();
if (!params.NeedSearch(SearchParams::IN_VIEWPORT))
arrRects[VIEWPORT_RECT].MakeEmpty();
if (arrRects[NEARME_RECT].IsValid() && arrRects[VIEWPORT_RECT].IsValid())
AnalyzeRects(arrRects);
m_pQuery->SetViewport(arrRects, 2);
m_pQuery->SetSearchInWorld(worldSearch);
m_pQuery->SetSearchInWorld(params.NeedSearch(SearchParams::SEARCH_WORLD));
if (params.IsLanguageValid())
m_pQuery->SetInputLanguage(params.m_inputLanguageCode);
@ -261,7 +262,7 @@ void Engine::SearchAsync()
if (emptyQuery)
{
// Search for empty query only around viewport.
if (params.m_validPos)
if (params.IsValidPosition())
{
double arrR[] = { 500, 1000, 2000 };
for (size_t i = 0; i < ARRAY_SIZE(arrR); ++i)