From f39540011be9204e17934c4a5e1a14a0c0519e40 Mon Sep 17 00:00:00 2001 From: vng Date: Thu, 29 May 2014 19:57:22 +0300 Subject: [PATCH] Restart search and display results with every viewport changing. --- .../com/mapswithme/maps/SearchActivity.java | 4 +- iphone/Maps/Classes/SearchView.mm | 3 +- map/framework.cpp | 108 ++++++++++++++---- map/framework.hpp | 11 +- qt/draw_widget.cpp | 19 --- qt/draw_widget.hpp | 3 - qt/search_panel.cpp | 38 +----- qt/search_panel.hpp | 2 - search/params.hpp | 9 +- search/search_engine.cpp | 1 + search/search_query.cpp | 73 ++++++------ search/search_query.hpp | 34 +++--- 12 files changed, 167 insertions(+), 138 deletions(-) diff --git a/android/src/com/mapswithme/maps/SearchActivity.java b/android/src/com/mapswithme/maps/SearchActivity.java index 1e49270db8..f7d5d48b18 100644 --- a/android/src/com/mapswithme/maps/SearchActivity.java +++ b/android/src/com/mapswithme/maps/SearchActivity.java @@ -806,13 +806,15 @@ public class SearchActivity extends MapsWithMeBaseListActivity implements Locati private static final int ALL = AROUND_POSITION | IN_VIEWPORT | SEARCH_WORLD; //@} private static final String SEARCH_MODE_SETTING = "SearchMode"; - private int m_searchMode = AROUND_POSITION; + private int m_searchMode = ALL; + /* private void runSearch(int mode) { m_searchMode = mode; runSearch(); } + */ private static final int SEARCH_LAUNCHED = 0; private static final int QUERY_EMPTY = 1; diff --git a/iphone/Maps/Classes/SearchView.mm b/iphone/Maps/Classes/SearchView.mm index 0194b3c239..7d5ea19c63 100644 --- a/iphone/Maps/Classes/SearchView.mm +++ b/iphone/Maps/Classes/SearchView.mm @@ -325,8 +325,7 @@ static void OnSearchResultCallback(search::Results const & results) Framework & framework = GetFramework(); framework.GetBalloonManager().RemovePin(); framework.GetBalloonManager().Dismiss(); - framework.GetBookmarkManager().UserMarksClear(UserMarkContainer::SEARCH_MARK); - framework.Invalidate(); + framework.CancelInteractiveSearch(); } - (void)searchBarDidPressClearButton:(SearchBar *)searchBar diff --git a/map/framework.cpp b/map/framework.cpp index db5d3d91c3..30241386d7 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -797,6 +797,36 @@ void Framework::ShowRectFixed(m2::RectD const & r) Invalidate(); } +void Framework::UpdateUserViewportChanged() +{ + if (!m_lastSearch.m_query.empty()) + { + (void)GetCurrentPosition(m_lastSearch.m_lat, m_lastSearch.m_lon); + m_lastSearch.m_callback = bind(&Framework::OnSearchResultsCallback, this, _1); + m_lastSearch.SetSearchMode(search::SearchParams::IN_VIEWPORT); + + (void)GetSearchEngine()->Search(m_lastSearch, GetCurrentViewport()); + } +} + +void Framework::OnSearchResultsCallback(search::Results const & results) +{ + if (!results.IsEndMarker() && results.GetCount() > 0) + { + // Got here from search thread. Need to switch into GUI thread to modify search mark container. + // Do copy the results structure to pass into GUI thread. + GetPlatform().RunOnGuiThread(bind(&Framework::OnSearchResultsCallbackUI, this, results)); + } +} + +void Framework::OnSearchResultsCallbackUI(search::Results const & results) +{ + m2::RectD dummy; + FillSearchResultsMarks(results, dummy); + + Invalidate(); +} + void Framework::ClearAllCaches() { m_model.ClearCaches(); @@ -905,7 +935,10 @@ void Framework::StopDrag(DragEvent const & e) } if (m_renderPolicy) + { m_renderPolicy->StopDrag(); + UpdateUserViewportChanged(); + } } void Framework::StartRotate(RotateEvent const & e) @@ -932,6 +965,8 @@ void Framework::StopRotate(RotateEvent const & e) { m_navigator.StopRotate(e.Angle(), ElapsedSeconds()); m_renderPolicy->StopRotate(e.Angle(), ElapsedSeconds()); + + UpdateUserViewportChanged(); } } @@ -954,6 +989,7 @@ void Framework::ScaleToPoint(ScaleToPointEvent const & e) m_navigator.ScaleToPoint(pt, e.ScaleFactor(), ElapsedSeconds()); Invalidate(); + UpdateUserViewportChanged(); } void Framework::ScaleDefault(bool enlarge) @@ -966,6 +1002,7 @@ void Framework::Scale(double scale) m_navigator.Scale(scale); Invalidate(); + UpdateUserViewportChanged(); } void Framework::CalcScalePoints(ScaleEvent const & e, m2::PointD & pt1, m2::PointD & pt2) const @@ -1022,8 +1059,12 @@ void Framework::StopScale(ScaleEvent const & e) CalcScalePoints(e, pt1, pt2); m_navigator.StopScale(pt1, pt2, ElapsedSeconds()); + if (m_renderPolicy) + { m_renderPolicy->StopScale(); + UpdateUserViewportChanged(); + } } //@} @@ -1086,7 +1127,13 @@ bool Framework::Search(search::SearchParams const & params) search::SearchParams const & rParams = params; #endif - return GetSearchEngine()->Search(rParams, GetCurrentViewport()); + if (GetSearchEngine()->Search(rParams, GetCurrentViewport())) + { + m_lastSearch = rParams; + return true; + } + else + return false; } bool Framework::GetCurrentPosition(double & lat, double & lon) const @@ -1157,35 +1204,18 @@ size_t Framework::ShowAllSearchResults() { using namespace search; - Results searchRes; - GetSearchEngine()->GetResults(searchRes); + Results results; + GetSearchEngine()->GetResults(results); - size_t const count = searchRes.GetCount(); + size_t const count = results.GetCount(); switch (count) { - case 1: ShowSearchResult(searchRes.GetResult(0)); + case 1: ShowSearchResult(results.GetResult(0)); case 0: return count; } - UserMarkContainer::Type type = UserMarkContainer::SEARCH_MARK; - m_bmManager.UserMarksSetVisible(type, true); - m_bmManager.UserMarksClear(type); - m2::RectD rect; - for (size_t i = 0; i < count; ++i) - { - // @todo add type for each search result pin - search::Result const & r = searchRes.GetResult(i); - if (r.GetResultType() == Result::RESULT_FEATURE) - { - AddressInfo info; - info.MakeFrom(r); - m2::PointD ptOrg = r.GetFeatureCenter(); - SearchMarkPoint * mark = static_cast(m_bmManager.UserMarksAddMark(type, ptOrg)); - mark->SetInfo(info); - rect.Add(r.GetFeatureCenter()); - } - } + FillSearchResultsMarks(results, rect); ShowRectEx(rect); StopLocationFollow(); @@ -1193,6 +1223,38 @@ size_t Framework::ShowAllSearchResults() return count; } +void Framework::FillSearchResultsMarks(search::Results const & results, m2::RectD & rect) +{ + UserMarkContainer::Type const type = UserMarkContainer::SEARCH_MARK; + m_bmManager.UserMarksSetVisible(type, true); + m_bmManager.UserMarksClear(type); + + size_t const count = results.GetCount(); + for (size_t i = 0; i < count; ++i) + { + using namespace search; + + Result const & r = results.GetResult(i); + if (r.GetResultType() == Result::RESULT_FEATURE) + { + AddressInfo info; + info.MakeFrom(r); + m2::PointD const pt = r.GetFeatureCenter(); + SearchMarkPoint * mark = static_cast(m_bmManager.UserMarksAddMark(type, pt)); + mark->SetInfo(info); + rect.Add(pt); + } + } +} + +void Framework::CancelInteractiveSearch() +{ + m_lastSearch.Clear(); + m_bmManager.UserMarksClear(UserMarkContainer::SEARCH_MARK); + + Invalidate(); +} + bool Framework::GetDistanceAndAzimut(m2::PointD const & point, double lat, double lon, double north, string & distance, double & azimut) diff --git a/map/framework.hpp b/map/framework.hpp index 88c25d1645..851cdae239 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -48,6 +48,7 @@ namespace search { class Result; + class Results; struct AddressInfo; } @@ -245,7 +246,13 @@ public: private: search::Engine * GetSearchEngine() const; - //void AddBookmarkAndSetViewport(Bookmark & bm, m2::RectD const & viewPort); + search::SearchParams m_lastSearch; + + void UpdateUserViewportChanged(); + + void OnSearchResultsCallback(search::Results const & results); + void OnSearchResultsCallbackUI(search::Results const & results); + void FillSearchResultsMarks(search::Results const & results, m2::RectD & rect); public: m2::RectD GetCurrentViewport() const; @@ -261,6 +268,8 @@ public: void ShowSearchResult(search::Result const & res); size_t ShowAllSearchResults(); + void CancelInteractiveSearch(); + /// Calculate distance and direction to POI for the given position. /// @param[in] point POI's position; /// @param[in] lat, lon, north Current position and heading from north; diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 4ae2c27f2e..9aa0fec964 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -143,60 +143,51 @@ namespace qt void DrawWidget::MoveLeft() { m_framework->Move(math::pi, 0.5); - emit ViewportChanged(); } void DrawWidget::MoveRight() { m_framework->Move(0.0, 0.5); - emit ViewportChanged(); } void DrawWidget::MoveUp() { m_framework->Move(math::pi/2.0, 0.5); - emit ViewportChanged(); } void DrawWidget::MoveDown() { m_framework->Move(-math::pi/2.0, 0.5); - emit ViewportChanged(); } void DrawWidget::ScalePlus() { m_framework->Scale(2.0); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::ScaleMinus() { m_framework->Scale(0.5); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::ScalePlusLight() { m_framework->Scale(1.5); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::ScaleMinusLight() { m_framework->Scale(2.0/3.0); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::ShowAll() { m_framework->ShowAll(); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::Repaint() @@ -222,10 +213,7 @@ namespace qt { double const factor = m_pScale->GetScaleFactor(); if (factor != 1.0) - { m_framework->Scale(factor); - emit ViewportChanged(); - } } } @@ -290,7 +278,6 @@ namespace qt DrawFrame(); UpdateScaleControl(); - emit ViewportChanged(); } void DrawWidget::paintGL() @@ -463,7 +450,6 @@ namespace qt m_framework->ScaleToPoint(ScaleToPointEvent(L2D(e->x()), L2D(e->y()), 1.5)); UpdateScaleControl(); - emit ViewportChanged(); } } @@ -504,8 +490,6 @@ namespace qt StopDragging(e); StopRotating(e); - - emit ViewportChanged(); } void DrawWidget::keyReleaseEvent(QKeyEvent * e) @@ -513,8 +497,6 @@ namespace qt QGLWidget::keyReleaseEvent(e); StopRotating(e); - - emit ViewportChanged(); } void DrawWidget::StopRotating(QMouseEvent * e) @@ -559,7 +541,6 @@ namespace qt m_framework->ScaleToPoint(ScaleToPointEvent(L2D(e->x()), L2D(e->y()), exp(e->delta() / 360.0))); UpdateScaleControl(); - emit ViewportChanged(); } } diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp index 8b6035b95a..1a695b6377 100644 --- a/qt/draw_widget.hpp +++ b/qt/draw_widget.hpp @@ -64,9 +64,6 @@ namespace qt Q_OBJECT - signals: - void ViewportChanged(); - public Q_SLOTS: void MoveLeft(); void MoveRight(); diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp index 188c60b35e..0802815f5f 100644 --- a/qt/search_panel.cpp +++ b/qt/search_panel.cpp @@ -94,8 +94,6 @@ void SearchPanel::ClearResults() m_pTable->clear(); m_pTable->setRowCount(0); m_results.clear(); - - m_pDrawWidget->GetFramework().GetBookmarkManager().UserMarksClear(UserMarkContainer::SEARCH_MARK); } void SearchPanel::OnSearchResult(ResultsT * res) @@ -115,9 +113,6 @@ void SearchPanel::OnSearchResult(ResultsT * res) { ClearResults(); - Framework & frm = m_pDrawWidget->GetFramework(); - BookmarkManager & manager = frm.GetBookmarkManager(); - for (ResultsT::IterT i = res->Begin(); i != res->End(); ++i) { ResultT const & e = *i; @@ -127,15 +122,9 @@ void SearchPanel::OnSearchResult(ResultsT * res) m_pTable->setItem(rowCount, 1, create_item(QString::fromUtf8(e.GetString()))); m_pTable->setItem(rowCount, 2, create_item(QString::fromUtf8(e.GetRegionString()))); - if (e.GetResultType() != ResultT::RESULT_SUGGESTION) + if (e.GetResultType() == ResultT::RESULT_FEATURE) { - SearchMarkPoint * mark = static_cast(manager.UserMarksAddMark(UserMarkContainer::SEARCH_MARK, e.GetFeatureCenter())); - search::AddressInfo info; - info.MakeFrom(e); - mark->SetInfo(info); - // For debug purposes: add bookmarks for search results m_pTable->setItem(rowCount, 0, create_item(QString::fromUtf8(e.GetFeatureType()))); - m_pTable->setItem(rowCount, 3, create_item(m_pDrawWidget->GetDistance(e).c_str())); } @@ -166,6 +155,8 @@ void SearchPanel::OnSearchTextChanged(QString const & str) { ClearResults(); + m_pDrawWidget->GetFramework().CancelInteractiveSearch(); + // hide X button m_pClearButton->setVisible(false); } @@ -173,8 +164,6 @@ void SearchPanel::OnSearchTextChanged(QString const & str) void SearchPanel::OnSearchPanelItemClicked(int row, int) { - disconnect(m_pDrawWidget, SIGNAL(ViewportChanged()), this, SLOT(OnViewportChanged())); - ASSERT_EQUAL(m_results.size(), static_cast(m_pTable->rowCount()), ()); if (m_results[row].GetResultType() != ResultT::RESULT_SUGGESTION) @@ -188,33 +177,14 @@ void SearchPanel::OnSearchPanelItemClicked(int row, int) string const suggestion = m_results[row].GetSuggestionString(); m_pEditor->setText(QString::fromUtf8(suggestion.c_str())); } - - connect(m_pDrawWidget, SIGNAL(ViewportChanged()), this, SLOT(OnViewportChanged())); -} - -void SearchPanel::showEvent(QShowEvent *) -{ - connect(m_pDrawWidget, SIGNAL(ViewportChanged()), this, SLOT(OnViewportChanged())); - - OnViewportChanged(); } void SearchPanel::hideEvent(QHideEvent *) { - m_pDrawWidget->GetFramework().GetBookmarkManager().UserMarksClear(UserMarkContainer::SEARCH_MARK); - - disconnect(m_pDrawWidget, SIGNAL(ViewportChanged()), this, SLOT(OnViewportChanged())); - + m_pDrawWidget->GetFramework().CancelInteractiveSearch(); m_pDrawWidget->CloseSearch(); } -void SearchPanel::OnViewportChanged() -{ - QString const txt = m_pEditor->text(); - if (!txt.isEmpty()) - OnSearchTextChanged(txt); -} - void SearchPanel::OnAnimationTimer() { static int angle = 0; diff --git a/qt/search_panel.hpp b/qt/search_panel.hpp index bc8605bbed..12dee36f18 100644 --- a/qt/search_panel.hpp +++ b/qt/search_panel.hpp @@ -46,7 +46,6 @@ public: SearchPanel(DrawWidget * drawWidget, QWidget * parent); private: - virtual void showEvent(QShowEvent *); virtual void hideEvent(QHideEvent *); void SearchResultThreadFunc(ResultsT const & result); @@ -62,7 +61,6 @@ private slots: /// Called via signal to support multithreading void OnSearchResult(ResultsT * result); - void OnViewportChanged(); void OnAnimationTimer(); void OnClearButton(); }; diff --git a/search/params.hpp b/search/params.hpp index 1cd425052c..3a03e947f0 100644 --- a/search/params.hpp +++ b/search/params.hpp @@ -33,12 +33,9 @@ namespace search ALL = AROUND_POSITION | IN_VIEWPORT | SEARCH_WORLD | SEARCH_ADDRESS }; - inline void SetSearchMode(int /*mode*/) - { - // Always do search in default mode (ALL). - //m_searchMode = mode; - } + inline void SetSearchMode(int mode) { m_searchMode = mode; } inline bool NeedSearch(SearchModeT mode) const { return ((m_searchMode & mode) != 0); } + inline bool IsSortByViewport() const { return m_searchMode == IN_VIEWPORT; } //@} void SetPosition(double lat, double lon); @@ -50,6 +47,8 @@ namespace search bool IsEqualCommon(SearchParams const & rhs) const; + void Clear() { m_query.clear(); } + public: SearchCallbackT m_callback; diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 5823819afc..364eea4733 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -286,6 +286,7 @@ void Engine::SearchAsync() m_pQuery->SetViewport(arrRects, 2); m_pQuery->SetSearchInWorld(params.NeedSearch(SearchParams::SEARCH_WORLD)); + m_pQuery->SetSortByViewport(params.IsSortByViewport()); if (params.IsLanguageValid()) m_pQuery->SetInputLanguage(params.m_inputLanguageCode); diff --git a/search/search_query.cpp b/search/search_query.cpp index fd670b4e8b..5c09f2e996 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -77,6 +77,7 @@ Query::Query(Index const * pIndex, m_pInfoGetter(pInfoGetter), m_houseDetector(pIndex), m_worldSearch(true), + m_sortByViewport(false), m_position(empty_pos_value, empty_pos_value) { // m_viewport is initialized as empty rects @@ -134,8 +135,7 @@ namespace void Query::SetViewport(m2::RectD viewport[], size_t count) { - // use static_cast to avoid GCC linker dummy bug - ASSERT_LESS ( count, static_cast(RECTSCOUNT), () ); + ASSERT(count < COUNT_V, (count)); m_cancel = false; @@ -148,8 +148,7 @@ void Query::SetViewport(m2::RectD viewport[], size_t count) void Query::SetViewportByIndex(MWMVectorT const & mwmInfo, m2::RectD const & viewport, size_t idx) { - // use static_cast to avoid GCC linker dummy bug - ASSERT_LESS ( idx, static_cast(RECTSCOUNT), () ); + ASSERT(idx < COUNT_V, (idx)); if (viewport.IsValid()) { @@ -187,7 +186,7 @@ int8_t Query::GetPrefferedLanguage() const void Query::ClearCaches() { - for (size_t i = 0; i < RECTSCOUNT; ++i) + for (size_t i = 0; i < COUNT_V; ++i) ClearCache(i); } @@ -502,7 +501,7 @@ namespace impl string name, country; LoadFeature(res.GetID(), feature, name, country); - int8_t const viewportID = res.GetViewportID(); + Query::ViewportID const viewportID = static_cast(res.GetViewportID()); return new impl::PreResult2(feature, &res, m_query.GetViewport(viewportID), m_query.GetPosition(viewportID), name, country); @@ -748,10 +747,10 @@ template void Query::ProcessSuggestions(vector & vec, Results & res } } -void Query::AddResultFromTrie(TrieValueT const & val, size_t mwmID, int8_t viewportID) +void Query::AddResultFromTrie(TrieValueT const & val, size_t mwmID, ViewportID vID /*= DEFAULT_V*/) { impl::PreResult1 res(FeatureID(mwmID, val.m_featureId), val.m_rank, val.m_pt, - GetPosition(viewportID), GetViewport(viewportID), viewportID); + GetPosition(vID), GetViewport(vID), vID); for (size_t i = 0; i < m_qCount; ++i) { @@ -807,13 +806,14 @@ class FeatureLoader { Query & m_query; size_t m_mwmID, m_count; - int8_t m_viewportID; + Query::ViewportID m_viewportID; public: - FeatureLoader(Query & query, size_t mwmID, int viewportID) - : m_query(query), m_mwmID(mwmID), m_count(0), - m_viewportID(static_cast(viewportID)) + FeatureLoader(Query & query, size_t mwmID, Query::ViewportID viewportID) + : m_query(query), m_mwmID(mwmID), m_count(0), m_viewportID(viewportID) { + if (query.m_sortByViewport) + m_viewportID = Query::CURRENT_V; } void operator() (Query::TrieValueT const & value) @@ -1379,12 +1379,12 @@ void Query::SearchAddress() { params.ProcessAddressTokens(); - SetViewportByIndex(mwmInfo, scales::GetRectForLevel(ADDRESS_SCALE, city.m_value.m_pt), ADDRESS_RECT_ID); + SetViewportByIndex(mwmInfo, scales::GetRectForLevel(ADDRESS_SCALE, city.m_value.m_pt), LOCALITY_V); /// @todo Hack - do not search for address in World.mwm; Do it better in future. bool const b = m_worldSearch; m_worldSearch = false; - SearchFeatures(params, mwmInfo, ADDRESS_RECT_ID); + SearchFeatures(params, mwmInfo, LOCALITY_V); m_worldSearch = b; } else @@ -1691,10 +1691,10 @@ void Query::SearchFeatures() Params params(*this); // do usual search in viewport and near me (without last rect) - for (size_t i = 0; i < RECTSCOUNT-1; ++i) + for (int i = 0; i < LOCALITY_V; ++i) { if (m_viewport[i].IsValid()) - SearchFeatures(params, mwmInfo, i); + SearchFeatures(params, mwmInfo, static_cast(i)); } } @@ -1754,15 +1754,15 @@ namespace }; } -void Query::SearchFeatures(Params const & params, MWMVectorT const & mwmInfo, int ind) +void Query::SearchFeatures(Params const & params, MWMVectorT const & mwmInfo, ViewportID vID) { for (MwmSet::MwmId mwmId = 0; mwmId < mwmInfo.size(); ++mwmId) { // Search only mwms that intersect with viewport (world always does). - if (m_viewport[ind].IsIntersect(mwmInfo[mwmId].m_limitRect)) + if (m_viewport[vID].IsIntersect(mwmInfo[mwmId].m_limitRect)) { Index::MwmLock mwmLock(*m_pIndex, mwmId); - SearchInMWM(mwmLock, params, ind); + SearchInMWM(mwmLock, params, vID); } } } @@ -1799,7 +1799,8 @@ void FillCategories(Query::Params const & params, TrieIterator const * pTrieRoot } -void Query::SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, int ind/* = -1*/) +void Query::SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, + ViewportID vID /*= DEFAULT_V*/) { if (MwmValue * pMwm = mwmLock.GetValue()) { @@ -1821,19 +1822,21 @@ void Query::SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, i trie::EdgeValueReader())); MwmSet::MwmId const mwmId = mwmLock.GetID(); - FeaturesFilter filter((ind == -1 || isWorld) ? 0 : &m_offsetsInViewport[ind][mwmId], m_cancel); + FeaturesFilter filter((vID == DEFAULT_V || isWorld) ? 0 : &m_offsetsInViewport[vID][mwmId], m_cancel); // Get categories for each token separately - find needed edge with categories. TrieValuesHolder categoriesHolder(filter); FillCategories(params, pTrieRoot.get(), categoriesHolder); // Match tokens to feature for each language - iterate through first edges. - impl::FeatureLoader emitter(*this, mwmId, ind); + impl::FeatureLoader emitter(*this, mwmId, vID); size_t const count = pTrieRoot->m_edge.size(); for (size_t i = 0; i < count; ++i) { TrieIterator::Edge::EdgeStrT const & edge = pTrieRoot->m_edge[i].m_str; - if (edge[0] < search::CATEGORIES_LANG && params.IsLangExist(static_cast(edge[0]))) + int8_t const lang = static_cast(edge[0]); + + if (edge[0] < search::CATEGORIES_LANG && params.IsLangExist(lang)) { scoped_ptr pLangRoot(pTrieRoot->GoToEdge(i)); @@ -1842,7 +1845,7 @@ void Query::SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, i filter, categoriesHolder, emitter); LOG(LDEBUG, ("Country", pMwm->GetFileName(), - "Lang", StringUtf8Multilang::GetLangByCode(static_cast(edge[0])), + "Lang", StringUtf8Multilang::GetLangByCode(lang), "Matched", emitter.GetCount())); emitter.Reset(); @@ -1903,12 +1906,12 @@ void Query::MatchForSuggestions(strings::UniString const & token, Results & res) MatchForSuggestionsImpl(token, GetLanguage(LANG_EN), res); } -m2::RectD const & Query::GetViewport(int8_t viewportID/* = -1*/) const +m2::RectD const & Query::GetViewport(ViewportID vID /*= DEFAULT_V*/) const { - if (viewportID == ADDRESS_RECT_ID) + if (vID == LOCALITY_V) { // special case for search address - return viewport around location - return m_viewport[viewportID]; + return m_viewport[vID]; } // return first valid actual viewport @@ -1921,14 +1924,20 @@ m2::RectD const & Query::GetViewport(int8_t viewportID/* = -1*/) const } } -m2::PointD Query::GetPosition(int8_t viewportID/* = -1*/) const +m2::PointD Query::GetPosition(ViewportID vID /*= DEFAULT_V*/) const { - if (viewportID == ADDRESS_RECT_ID) + switch (vID) { - // special case for search address - return center of location - return m_viewport[viewportID].Center(); + case LOCALITY_V: // center of the founded locality + return m_viewport[vID].Center(); + + case CURRENT_V: // center of viewport for special sort mode + if (m_sortByViewport) + return m_viewport[vID].Center(); + + default: + return m_position; } - return m_position; } void Query::SearchAllInViewport(m2::RectD const & viewport, Results & res, unsigned int resultsNeeded) diff --git a/search/search_query.hpp b/search/search_query.hpp index 580cc3293a..61e3de8967 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -83,6 +83,7 @@ public: inline void NullPosition() { m_position = m2::PointD(empty_pos_value, empty_pos_value); } inline void SetSearchInWorld(bool b) { m_worldSearch = b; } + inline void SetSortByViewport(bool b) { m_sortByViewport = b; } void SetPreferredLanguage(string const & lang); void SetInputLanguage(int8_t lang); @@ -157,8 +158,15 @@ private: OffsetsVectorT & offsets); void ClearCache(size_t ind); - /// @param[in] viewportID @see m_viewport - void AddResultFromTrie(TrieValueT const & val, size_t mwmID, int8_t viewportID = -1); + enum ViewportID { + DEFAULT_V = -1, + CURRENT_V = 0, + POSITION_V = 1, + LOCALITY_V = 2, + COUNT_V = 3 // Should always be the last + }; + + void AddResultFromTrie(TrieValueT const & val, size_t mwmID, ViewportID vID = DEFAULT_V); void FlushResults(Results & res, bool allMWMs, size_t resCount); @@ -180,9 +188,9 @@ private: /// If ind == -1, don't do any matching with features in viewport (@see m_offsetsInViewport). //@{ /// Do search in all maps from mwmInfo. - void SearchFeatures(Params const & params, MWMVectorT const & mwmInfo, int ind); + void SearchFeatures(Params const & params, MWMVectorT const & mwmInfo, ViewportID vID); /// Do search in particular map (mwmLock). - void SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, int ind = -1); + void SearchInMWM(Index::MwmLock const & mwmLock, Params const & params, ViewportID vID = DEFAULT_V); //@} void SuggestStrings(Results & res); @@ -213,21 +221,15 @@ private: static int const MAX_SUGGESTS_COUNT = 5; - /// 0 - current viewport rect - /// 1 - near me rect - /// 2 - around city rect - static size_t const RECTSCOUNT = 3; - static int const ADDRESS_RECT_ID = RECTSCOUNT-1; - - m2::RectD m_viewport[RECTSCOUNT]; - bool m_worldSearch; + m2::RectD m_viewport[COUNT_V]; + bool m_worldSearch, m_sortByViewport; /// @name Get ranking params. - /// @param[in] viewportID Index of search viewport (@see comments above); -1 means default viewport. //@{ /// @return Rect for viewport-distance calculation. - m2::RectD const & GetViewport(int8_t viewportID = -1) const; - m2::PointD GetPosition(int8_t viewportID = -1) const; + m2::RectD const & GetViewport(ViewportID vID = DEFAULT_V) const; + /// @return Control point for distance-to calculation. + m2::PointD GetPosition(ViewportID vID = DEFAULT_V) const; //@} m2::PointD m_position; @@ -238,7 +240,7 @@ private: KeywordLangMatcher m_keywordsScorer; - OffsetsVectorT m_offsetsInViewport[RECTSCOUNT]; + OffsetsVectorT m_offsetsInViewport[COUNT_V]; bool m_supportOldFormat; template class CompareT