diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index f4a123e187..599bc0b2ca 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -150,9 +150,9 @@ void BookmarkManager::DrawCategory(BookmarkCategory const * cat, PaintOverlayEve void BookmarkManager::ClearItems() { + ResetRouteTrack(); for_each(m_categories.begin(), m_categories.end(), DeleteFunctor()); m_categories.clear(); - DeleteRouteCategory(); } void BookmarkManager::LoadBookmarks() @@ -255,21 +255,23 @@ void BookmarkManager::DrawItems(shared_ptr const & e) const LazyMatrixCalc matrix(screen, m_lastScale); - auto dlUpdateFn = [&matrix, &limitRect, this] (BookmarkCategory const * cat) + auto trackUpdateFn = [&matrix, &limitRect, this](Track const * track) + { + if (limitRect.IsIntersect(track->GetLimitRect())) + { + if (!track->HasDisplayList() || matrix.IsScaleChanged()) + track->CreateDisplayList(m_bmScreen, matrix.GetScaleG2P()); + } + else + track->DeleteDisplayList(); + }; + + auto dlUpdateFn = [&trackUpdateFn] (BookmarkCategory const * cat) { if (cat->IsVisible()) { for (size_t j = 0; j < cat->GetTracksCount(); ++j) - { - Track const * track = cat->GetTrack(j); - if (limitRect.IsIntersect(track->GetLimitRect())) - { - if (!track->HasDisplayList() || matrix.IsScaleChanged()) - track->CreateDisplayList(m_bmScreen, matrix.GetScaleG2P()); - } - else - track->DeleteDisplayList(); - } + trackUpdateFn(cat->GetTrack(j)); } }; @@ -286,10 +288,11 @@ void BookmarkManager::DrawItems(shared_ptr const & e) const PaintOverlayEvent event(e->drawer(), screen); for_each(m_userMarkLayers.begin(), m_userMarkLayers.end(), bind(&UserMarkContainer::Draw, _1, event, m_cache)); for_each(m_categories.begin(), m_categories.end(), bind(&BookmarkManager::DrawCategory, this, _1, event)); - if (m_routeCategory != nullptr) + if (m_routeTrack != nullptr) { - dlUpdateFn(m_routeCategory.get()); - DrawCategory(m_routeCategory.get(), event); + trackUpdateFn(m_routeTrack.get()); + if (m_routeTrack->HasDisplayList()) + m_routeTrack->Draw(pScreen, LazyMatrixCalc(screen, m_lastScale).GetFinalG2P()); } m_selection.Draw(event, m_cache); @@ -461,24 +464,21 @@ void BookmarkManager::ResetScreen() { // Delete display lists for all tracks for_each(m_categories.begin(), m_categories.end(), dlDeleteFn); - if (m_routeCategory != nullptr) - dlDeleteFn(m_routeCategory.get()); + if (m_routeTrack != nullptr) + m_routeTrack->DeleteDisplayList(); m_bmScreen = 0; } } -BookmarkCategory * BookmarkManager::GetRouteCategory() +void BookmarkManager::SetRouteTrack(Track & track) { - if (m_routeCategory == nullptr) - m_routeCategory.reset(new BookmarkCategory("routes", m_framework)); - - return m_routeCategory.get(); + m_routeTrack.reset(track.CreatePersistent()); } -void BookmarkManager::DeleteRouteCategory() +void BookmarkManager::ResetRouteTrack() { - m_routeCategory.reset(); + m_routeTrack.reset(); } UserMarkContainer const * BookmarkManager::FindUserMarksContainer(UserMarkContainer::Type type) const diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 59146c41a9..72d6e8b86a 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -11,7 +11,7 @@ namespace graphics { class Screen; } class BookmarkManager : private noncopyable { - unique_ptr m_routeCategory; + unique_ptr m_routeTrack; vector m_categories; string m_lastCategoryUrl; string m_lastType; @@ -86,8 +86,8 @@ public: void SetScreen(graphics::Screen * screen); void ResetScreen(); - BookmarkCategory * GetRouteCategory(); - void DeleteRouteCategory(); + void SetRouteTrack(Track & track); + void ResetRouteTrack(); private: UserMarkContainer const * FindUserMarksContainer(UserMarkContainer::Type type) const; diff --git a/map/framework.cpp b/map/framework.cpp index 2babdbd2a6..bf519559a9 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1904,7 +1904,7 @@ void Framework::FollowRoute() void Framework::RemoveRoute() { - m_bmManager.DeleteRouteCategory(); + m_bmManager.ResetRouteTrack(); } void Framework::CloseRouting() @@ -1933,9 +1933,7 @@ void Framework::InsertRoute(Route const & route) track.AddClosingSymbol(true, "route_from", graphics::EPosCenter, graphics::routingSymbolsDepth); track.AddClosingSymbol(false, "route_to", graphics::EPosCenter, graphics::routingFinishDepth); - BookmarkCategory * cat = m_bmManager.GetRouteCategory(); - cat->ClearTracks(); - cat->AddTrack(track); + m_bmManager.SetRouteTrack(track); Invalidate(); }