From 2ff0db6833154ef27c9d11a191fc340c988df88f Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 4 Jul 2014 19:57:08 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20first=20search=20results=20when=20?= =?UTF-8?q?=E2=80=9CSearch=20on=20map=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- map/bookmark_manager.cpp | 4 ++-- map/bookmark_manager.hpp | 2 +- map/framework.cpp | 14 ++++++++++---- map/framework.hpp | 2 +- map/user_mark_container.cpp | 8 ++++++-- map/user_mark_container.hpp | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index f83519edf3..5bcee9e7a6 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -404,9 +404,9 @@ UserMark * BookmarkManager::UserMarksAddMark(UserMarkContainer::Type type, const return FindUserMarksContainer(type)->GetController().CreateUserMark(ptOrg); } -void BookmarkManager::UserMarksClear(UserMarkContainer::Type type) +void BookmarkManager::UserMarksClear(UserMarkContainer::Type type, size_t skipCount/* = 0*/) { - FindUserMarksContainer(type)->Clear(); + FindUserMarksContainer(type)->Clear(skipCount); } UserMarkContainer::Controller & BookmarkManager::UserMarksGetController(UserMarkContainer::Type type) diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 37caa8cb10..406b70beec 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -77,7 +77,7 @@ public: void UserMarksSetDrawable(UserMarkContainer::Type type, bool isDrawable); void UserMarksIsDrawable(UserMarkContainer::Type type); UserMark * UserMarksAddMark(UserMarkContainer::Type type, m2::PointD const & ptOrg); - void UserMarksClear(UserMarkContainer::Type type); + void UserMarksClear(UserMarkContainer::Type type, size_t skipCount = 0); UserMarkContainer::Controller & UserMarksGetController(UserMarkContainer::Type type); void SetScreen(graphics::Screen * screen); diff --git a/map/framework.cpp b/map/framework.cpp index 3d27b75fa2..b60df96791 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -195,7 +195,8 @@ Framework::Framework() m_benchmarkEngine(0), m_bmManager(*this), m_balloonManager(*this), - m_locationChangedSlotID(-1) + m_locationChangedSlotID(-1), + m_fixedSearchResults(0) { // Checking whether we should enable benchmark. bool isBenchmarkingEnabled = false; @@ -1171,6 +1172,7 @@ void Framework::ShowSearchResult(search::Result const & res) m_bmManager.UserMarksSetDrawable(type, false); m_lastSearch.Clear(); + m_fixedSearchResults = 0; search::AddressInfo info; info.MakeFrom(res); @@ -1238,7 +1240,9 @@ size_t Framework::ShowAllSearchResults() return count; } + m_fixedSearchResults = 0; FillSearchResultsMarks(results); + m_fixedSearchResults = count; // Setup viewport according to results. m2::AnyRectD viewport = m_navigator.Screen().GlobalRect(); @@ -1274,8 +1278,8 @@ void Framework::FillSearchResultsMarks(search::Results const & results) { UserMarkContainer::Type const type = UserMarkContainer::SEARCH_MARK; m_bmManager.UserMarksSetVisible(type, true); - m_bmManager.UserMarksClear(type); m_bmManager.UserMarksSetDrawable(type, true); + m_bmManager.UserMarksClear(type, m_fixedSearchResults); size_t const count = results.GetCount(); for (size_t i = 0; i < count; ++i) @@ -1288,8 +1292,8 @@ void Framework::FillSearchResultsMarks(search::Results const & results) AddressInfo info; info.MakeFrom(r); - SearchMarkPoint * mark = static_cast( - m_bmManager.UserMarksAddMark(type, r.GetFeatureCenter())); + m2::PointD const pt = r.GetFeatureCenter(); + SearchMarkPoint * mark = static_cast(m_bmManager.UserMarksAddMark(type, pt)); mark->SetInfo(info); } } @@ -1300,6 +1304,8 @@ void Framework::CancelInteractiveSearch() m_lastSearch.Clear(); m_bmManager.UserMarksClear(UserMarkContainer::SEARCH_MARK); + m_fixedSearchResults = 0; + Invalidate(); } diff --git a/map/framework.hpp b/map/framework.hpp index 673266d162..6a6f8e2fd5 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -116,7 +116,6 @@ protected: scoped_ptr m_animController; InformationDisplay m_informationDisplay; - /// How many pixels around touch point are used to get bookmark or POI static const int TOUCH_PIXEL_RADIUS = 20; @@ -247,6 +246,7 @@ public: private: search::Engine * GetSearchEngine() const; search::SearchParams m_lastSearch; + uint8_t m_fixedSearchResults; void OnSearchResultsCallback(search::Results const & results); void OnSearchResultsCallbackUI(search::Results const & results); diff --git a/map/user_mark_container.cpp b/map/user_mark_container.cpp index e9ed1c7c9b..933c05a26c 100644 --- a/map/user_mark_container.cpp +++ b/map/user_mark_container.cpp @@ -152,9 +152,13 @@ void UserMarkContainer::Draw(PaintOverlayEvent const & e, UserMarkDLCache * cach } } -void UserMarkContainer::Clear() +void UserMarkContainer::Clear(size_t skipCount/* = 0*/) { - DeleteRange(m_userMarks, DeleteFunctor()); + for (size_t i = skipCount; i < m_userMarks.size(); ++i) + delete m_userMarks[i]; + + if (skipCount < m_userMarks.size()) + m_userMarks.erase(m_userMarks.begin() + skipCount, m_userMarks.end()); } namespace diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index 811988fe0d..2bf0b54411 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -70,7 +70,7 @@ public: void ActivateMark(UserMark const * mark); void DiactivateMark(); - void Clear(); + void Clear(size_t skipCount = 0); double GetDepth() const { return m_layerDepth; }