Restart search and display results with every viewport changing.

This commit is contained in:
vng 2014-05-29 19:57:22 +03:00 committed by Alex Zolotarev
parent 7a1c6e5010
commit f39540011b
12 changed files with 167 additions and 138 deletions

View file

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

View file

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

View file

@ -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<SearchMarkPoint *>(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<SearchMarkPoint *>(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)

View file

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

View file

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

View file

@ -64,9 +64,6 @@ namespace qt
Q_OBJECT
signals:
void ViewportChanged();
public Q_SLOTS:
void MoveLeft();
void MoveRight();

View file

@ -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<SearchMarkPoint *>(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<size_t>(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;

View file

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

View file

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

View file

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

View file

@ -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<size_t>(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<size_t>(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<Query::ViewportID>(res.GetViewportID());
return new impl::PreResult2(feature, &res,
m_query.GetViewport(viewportID), m_query.GetPosition(viewportID),
name, country);
@ -748,10 +747,10 @@ template <class T> void Query::ProcessSuggestions(vector<T> & 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<int8_t>(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<ViewportID>(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<FeaturesFilter> 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<int8_t>(edge[0])))
int8_t const lang = static_cast<int8_t>(edge[0]);
if (edge[0] < search::CATEGORIES_LANG && params.IsLangExist(lang))
{
scoped_ptr<TrieIterator> 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<int8_t>(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)

View file

@ -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 ParamT> class CompareT