diff options
author | vng <viktor.govako@gmail.com> | 2012-11-21 22:12:41 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:47:05 +0300 |
commit | dc21bffc6732ceeff9540882da7766cd8f367705 (patch) | |
tree | 58cd45030f3179421cb7f4c085b0eea48de816f8 /search | |
parent | c408080c2712a08108368b8e981c81d006ab4fab (diff) |
Add search settings.
Diffstat (limited to 'search')
-rw-r--r-- | search/params.cpp | 25 | ||||
-rw-r--r-- | search/params.hpp | 32 | ||||
-rw-r--r-- | search/search_engine.cpp | 33 |
3 files changed, 42 insertions, 48 deletions
diff --git a/search/params.cpp b/search/params.cpp index 0fb49d3ff6..e28b7eab3b 100644 --- a/search/params.cpp +++ b/search/params.cpp @@ -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); diff --git a/search/params.hpp b/search/params.hpp index 1dd1f21c0d..2b8b338f6a 100644 --- a/search/params.hpp +++ b/search/params.hpp @@ -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); diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 8993f1a9ac..07a4358438 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -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) |