From b11697ea218a1005dd2da2366a9f37e0ace861d8 Mon Sep 17 00:00:00 2001 From: vng Date: Thu, 2 Feb 2012 19:09:54 +0300 Subject: [PATCH] [search] New interface for search call from GUI. --- iphone/Maps/Classes/SearchVC.mm | 29 ++++++++++++++----- map/framework.cpp | 7 ++--- map/framework.hpp | 12 ++------ qt/draw_widget.cpp | 4 +-- qt/draw_widget.hpp | 5 ++-- qt/search_panel.cpp | 16 +++++++---- qt/search_panel.hpp | 3 ++ search/params.hpp | 50 +++++++++++++++++++++++++++++++++ search/search.pro | 5 ++-- search/search_engine.cpp | 41 ++++++--------------------- search/search_engine.hpp | 13 ++------- 11 files changed, 108 insertions(+), 77 deletions(-) create mode 100644 search/params.hpp diff --git a/iphone/Maps/Classes/SearchVC.mm b/iphone/Maps/Classes/SearchVC.mm index 859b033f19..4fa8b7fddd 100644 --- a/iphone/Maps/Classes/SearchVC.mm +++ b/iphone/Maps/Classes/SearchVC.mm @@ -110,15 +110,11 @@ static void OnSearchResultCallback(search::Results const & res, int queryId) - (void)enableRadarMode { m_radarButton.selected = YES; - - m_framework->GetSearchEngine()->EnablePositionTrack(true); } - (void)disableRadarMode { m_radarButton.selected = NO; - - m_framework->GetSearchEngine()->EnablePositionTrack(false); } - (void)onRadarButtonClicked:(id)button @@ -270,6 +266,20 @@ static void OnSearchResultCallback(search::Results const & res, int queryId) return YES; // All orientations are supported. } +- (void)fillSearchParams:(search::SearchParams &)params +{ + params.m_query = [[m_searchBar.text precomposedStringWithCompatibilityMapping] UTF8String]; + params.m_callback = bind(&OnSearchResultCallback, _1, g_queryId); + bool radarEnabled = m_radarButton.selected == YES; + CLLocation * l = m_locationManager.lastLocation; + if (!l) + radarEnabled = false; + else + params.SetPosition(l.coordinate.latitude, l.coordinate.longitude); + params.SetNearMeMode(radarEnabled); + +} + //************************************************************************** //*********** SearchBar handlers ******************************************* - (void)searchBar:(UISearchBar *)sender textDidChange:(NSString *)searchText @@ -277,8 +287,11 @@ static void OnSearchResultCallback(search::Results const & res, int queryId) ++g_queryId; if ([searchText length] > 0) - m_framework->Search([[searchText precomposedStringWithCompatibilityMapping] UTF8String], - bind(&OnSearchResultCallback, _1, g_queryId)); + { + search::SearchParams params; + [self fillSearchParams:params]; + m_framework->Search(params); + } else { [g_lastSearchResults release]; @@ -460,7 +473,9 @@ static void OnSearchResultCallback(search::Results const & res, int queryId) - (void)onGpsUpdate:(location::GpsInfo const &)info { - m_framework->GetSearchEngine()->SetPosition(info.m_latitude, info.m_longitude); + search::SearchParams params; + [self fillSearchParams:params]; + m_framework->Search(params); } - (void)onCompassUpdate:(location::CompassInfo const &)info diff --git a/map/framework.cpp b/map/framework.cpp index e0da2e5095..d1ef92491a 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -701,13 +701,10 @@ search::Engine * Framework::GetSearchEngine() return m_pSearchEngine.get(); } -void Framework::Search(string const & text, SearchCallbackT callback) +void Framework::Search(search::SearchParams const & params) { search::Engine * pSearchEngine = GetSearchEngine(); - - m2::RectD const viewport = m_navigator.Screen().ClipRect(); - pSearchEngine->SetViewport(viewport); - pSearchEngine->Search(text, callback); + pSearchEngine->Search(params, m_navigator.Screen().ClipRect()); } void Framework::SetRenderPolicy(RenderPolicy * renderPolicy) diff --git a/map/framework.hpp b/map/framework.hpp index 62b814bd23..02d6b55223 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -38,22 +38,16 @@ #include "../base/mutex.hpp" #include "../base/timer.hpp" -#include "../std/bind.hpp" -#include "../std/function.hpp" #include "../std/vector.hpp" #include "../std/shared_ptr.hpp" +#include "../std/scoped_ptr.hpp" #include "../std/target_os.hpp" #include "../search/search_engine.hpp" + //#define DRAW_TOUCH_POINTS -namespace search { class Engine; } - -struct BenchmarkRectProvider; - -namespace search { class Results; } -typedef function SearchCallbackT; class DrawerYG; class RenderPolicy; @@ -148,7 +142,7 @@ public: bool isTiling); search::Engine * GetSearchEngine(); - void Search(string const & text, SearchCallbackT callback); + void Search(search::SearchParams const & params); void SetMaxWorldRect(); diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 74cf471b0c..021733912d 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -445,9 +445,9 @@ namespace qt } } - void DrawWidget::Search(const string & text, SearchCallbackT callback) + void DrawWidget::Search(search::SearchParams const & params) { - m_framework->Search(text, callback); + m_framework->Search(params); } void DrawWidget::ShowFeature(m2::RectD const & rect) diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp index 79703b8b6b..ddcc673048 100644 --- a/qt/draw_widget.hpp +++ b/qt/draw_widget.hpp @@ -1,7 +1,5 @@ #pragma once -//#include "widgets.hpp" - #include "../map/window_handle.hpp" #include "../map/framework.hpp" #include "../map/navigator.hpp" @@ -14,6 +12,7 @@ #include #include + namespace qt { class QScaleSlider; @@ -83,7 +82,7 @@ namespace qt void SetScaleControl(QScaleSlider * pScale); - void Search(string const & text, SearchCallbackT callback); + void Search(search::SearchParams const & params); void ShowFeature(m2::RectD const & rect); void SaveState(); diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp index 96d4cc7b41..7e7460f8d7 100644 --- a/qt/search_panel.cpp +++ b/qt/search_panel.cpp @@ -116,6 +116,11 @@ void SearchPanel::OnSearchResult(ResultsT * res, int queryId) if (queryId != m_queryId) return; + // clear old results + m_pTable->clear(); + m_pTable->setRowCount(0); + m_results.clear(); + for (ResultsT::IterT i = res->Begin(); i != res->End(); ++i) { ResultT const & e = *i; @@ -155,17 +160,16 @@ void SearchPanel::OnSearchResult(ResultsT * res, int queryId) void SearchPanel::OnSearchTextChanged(QString const & str) { - // clear old results - m_pTable->clear(); - m_pTable->setRowCount(0); - m_results.clear(); ++m_queryId; QString const normalized = str.normalized(QString::NormalizationForm_KC); if (!normalized.isEmpty()) { - m_pDrawWidget->Search(normalized.toUtf8().constData(), - bind(&SearchPanel::SearchResultThreadFunc, this, _1, m_queryId)); + m_params.m_query = normalized.toUtf8().constData(); + m_params.m_callback = bind(&SearchPanel::SearchResultThreadFunc, this, _1, m_queryId); + + m_pDrawWidget->Search(m_params); + // show busy indicator if (!m_pAnimationTimer->isActive()) m_pAnimationTimer->start(200); diff --git a/qt/search_panel.hpp b/qt/search_panel.hpp index 12a7e9a325..eff30901a4 100644 --- a/qt/search_panel.hpp +++ b/qt/search_panel.hpp @@ -1,6 +1,7 @@ #pragma once #include "../search/result.hpp" +#include "../search/params.hpp" #include "../std/vector.hpp" @@ -33,6 +34,8 @@ class SearchPanel : public QWidget vector m_results; int volatile m_queryId; + search::SearchParams m_params; + Q_OBJECT signals: diff --git a/search/params.hpp b/search/params.hpp new file mode 100644 index 0000000000..f86b1d7754 --- /dev/null +++ b/search/params.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "../geometry/point2d.hpp" + +#include "../std/function.hpp" +#include "../std/string.hpp" + + +namespace search +{ + class Results; + typedef function SearchCallbackT; + + class SearchParams + { + public: + enum ModeT { All, NearMe }; + + SearchParams() : m_mode(All), m_validPos(false) {} + + inline void SetNearMeMode(bool b) + { + if (b) + { + m_mode = NearMe; + } + else + { + m_mode = All; + m_validPos = false; + } + } + + inline void SetPosition(double lat, double lon) + { + m_lat = lat; + m_lon = lon; + m_validPos = true; + } + + public: + SearchCallbackT m_callback; + + string m_query; + ModeT m_mode; + + double m_lat, m_lon; + bool m_validPos; + }; +} diff --git a/search/search.pro b/search/search.pro index d7750be5e4..3db91d00b4 100644 --- a/search/search.pro +++ b/search/search.pro @@ -20,7 +20,8 @@ HEADERS += \ approximate_string_match.hpp \ feature_offset_match.hpp \ category_info.hpp \ - lang_keywords_scorer.hpp + lang_keywords_scorer.hpp \ + params.hpp \ SOURCES += \ search_engine.cpp \ @@ -30,4 +31,4 @@ SOURCES += \ result.cpp \ latlon_match.cpp \ approximate_string_match.cpp \ - lang_keywords_scorer.cpp + lang_keywords_scorer.cpp \ diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 4f54de2de2..74401445a1 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -90,14 +90,9 @@ void Engine::InitializeCategoriesAndSuggestStrings(CategoriesHolder const & cate m_pData->m_stringsToSuggest.assign(stringsToSuggest.begin(), stringsToSuggest.end()); } -void Engine::SetViewport(m2::RectD const & viewport) -{ - m_viewport = viewport; -} - +/* void Engine::SetPosition(double lat, double lon) { - /* m2::PointD const oldPos = m_pQuery->GetPosition(); if (m_trackEnable && @@ -114,36 +109,15 @@ void Engine::SetPosition(double lat, double lon) RepeatSearch(); } - */ } +*/ -void Engine::EnablePositionTrack(bool enable) -{ - /* - m_trackEnable = enable; - - if (m_trackEnable) - { - LOG(LINFO, ("Enable tracking")); - } - else - { - LOG(LINFO, ("Disable tracking")); - - m_pQuery->SetPosition(m_savedViewport.Center()); - m_pQuery->SetViewport(m_savedViewport); - - RepeatSearch(); - } - */ -} - -void Engine::Search(string const & query, SearchCallbackT const & callback) +void Engine::Search(SearchParams const & params, m2::RectD const & viewport) { { threads::MutexGuard guard(m_updateMutex); - m_query = query; - m_callback = callback; + m_params = params; + m_viewport = viewport; } // bind does copy of 'query' and 'callback' @@ -166,10 +140,11 @@ void Engine::SearchAsync() try { string query; + { threads::MutexGuard guard(m_updateMutex); - query = m_query; - callback = m_callback; + query = m_params.m_query; + callback = m_params.m_callback; } m_pQuery->Search(query, res); diff --git a/search/search_engine.hpp b/search/search_engine.hpp index 752d754af8..a4c5370502 100644 --- a/search/search_engine.hpp +++ b/search/search_engine.hpp @@ -1,6 +1,6 @@ #pragma once -//#include "../indexer/index.hpp" +#include "params.hpp" #include "../geometry/rect2d.hpp" @@ -40,12 +40,7 @@ public: string const & lang); ~Engine(); - void SetViewport(m2::RectD const & viewport); - void SetPosition(double lat, double lon); - - void EnablePositionTrack(bool enable); - - void Search(string const & query, SearchCallbackT const & callback); + void Search(SearchParams const & params, m2::RectD const & viewport); string GetCountryFile(m2::PointD const & pt) const; @@ -56,9 +51,7 @@ private: threads::Mutex m_searchMutex, m_updateMutex; - string m_query; - SearchCallbackT m_callback; - + SearchParams m_params; m2::RectD m_viewport; Index const * m_pIndex;