forked from organicmaps/organicmaps
Restart search and display results with every viewport changing.
This commit is contained in:
parent
7a1c6e5010
commit
f39540011b
12 changed files with 167 additions and 138 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -64,9 +64,6 @@ namespace qt
|
|||
|
||||
Q_OBJECT
|
||||
|
||||
signals:
|
||||
void ViewportChanged();
|
||||
|
||||
public Q_SLOTS:
|
||||
void MoveLeft();
|
||||
void MoveRight();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue