From d455c04c3b89046200b8042e99df2bfd178c3fad Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Mon, 5 Jun 2017 18:45:55 +0300 Subject: [PATCH 1/4] Route points implementation based on UserMark. --- drape_frontend/user_mark_shapes.cpp | 2 + drape_frontend/user_marks_provider.hpp | 1 + map/bookmark_manager.cpp | 2 + map/map.pro | 2 + map/routing_mark.cpp | 192 +++++++++++++++++++++++++ map/routing_mark.hpp | 62 ++++++++ map/user_mark.cpp | 1 + map/user_mark.hpp | 1 + map/user_mark_container.hpp | 3 +- 9 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 map/routing_mark.cpp create mode 100644 map/routing_mark.hpp diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index 973fda6590..1cdc0084c3 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -90,6 +90,8 @@ void CacheUserPoints(UserMarksProvider const * provider, ref_ptrGetUserPointMark(i); + if (!userMark->IsVisible()) + continue; TileKey const tileKey = GetTileKeyByPoint(userMark->GetPivot(), kZoomLevel); marks[tileKey].push_back(userMark); } diff --git a/drape_frontend/user_marks_provider.hpp b/drape_frontend/user_marks_provider.hpp index 8a9b45e4a7..ea8efe2cb0 100644 --- a/drape_frontend/user_marks_provider.hpp +++ b/drape_frontend/user_marks_provider.hpp @@ -21,6 +21,7 @@ public: virtual dp::Anchor GetAnchor() const = 0; virtual float GetDepth() const = 0; virtual bool RunCreationAnim() const = 0; + virtual bool IsVisible() const { return true; } }; class UserLineMark diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index b210150e24..14703d3f7f 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -1,5 +1,6 @@ #include "map/bookmark_manager.hpp" #include "map/framework.hpp" +#include "map/routing_mark.hpp" #include "map/user_mark.hpp" #include "platform/platform.hpp" @@ -23,6 +24,7 @@ BookmarkManager::BookmarkManager(Framework & f) m_userMarkLayers.push_back(new SearchUserMarkContainer(0.0 /* activePinDepth */, m_framework)); m_userMarkLayers.push_back(new ApiUserMarkContainer(0.0 /* activePinDepth */, m_framework)); m_userMarkLayers.push_back(new DebugUserMarkContainer(0.0 /* debugDepth */, m_framework)); + m_userMarkLayers.push_back(new RouteUserMarkContainer(0.0 /* activePinDepth */, m_framework)); UserMarkContainer::InitStaticMarks(FindUserMarksContainer(UserMarkType::SEARCH_MARK)); } diff --git a/map/map.pro b/map/map.pro index 5d5c4f4b84..548d644b59 100644 --- a/map/map.pro +++ b/map/map.pro @@ -33,6 +33,7 @@ HEADERS += \ place_page_info.hpp \ reachable_by_taxi_checker.hpp \ routing_manager.hpp \ + routing_mark.hpp \ track.hpp \ traffic_manager.hpp \ user_mark.hpp \ @@ -63,6 +64,7 @@ SOURCES += \ place_page_info.cpp \ reachable_by_taxi_checker.cpp \ routing_manager.cpp \ + routing_mark.cpp \ track.cpp \ traffic_manager.cpp \ user_mark.cpp \ diff --git a/map/routing_mark.cpp b/map/routing_mark.cpp new file mode 100644 index 0000000000..5b2c067e14 --- /dev/null +++ b/map/routing_mark.cpp @@ -0,0 +1,192 @@ +#include "map/routing_mark.hpp" + +#include + +static int8_t const kMaxIntermediatePointsCount = 3; + +RouteMarkPoint::RouteMarkPoint(const m2::PointD & ptOrg, UserMarkContainer * container) + : UserMark(ptOrg, container) +{} + +bool RouteMarkPoint::IsVisible() const +{ + return m_isVisible; +} + +void RouteMarkPoint::SetIsVisible(bool isVisible) +{ + m_isVisible = isVisible; +} + +std::string RouteMarkPoint::GetSymbolName() const +{ + switch (m_pointType) + { + case RouteMarkType::Start: + return "placemark-blue"; + case RouteMarkType::Intermediate: + if (m_intermediateIndex == 0) + return "placemark-yellow"; + if (m_intermediateIndex == 1) + return "placemark-orange"; + return "placemark-red"; + case RouteMarkType::Finish: + return "placemark-green"; + } +} + +RouteUserMarkContainer::RouteUserMarkContainer(double layerDepth, Framework & fm) + : UserMarkContainer(layerDepth, UserMarkType::ROUTING_MARK, fm) +{ +} + +UserMark * RouteUserMarkContainer::AllocateUserMark(m2::PointD const & ptOrg) +{ + return new RouteMarkPoint(ptOrg, this); +} + +RoutePointsLayout::RoutePointsLayout(UserMarksController & routeMarks) + : m_routeMarks(routeMarks) +{} + +RouteMarkPoint * RoutePointsLayout::AddRoutePoint(m2::PointD const & ptOrg, RouteMarkType type, int8_t intermediateIndex) +{ + if (m_routeMarks.GetUserMarkCount() == kMaxIntermediatePointsCount + 2) + return nullptr; + + RouteMarkPoint * sameTypePoint = GetRoutePoint(type, intermediateIndex); + if (sameTypePoint != nullptr) + { + if (type == RouteMarkType::Finish) + { + int8_t const intermediatePointsCount = std::max((int)m_routeMarks.GetUserMarkCount() - 2, 0); + sameTypePoint->SetRoutePointType(RouteMarkType::Intermediate); + sameTypePoint->SetIntermediateIndex(intermediatePointsCount); + } + else + { + int8_t const offsetIndex = type == RouteMarkType::Start ? 0 : intermediateIndex; + + ForEachIntermediatePoint([offsetIndex](RouteMarkPoint * mark) + { + if (mark->GetIntermediateIndex() >= offsetIndex) + mark->SetIntermediateIndex(mark->GetIntermediateIndex() + 1); + }); + + if (type == RouteMarkType::Start) + { + sameTypePoint->SetRoutePointType(RouteMarkType::Intermediate); + sameTypePoint->SetIntermediateIndex(0); + } + } + } + RouteMarkPoint * newPoint = static_cast(m_routeMarks.CreateUserMark(ptOrg)); + newPoint->SetRoutePointType(type); + newPoint->SetIntermediateIndex(intermediateIndex); + + return newPoint; +} + + +bool RoutePointsLayout::RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex) +{ + RouteMarkPoint * point = nullptr; + size_t index = 0; + for (size_t sz = m_routeMarks.GetUserMarkCount(); index < sz; ++index) + { + RouteMarkPoint * mark = static_cast(m_routeMarks.GetUserMarkForEdit(index)); + if (mark->GetRoutePointType() == type && mark->GetIntermediateIndex() == intermediateIndex) + { + point = mark; + break; + } + } + + if (point == nullptr) + return false; + + if (type == RouteMarkType::Finish) + { + RouteMarkPoint * lastIntermediate = nullptr; + int8_t maxIntermediateIndex = -1; + ForEachIntermediatePoint([&lastIntermediate, &maxIntermediateIndex](RouteMarkPoint * mark) + { + if (mark->GetIntermediateIndex() > maxIntermediateIndex) + { + lastIntermediate = mark; + maxIntermediateIndex = mark->GetIntermediateIndex(); + } + }); + + if (lastIntermediate != nullptr) + lastIntermediate->SetRoutePointType(RouteMarkType::Finish); + } + else if (type == RouteMarkType::Start) + { + ForEachIntermediatePoint([](RouteMarkPoint * mark) + { + if (mark->GetIntermediateIndex() == 0) + mark->SetRoutePointType(RouteMarkType::Start); + else + mark->SetIntermediateIndex(mark->GetIntermediateIndex() - 1); + }); + } + else + { + ForEachIntermediatePoint([point](RouteMarkPoint * mark) + { + if (mark->GetIntermediateIndex() > point->GetIntermediateIndex()) + mark->SetIntermediateIndex(mark->GetIntermediateIndex() - 1); + }); + } + + m_routeMarks.DeleteUserMark(index); + return true; +} + +bool RoutePointsLayout::MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, + RouteMarkType destType, int8_t destIntermediateIndex) +{ + RouteMarkPoint * point = GetRoutePoint(currentType, currentIntermediateIndex); + if (point == nullptr) + return false; + + m2::PointD const pt = point->GetPivot(); + bool const isVisible = point->IsVisible(); + + RemoveRoutePoint(currentType, currentIntermediateIndex); + RouteMarkPoint * point2 = AddRoutePoint(pt, destType, destIntermediateIndex); + point2->SetIsVisible(isVisible); + return true; +} + +RouteMarkPoint * RoutePointsLayout::GetRoutePoint(RouteMarkType type, int8_t intermediateIndex) +{ + for (size_t i = 0, sz = m_routeMarks.GetUserMarkCount(); i < sz; ++i) + { + RouteMarkPoint * mark = static_cast(m_routeMarks.GetUserMarkForEdit(i)); + if (mark->GetRoutePointType() != type) + continue; + + if (type == RouteMarkType::Intermediate) + { + if (mark->GetIntermediateIndex() == intermediateIndex) + return mark; + } + else + { + return mark; + } + } + return nullptr; +} + +void RoutePointsLayout::ForEachIntermediatePoint(TRoutePointCallback const & fn) +{ + for (size_t i = 0, sz = m_routeMarks.GetUserMarkCount(); i < sz; ++i) + { + RouteMarkPoint * mark = static_cast(m_routeMarks.GetUserMarkForEdit(i)); + if (mark->GetRoutePointType() == RouteMarkType::Intermediate) + fn(mark); + } +} diff --git a/map/routing_mark.hpp b/map/routing_mark.hpp new file mode 100644 index 0000000000..5ca157fd15 --- /dev/null +++ b/map/routing_mark.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include "map/user_mark_container.hpp" + +#include + +enum class RouteMarkType +{ + Start, + Intermediate, + Finish +}; + +class RouteMarkPoint : public UserMark +{ +public: + RouteMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container); + virtual ~RouteMarkPoint() {} + + bool IsVisible() const override; + void SetIsVisible(bool isVisible); + + std::string GetSymbolName() const override; + UserMark::Type GetMarkType() const override { return Type::ROUTING; } + + RouteMarkType GetRoutePointType() const { return m_pointType; } + void SetRoutePointType(RouteMarkType type) { m_pointType = type; } + + void SetIntermediateIndex(int8_t index) { m_intermediateIndex = index; } + int8_t GetIntermediateIndex() { return m_intermediateIndex; } + +private: + RouteMarkType m_pointType; + int8_t m_intermediateIndex = 0; + bool m_isVisible = true; +}; + +class RouteUserMarkContainer : public UserMarkContainer +{ +public: + RouteUserMarkContainer(double layerDepth, Framework & fm); +protected: + UserMark * AllocateUserMark(m2::PointD const & ptOrg) override; +}; + +class RoutePointsLayout +{ +public: + RoutePointsLayout(UserMarksController & routeMarks); + + RouteMarkPoint * GetRoutePoint(RouteMarkType type, int8_t intermediateIndex); + RouteMarkPoint * AddRoutePoint(m2::PointD const & ptOrg, RouteMarkType type, int8_t intermediateIndex = 0); + bool RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); + bool MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, + RouteMarkType destType, int8_t destIntermediateIndex); + +private: + using TRoutePointCallback = function; + void ForEachIntermediatePoint(TRoutePointCallback const & fn); + + UserMarksController & m_routeMarks; +}; diff --git a/map/user_mark.cpp b/map/user_mark.cpp index 66e80444c1..9679274b96 100644 --- a/map/user_mark.cpp +++ b/map/user_mark.cpp @@ -106,5 +106,6 @@ string DebugPrint(UserMark::Type type) case UserMark::Type::BOOKMARK: return "BOOKMARK"; case UserMark::Type::MY_POSITION: return "MY_POSITION"; case UserMark::Type::DEBUG_MARK: return "DEBUG_MARK"; + case UserMark::Type::ROUTING: return "ROUTING"; } } diff --git a/map/user_mark.hpp b/map/user_mark.hpp index d205fa7689..a78f277174 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -28,6 +28,7 @@ public: POI, BOOKMARK, MY_POSITION, + ROUTING, DEBUG_MARK }; diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index e9e95ac97d..860fea50a2 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -21,7 +21,8 @@ enum class UserMarkType SEARCH_MARK, API_MARK, DEBUG_MARK, - BOOKMARK_MARK + BOOKMARK_MARK, + ROUTING_MARK }; class UserMarksController From b55dd4c1ae83207c531e13aa5ee9d9432da183d4 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Thu, 8 Jun 2017 17:01:56 +0300 Subject: [PATCH 2/4] Using route marks in the routing manager. --- android/jni/com/mapswithme/maps/Framework.cpp | 10 +- iphone/Maps/Core/Routing/MWMRouter.mm | 4 +- map/bookmark_manager.cpp | 1 + map/framework.cpp | 20 ++++ map/framework.hpp | 2 + map/place_page_info.cpp | 7 +- map/place_page_info.hpp | 1 + map/routing_manager.cpp | 97 ++++++++----------- map/routing_manager.hpp | 13 ++- 9 files changed, 79 insertions(+), 76 deletions(-) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 7a9ae5d835..21263389f9 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -1146,17 +1146,15 @@ Java_com_mapswithme_maps_Framework_nativeGetBestRouter(JNIEnv * env, jclass, jdo JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetRouteStartPoint(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean valid) { - frm()->GetRoutingManager().SetRouteStartPoint(frm()->GetBookmarkManager(), - m2::PointD(MercatorBounds::FromLatLon(lat, lon)), - static_cast(valid)); + frm()->GetRoutingManager().AddRoutePoint(m2::PointD(MercatorBounds::FromLatLon(lat, lon)), + static_cast(valid), RouteMarkType::Start); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetRouteEndPoint(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean valid) { - frm()->GetRoutingManager().SetRouteFinishPoint(frm()->GetBookmarkManager(), - m2::PointD(MercatorBounds::FromLatLon(lat, lon)), - static_cast(valid)); + frm()->GetRoutingManager().AddRoutePoint(m2::PointD(MercatorBounds::FromLatLon(lat, lon)), + static_cast(valid), RouteMarkType::Finish); } JNIEXPORT void JNICALL diff --git a/iphone/Maps/Core/Routing/MWMRouter.mm b/iphone/Maps/Core/Routing/MWMRouter.mm index b459171276..74d4f381a6 100644 --- a/iphone/Maps/Core/Routing/MWMRouter.mm +++ b/iphone/Maps/Core/Routing/MWMRouter.mm @@ -202,8 +202,8 @@ bool isMarkerPoint(MWMRoutePoint * point) { return point.isValid && !point.isMyP self.type = routerType(GetFramework().GetRoutingManager().GetBestRouter(startPoint, finishPoint)); f.GetRoutingManager().BuildRoute(startPoint, finishPoint, isP2P, 0 /* timeoutSec */); - f.GetRoutingManager().SetRouteStartPoint(f.GetBookmarkManager(), startPoint, isMarkerPoint(self.startPoint)); - f.GetRoutingManager().SetRouteFinishPoint(f.GetBookmarkManager(), finishPoint, isMarkerPoint(self.finishPoint)); + f.GetRoutingManager().AddRoutePoint(startPoint, isMarkerPoint(self.startPoint), RouteMarkType::Start); + f.GetRoutingManager().AddRoutePoint(finishPoint, isMarkerPoint(self.finishPoint), RouteMarkType::Finish); [mapViewControlsManager onRouteRebuild]; } diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 14703d3f7f..852969eba0 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -231,6 +231,7 @@ UserMark const * BookmarkManager::FindNearestUserMark(TTouchRectHolder const & h for_each(m_categories.begin(), m_categories.end(), ref(finder)); finder(FindUserMarksContainer(UserMarkType::API_MARK)); finder(FindUserMarksContainer(UserMarkType::SEARCH_MARK)); + finder(FindUserMarksContainer(UserMarkType::ROUTING_MARK)); return finder.GetFindedMark(); } diff --git a/map/framework.cpp b/map/framework.cpp index f07544087c..1b724497d1 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -414,6 +414,7 @@ Framework::Framework(FrameworkParams const & params) m_connectToGpsTrack = GpsTracker::Instance().IsEnabled(); m_ParsedMapApi.SetBookmarkManager(&m_bmManager); + m_routingManager.SetBookmarkManager(&m_bmManager); // Init strings bundle. // @TODO. There are hardcoded strings below which are defined in strings.txt as well. @@ -942,6 +943,22 @@ void Framework::FillMyPositionInfo(place_page::Info & info) const info.m_customName = m_stringsBundle.GetString("my_position"); } +void Framework::FillRouteMarkInfo(RouteMarkPoint const & rmp, place_page::Info & info) const +{ + FillPointInfo(rmp.GetPivot(), "", info); + info.m_isRoutePoint = true; + + switch (rmp.GetRoutePointType()) + { + case RouteMarkType::Start: + info.m_customName = "Start"; + break; + case RouteMarkType::Finish: + info.m_customName = "Finish"; + break; + } +} + void Framework::ShowBookmark(BookmarkAndCategory const & bnc) { StopLocationFollow(); @@ -2417,6 +2434,9 @@ df::SelectionShape::ESelectedObject Framework::OnTapEventImpl(TapEvent const & t case UserMark::Type::SEARCH: FillSearchResultInfo(*static_cast(mark), outInfo); break; + case UserMark::Type::ROUTING: + FillRouteMarkInfo(*static_cast(mark), outInfo); + break; default: ASSERT(false, ("FindNearestUserMark returned invalid mark.")); } diff --git a/map/framework.hpp b/map/framework.hpp index fb18b5a624..13e40a6b71 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -10,6 +10,7 @@ #include "map/mwm_url.hpp" #include "map/place_page_info.hpp" #include "map/routing_manager.hpp" +#include "map/routing_mark.hpp" #include "map/track.hpp" #include "map/traffic_manager.hpp" @@ -676,6 +677,7 @@ private: void FillApiMarkInfo(ApiMarkPoint const & api, place_page::Info & info) const; void FillSearchResultInfo(SearchMarkPoint const & smp, place_page::Info & info) const; void FillMyPositionInfo(place_page::Info & info) const; + void FillRouteMarkInfo(RouteMarkPoint const & rmp, place_page::Info & info) const; public: void FillBookmarkInfo(Bookmark const & bmk, BookmarkAndCategory const & bac, place_page::Info & info) const; diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index b756123a75..fc97d0fc88 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -22,18 +22,13 @@ char const * const Info::kPricingSymbol = "$"; bool Info::IsFeature() const { return m_featureID.IsValid(); } bool Info::IsBookmark() const { return m_bac.IsValid(); } bool Info::IsMyPosition() const { return m_isMyPosition; } +bool Info::IsRoutePoint() const { return m_isRoutePoint; } bool Info::IsSponsored() const { return m_sponsoredType != SponsoredType::None; } bool Info::IsNotEditableSponsored() const { return m_sponsoredType != SponsoredType::None && m_sponsoredType != SponsoredType::Opentable; } -bool Info::IsRoutePoint() const -{ - //TODO(@darina) Implement checker - return m_bac.IsValid() && m_bookmarkCategoryName == "TMP_Routing_Points"; -} - bool Info::ShouldShowAddPlace() const { auto const isPointOrBuilding = IsPointType() || IsBuilding(); diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index ddc54c5994..8788628e58 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -147,6 +147,7 @@ public: /// one part of the country (or several countries for disputed territories). storage::TCountriesVec m_topmostCountryIds; + bool m_isRoutePoint = false; bool m_isMyPosition = false; /// True if editing of a selected point is allowed by basic logic. /// See initialization in framework. diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index 0bc1b59f98..8d4581104c 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -1,6 +1,7 @@ #include "routing_manager.hpp" #include "map/chart_generator.hpp" +#include "map/routing_mark.hpp" #include "map/mwm_tree.hpp" #include "private.h" @@ -64,6 +65,11 @@ RoutingManager::RoutingManager(Callbacks && callbacks, Delegate & delegate) [this](Route const & route, IRouter::ResultCode code) { OnRebuildRouteReady(route, code); }); } +void RoutingManager::SetBookmarkManager(BookmarkManager * bmManager) +{ + m_bmManager = bmManager; +} + void RoutingManager::OnBuildRouteReady(Route const & route, IRouter::ResultCode code) { // Hide preview. @@ -257,7 +263,7 @@ void RoutingManager::FollowRoute() m_delegate.OnRouteFollow(m_currentRouterType); - // TODO(@darina) Hide start point user mark + HideRoutePoint(RouteMarkType::Start); } void RoutingManager::CloseRouting() @@ -273,7 +279,8 @@ void RoutingManager::CloseRouting() m_routingSession.Reset(); RemoveRoute(true /* deactivateFollowing */); - //TODO (@darina) Remove route points + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + guard.m_controller.Clear(); } void RoutingManager::SetLastUsedRouter(RouterType type) @@ -281,71 +288,45 @@ void RoutingManager::SetLastUsedRouter(RouterType type) settings::Set(kRouterTypeKey, routing::ToString(type)); } -// TODO(@darina) Remove me -// TEMPORARY { -void TempAddBookmarkAsRoutePoint(BookmarkManager & bm, std::string const & name, - std::string const & bookmarkSymbol, - m2::PointD const & pt, bool isValid) +void RoutingManager::HideRoutePoint(RouteMarkType type, int8_t intermediateIndex) { - std::string categoryName = "TMP_Routing_Points"; - int categoryIndex = -1; - for (size_t i = 0; i < bm.GetBmCategoriesCount(); ++i) + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + RouteMarkPoint * mark = routePoints.GetRoutePoint(type, intermediateIndex); + if (mark != nullptr) { - if (bm.GetBmCategory(i)->GetName() == categoryName) - { - categoryIndex = static_cast(i); - break; - } - } - if (categoryIndex == -1) - categoryIndex = bm.CreateBmCategory(categoryName); - - if (!isValid) - { - BookmarkCategory * cat = bm.GetBmCategory(categoryIndex); - BookmarkCategory::Guard guard(*cat); - int indexToDelete = -1; - for (size_t i = 0; i < guard.m_controller.GetUserMarkCount(); ++i) - { - Bookmark const * bookmark = static_cast(guard.m_controller.GetUserMark(i)); - if (bookmark->GetName() == name) - { - indexToDelete = i; - break; - } - } - if (indexToDelete >= 0) - guard.m_controller.DeleteUserMark(indexToDelete); - } - else - { - BookmarkData dat(name, bookmarkSymbol); - bm.AddBookmark(categoryIndex, pt, dat); - } - - { - BookmarkCategory * cat = bm.GetBmCategory(categoryIndex); - cat->SaveToKMLFile(); + mark->SetIsVisible(false); + guard.m_controller.Update(); } } -// } TEMPORARY -void RoutingManager::SetRouteStartPoint(BookmarkManager & bm, m2::PointD const & pt, bool isValid) +void RoutingManager::AddRoutePoint(m2::PointD const & pt, bool isVisible, + RouteMarkType type, int8_t intermediateIndex) { - // TODO(@darina) Implement on new user marks - // TEMPORARY { - //TempAddBookmarkAsRoutePoint(bm, "Route start point", "placemark-blue", - // pt, isValid); - // } TEMPORARY + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + RouteMarkPoint * mark = routePoints.AddRoutePoint(pt, type, intermediateIndex); + if (mark != nullptr) + mark->SetIsVisible(isVisible); } -void RoutingManager::SetRouteFinishPoint(BookmarkManager & bm, m2::PointD const & pt, bool isValid) +void RoutingManager::RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex) { - // TODO(@darina) Implement on new user marks - // TEMPORARY { - //TempAddBookmarkAsRoutePoint(bm, "Route end point", "placemark-green", - // pt, isValid); - // } TEMPORARY + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + routePoints.RemoveRoutePoint(type, intermediateIndex); +} + +void RoutingManager::MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, + RouteMarkType targetType, int8_t targetIntermediateIndex) +{ + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + routePoints.MoveRoutePoint(currentType, currentIntermediateIndex, + targetType, targetIntermediateIndex); } void RoutingManager::GenerateTurnNotifications(std::vector & turnNotifications) diff --git a/map/routing_manager.hpp b/map/routing_manager.hpp index 35766bf2a6..71096946af 100644 --- a/map/routing_manager.hpp +++ b/map/routing_manager.hpp @@ -1,7 +1,7 @@ #pragma once -// TODO (@darina) TEMPORARY Remove me #include "map/bookmark_manager.hpp" +#include "map/routing_mark.hpp" #include "routing/route.hpp" #include "routing/routing_session.hpp" @@ -75,6 +75,8 @@ public: RoutingManager(Callbacks && callbacks, Delegate & delegate); + void SetBookmarkManager(BookmarkManager * bmManager); + routing::RoutingSession const & RoutingSession() const { return m_routingSession; } routing::RoutingSession & RoutingSession() { return m_routingSession; } void SetRouter(routing::RouterType type); @@ -159,9 +161,11 @@ public: /// GenerateTurnNotifications shall be called by the client when a new position is available. void GenerateTurnNotifications(std::vector & turnNotifications); - // TODO (@darina) Change interface to add/remove route point - void SetRouteStartPoint(BookmarkManager & bm, m2::PointD const & pt, bool isValid); - void SetRouteFinishPoint(BookmarkManager & bm, m2::PointD const & pt, bool isValid); + void AddRoutePoint(m2::PointD const & pt, bool isVisible, RouteMarkType type, int8_t intermediateIndex = 0); + void RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); + void MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, + RouteMarkType targetType, int8_t targetIntermediateIndex); + void HideRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); void SetRouterImpl(routing::RouterType type); void RemoveRoute(bool deactivateFollowing); @@ -215,6 +219,7 @@ private: routing::RoutingSession m_routingSession; Delegate & m_delegate; tracking::Reporter m_trackingReporter; + BookmarkManager * m_bmManager = nullptr; std::vector m_drapeSubroutes; From 82159cb74e45b02aec59e9a2053c5e86365a7a52 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Thu, 8 Jun 2017 21:32:03 +0300 Subject: [PATCH 3/4] Intermediate route point adding. --- android/jni/com/mapswithme/maps/Framework.cpp | 6 +- iphone/Maps/Core/Routing/MWMRouter.mm | 6 +- iphone/Maps/UI/PlacePage/MWMPlacePageData.h | 4 ++ iphone/Maps/UI/PlacePage/MWMPlacePageData.mm | 2 + .../Maps/UI/PlacePage/MWMPlacePageManager.mm | 8 ++- .../ActionBar/MWMPlacePageActionBar.mm | 3 +- map/CMakeLists.txt | 2 + map/framework.cpp | 20 +++++- map/place_page_info.hpp | 4 ++ map/routing_manager.cpp | 61 +++++++++++++++++-- map/routing_manager.hpp | 4 +- map/routing_mark.cpp | 14 ++++- map/routing_mark.hpp | 10 ++- xcode/map/map.xcodeproj/project.pbxproj | 8 +++ 14 files changed, 130 insertions(+), 22 deletions(-) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 21263389f9..517b2f711e 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -1146,15 +1146,17 @@ Java_com_mapswithme_maps_Framework_nativeGetBestRouter(JNIEnv * env, jclass, jdo JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetRouteStartPoint(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean valid) { + frm()->GetRoutingManager().RemoveRoutePoint(RouteMarkType::Start); frm()->GetRoutingManager().AddRoutePoint(m2::PointD(MercatorBounds::FromLatLon(lat, lon)), - static_cast(valid), RouteMarkType::Start); + static_cast(!valid), RouteMarkType::Start); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetRouteEndPoint(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean valid) { + frm()->GetRoutingManager().RemoveRoutePoint(RouteMarkType::Finish); frm()->GetRoutingManager().AddRoutePoint(m2::PointD(MercatorBounds::FromLatLon(lat, lon)), - static_cast(valid), RouteMarkType::Finish); + static_cast(!valid), RouteMarkType::Finish); } JNIEXPORT void JNICALL diff --git a/iphone/Maps/Core/Routing/MWMRouter.mm b/iphone/Maps/Core/Routing/MWMRouter.mm index 74d4f381a6..ac240bea0e 100644 --- a/iphone/Maps/Core/Routing/MWMRouter.mm +++ b/iphone/Maps/Core/Routing/MWMRouter.mm @@ -202,8 +202,10 @@ bool isMarkerPoint(MWMRoutePoint * point) { return point.isValid && !point.isMyP self.type = routerType(GetFramework().GetRoutingManager().GetBestRouter(startPoint, finishPoint)); f.GetRoutingManager().BuildRoute(startPoint, finishPoint, isP2P, 0 /* timeoutSec */); - f.GetRoutingManager().AddRoutePoint(startPoint, isMarkerPoint(self.startPoint), RouteMarkType::Start); - f.GetRoutingManager().AddRoutePoint(finishPoint, isMarkerPoint(self.finishPoint), RouteMarkType::Finish); + if (self.startPoint.isValid) + f.GetRoutingManager().AddRoutePoint(startPoint, self.startPoint.isMyPosition, RouteMarkType::Start); + if (self.finishPoint.isValid) + f.GetRoutingManager().AddRoutePoint(finishPoint, self.finishPoint.isMyPosition, RouteMarkType::Finish); [mapViewControlsManager onRouteRebuild]; } diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageData.h b/iphone/Maps/UI/PlacePage/MWMPlacePageData.h index 0c8f628dbc..8a8e43cdea 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageData.h +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageData.h @@ -145,6 +145,10 @@ using BannerIsReady = void (^)(); - (NSURL *)URLToAllReviews; - (NSArray *)photos; +// Route points +- (RouteMarkType)routeMarkType; +- (int8_t)intermediateIndex; + // Banner - (id)nativeAd; diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm index 120c7209c3..e9b1979c35 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm @@ -517,6 +517,8 @@ using namespace place_page; #pragma mark - Getters +- (RouteMarkType)routeMarkType { return m_info.m_routeMarkType; } +- (int8_t)intermediateIndex { return m_info.m_intermediateIndex; } - (NSString *)address { return @(m_info.GetAddress().c_str()); } - (NSString *)apiURL { return @(m_info.GetApiUrl().c_str()); } - (vector const &)sections { return m_sections; } diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm index 2a22f5584f..97ee724352 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm @@ -276,13 +276,15 @@ void logSponsoredEvent(MWMPlacePageData * data, NSString * eventName) - (void)addStop { - // TODO: Implement adding a routing point. - // self.data contains all point's data. + GetFramework().GetRoutingManager().AddRoutePoint(self.data.mercator, false /* isMyPosition */, + RouteMarkType::Intermediate, 0); + [self close]; } - (void)removeStop { - // TODO: Implement removing a routing point. + GetFramework().GetRoutingManager().RemoveRoutePoint(self.data.routeMarkType, self.data.intermediateIndex); + [self close]; } - (void)taxiTo diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMPlacePageActionBar.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMPlacePageActionBar.mm index 73a004e88e..23ff819c7c 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMPlacePageActionBar.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMPlacePageActionBar.mm @@ -64,8 +64,7 @@ extern NSString * const kAlohalyticsTapEventKey; BOOL const isP2P = self.isPrepareRouteMode; BOOL const isMyPosition = data.isMyPosition; BOOL const isRoutePoint = data.isRoutePoint; - BOOL const isNeedToAddIntermediatePoint = GetFramework().GetRoutingManager().IsRoutingActive() - /* && there is no intermediate point yet */; + BOOL const isNeedToAddIntermediatePoint = GetFramework().GetRoutingManager().CouldAddIntermediatePoint(); EButton sponsoredButton = EButton::BookingSearch; if (isBooking) diff --git a/map/CMakeLists.txt b/map/CMakeLists.txt index 64345ffe77..096f553145 100644 --- a/map/CMakeLists.txt +++ b/map/CMakeLists.txt @@ -56,6 +56,8 @@ set( reachable_by_taxi_checker.hpp routing_manager.cpp routing_manager.hpp + routing_mark.cpp + routing_mark.hpp track.cpp track.hpp traffic_manager.cpp diff --git a/map/framework.cpp b/map/framework.cpp index 1b724497d1..f1e8a2627a 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -948,15 +948,29 @@ void Framework::FillRouteMarkInfo(RouteMarkPoint const & rmp, place_page::Info & FillPointInfo(rmp.GetPivot(), "", info); info.m_isRoutePoint = true; - switch (rmp.GetRoutePointType()) + std::string title; + RouteMarkType const type = rmp.GetRoutePointType(); + int8_t const intermediateIndex = rmp.GetIntermediateIndex(); + switch (type) { case RouteMarkType::Start: - info.m_customName = "Start"; + title = "Start"; + break; + case RouteMarkType::Intermediate: + if (intermediateIndex == 0) + title = "First stop A"; + else if (intermediateIndex == 1) + title = "Second stop B"; + else + title = "Third stop C"; break; case RouteMarkType::Finish: - info.m_customName = "Finish"; + title = "Finish"; break; } + info.m_customName = title; + info.m_routeMarkType = type; + info.m_intermediateIndex = intermediateIndex; } void Framework::ShowBookmark(BookmarkAndCategory const & bnc) diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 8788628e58..1054e9c714 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -1,6 +1,7 @@ #pragma once #include "map/bookmark.hpp" +#include "map/routing_mark.hpp" #include "storage/index.hpp" @@ -148,6 +149,9 @@ public: storage::TCountriesVec m_topmostCountryIds; bool m_isRoutePoint = false; + RouteMarkType m_routeMarkType; + int8_t m_intermediateIndex = 0; + bool m_isMyPosition = false; /// True if editing of a selected point is allowed by basic logic. /// See initialization in framework. diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index 8d4581104c..7eec516e28 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -300,7 +300,49 @@ void RoutingManager::HideRoutePoint(RouteMarkType type, int8_t intermediateIndex } } -void RoutingManager::AddRoutePoint(m2::PointD const & pt, bool isVisible, +void RoutingManager::UpdateRoute() +{ + if (!IsRoutingActive()) + return; + + bool isValid = false; + + m2::PointD startPt; + m2::PointD finishPt; + { + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + RouteMarkPoint * start = routePoints.GetRoutePoint(RouteMarkType::Start); + RouteMarkPoint * finish = routePoints.GetRoutePoint(RouteMarkType::Finish); + if (start != nullptr && finish != nullptr) + { + startPt = start->GetPivot(); + finishPt = finish->GetPivot(); + isValid = true; + } + } + + if (isValid) + { + RemoveRoute(true /* deactivateFollowing */); + m_routingSession.SetUserCurrentPosition(startPt); + m_routingSession.BuildRoute(startPt, finishPt, 0 /* timeoutSec */); + } + else + { + CloseRouting(); + } +} + +bool RoutingManager::CouldAddIntermediatePoint() const +{ + if (!IsRoutingActive()) + return false; + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + return guard.m_controller.GetUserMarkCount() < RoutePointsLayout::kMaxIntermediatePointsCount + 2; +} + +void RoutingManager::AddRoutePoint(m2::PointD const & pt, bool isMyPosition, RouteMarkType type, int8_t intermediateIndex) { ASSERT(m_bmManager != nullptr, ()); @@ -308,15 +350,22 @@ void RoutingManager::AddRoutePoint(m2::PointD const & pt, bool isVisible, RoutePointsLayout routePoints(guard.m_controller); RouteMarkPoint * mark = routePoints.AddRoutePoint(pt, type, intermediateIndex); if (mark != nullptr) - mark->SetIsVisible(isVisible); + { + mark->SetIsVisible(!isMyPosition); + mark->SetIsMyPosition(isMyPosition); + } + // TODO(@darina) Update route. } void RoutingManager::RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex) { ASSERT(m_bmManager != nullptr, ()); - UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); - RoutePointsLayout routePoints(guard.m_controller); - routePoints.RemoveRoutePoint(type, intermediateIndex); + { + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::ROUTING_MARK); + RoutePointsLayout routePoints(guard.m_controller); + routePoints.RemoveRoutePoint(type, intermediateIndex); + } + //UpdateRoute(); } void RoutingManager::MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, @@ -327,6 +376,8 @@ void RoutingManager::MoveRoutePoint(RouteMarkType currentType, int8_t currentInt RoutePointsLayout routePoints(guard.m_controller); routePoints.MoveRoutePoint(currentType, currentIntermediateIndex, targetType, targetIntermediateIndex); + + // TODO(@darina) Update route. } void RoutingManager::GenerateTurnNotifications(std::vector & turnNotifications) diff --git a/map/routing_manager.hpp b/map/routing_manager.hpp index 71096946af..1a0418d733 100644 --- a/map/routing_manager.hpp +++ b/map/routing_manager.hpp @@ -161,11 +161,12 @@ public: /// GenerateTurnNotifications shall be called by the client when a new position is available. void GenerateTurnNotifications(std::vector & turnNotifications); - void AddRoutePoint(m2::PointD const & pt, bool isVisible, RouteMarkType type, int8_t intermediateIndex = 0); + void AddRoutePoint(m2::PointD const & pt, bool isMyPosition, RouteMarkType type, int8_t intermediateIndex = 0); void RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); void MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, RouteMarkType targetType, int8_t targetIntermediateIndex); void HideRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); + bool CouldAddIntermediatePoint() const; void SetRouterImpl(routing::RouterType type); void RemoveRoute(bool deactivateFollowing); @@ -211,6 +212,7 @@ private: bool IsTrackingReporterEnabled() const; void MatchLocationToRoute(location::GpsInfo & info, location::RouteMatchingInfo & routeMatchingInfo) const; + void UpdateRoute(); RouteBuildingCallback m_routingCallback = nullptr; Callbacks m_callbacks; diff --git a/map/routing_mark.cpp b/map/routing_mark.cpp index 5b2c067e14..8d5ee58658 100644 --- a/map/routing_mark.cpp +++ b/map/routing_mark.cpp @@ -2,8 +2,6 @@ #include -static int8_t const kMaxIntermediatePointsCount = 3; - RouteMarkPoint::RouteMarkPoint(const m2::PointD & ptOrg, UserMarkContainer * container) : UserMark(ptOrg, container) {} @@ -18,6 +16,16 @@ void RouteMarkPoint::SetIsVisible(bool isVisible) m_isVisible = isVisible; } +void RouteMarkPoint::SetIsMyPosition(bool isMyPosition) +{ + m_isMyPosition = isMyPosition; +} + +bool RouteMarkPoint::IsMyPosition() const +{ + return m_isMyPosition; +} + std::string RouteMarkPoint::GetSymbolName() const { switch (m_pointType) @@ -153,10 +161,12 @@ bool RoutePointsLayout::MoveRoutePoint(RouteMarkType currentType, int8_t current m2::PointD const pt = point->GetPivot(); bool const isVisible = point->IsVisible(); + bool const isMyPosition = point->IsMyPosition(); RemoveRoutePoint(currentType, currentIntermediateIndex); RouteMarkPoint * point2 = AddRoutePoint(pt, destType, destIntermediateIndex); point2->SetIsVisible(isVisible); + point2->SetIsMyPosition(isMyPosition); return true; } diff --git a/map/routing_mark.hpp b/map/routing_mark.hpp index 5ca157fd15..90cd726b84 100644 --- a/map/routing_mark.hpp +++ b/map/routing_mark.hpp @@ -27,12 +27,16 @@ public: void SetRoutePointType(RouteMarkType type) { m_pointType = type; } void SetIntermediateIndex(int8_t index) { m_intermediateIndex = index; } - int8_t GetIntermediateIndex() { return m_intermediateIndex; } + int8_t GetIntermediateIndex() const { return m_intermediateIndex; } + + void SetIsMyPosition(bool isMyPosition); + bool IsMyPosition() const; private: RouteMarkType m_pointType; int8_t m_intermediateIndex = 0; bool m_isVisible = true; + bool m_isMyPosition = false; }; class RouteUserMarkContainer : public UserMarkContainer @@ -46,9 +50,11 @@ protected: class RoutePointsLayout { public: + static int8_t const kMaxIntermediatePointsCount = 1; + RoutePointsLayout(UserMarksController & routeMarks); - RouteMarkPoint * GetRoutePoint(RouteMarkType type, int8_t intermediateIndex); + RouteMarkPoint * GetRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); RouteMarkPoint * AddRoutePoint(m2::PointD const & ptOrg, RouteMarkType type, int8_t intermediateIndex = 0); bool RemoveRoutePoint(RouteMarkType type, int8_t intermediateIndex = 0); bool MoveRoutePoint(RouteMarkType currentType, int8_t currentIntermediateIndex, diff --git a/xcode/map/map.xcodeproj/project.pbxproj b/xcode/map/map.xcodeproj/project.pbxproj index 98d059feb5..fc6def5c55 100644 --- a/xcode/map/map.xcodeproj/project.pbxproj +++ b/xcode/map/map.xcodeproj/project.pbxproj @@ -97,6 +97,8 @@ 67F183831BD5049500AB1840 /* libminizip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 67F1837F1BD5049500AB1840 /* libminizip.a */; }; 67F183841BD5049500AB1840 /* libtess2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 67F183801BD5049500AB1840 /* libtess2.a */; }; BB421D6C1E8C0031005BFA4D /* transliteration_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB421D6A1E8C0026005BFA4D /* transliteration_test.cpp */; }; + BBD9E2C61EE9D01900DF189A /* routing_mark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BBD9E2C41EE9D01900DF189A /* routing_mark.cpp */; }; + BBD9E2C71EE9D01900DF189A /* routing_mark.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BBD9E2C51EE9D01900DF189A /* routing_mark.hpp */; }; F627BFC41E8E89B600B1CBF4 /* librouting_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F627BFC31E8E89B600B1CBF4 /* librouting_common.a */; }; F63421F81DF9BF9100A96868 /* reachable_by_taxi_checker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F63421F61DF9BF9100A96868 /* reachable_by_taxi_checker.cpp */; }; F63421F91DF9BF9100A96868 /* reachable_by_taxi_checker.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F63421F71DF9BF9100A96868 /* reachable_by_taxi_checker.hpp */; }; @@ -226,6 +228,8 @@ 67F183851BD504ED00AB1840 /* libsystem_configuration.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsystem_configuration.tbd; path = usr/lib/system/libsystem_configuration.tbd; sourceTree = SDKROOT; }; 67F183871BD5050900AB1840 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; BB421D6A1E8C0026005BFA4D /* transliteration_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transliteration_test.cpp; sourceTree = ""; }; + BBD9E2C41EE9D01900DF189A /* routing_mark.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = routing_mark.cpp; sourceTree = ""; }; + BBD9E2C51EE9D01900DF189A /* routing_mark.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = routing_mark.hpp; sourceTree = ""; }; F627BFC31E8E89B600B1CBF4 /* librouting_common.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librouting_common.a; path = "/Users/v.mikhaylenko/mapsme/omim/xcode/routing_common/../../../omim-build/xcode/Debug/librouting_common.a"; sourceTree = ""; }; F63421F61DF9BF9100A96868 /* reachable_by_taxi_checker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reachable_by_taxi_checker.cpp; sourceTree = ""; }; F63421F71DF9BF9100A96868 /* reachable_by_taxi_checker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = reachable_by_taxi_checker.hpp; sourceTree = ""; }; @@ -424,6 +428,8 @@ F63421F71DF9BF9100A96868 /* reachable_by_taxi_checker.hpp */, F6D2CE7C1EDEB7F500636DFD /* routing_manager.cpp */, F6D2CE7D1EDEB7F500636DFD /* routing_manager.hpp */, + BBD9E2C41EE9D01900DF189A /* routing_mark.cpp */, + BBD9E2C51EE9D01900DF189A /* routing_mark.hpp */, 347B60741DD9926D0050FA24 /* traffic_manager.cpp */, 347B60751DD9926D0050FA24 /* traffic_manager.hpp */, 348AB57A1D7EE0C6009F8301 /* chart_generator.cpp */, @@ -504,6 +510,7 @@ F6D2CE7F1EDEB7F500636DFD /* routing_manager.hpp in Headers */, 670E39411C46C5C700E9C0A6 /* gps_tracker.hpp in Headers */, 45580ABF1E2CBD5E00CD535D /* benchmark_tools.hpp in Headers */, + BBD9E2C71EE9D01900DF189A /* routing_mark.hpp in Headers */, 342D833B1D5233E8000D8AEA /* displacement_mode_manager.hpp in Headers */, F6B283041C1B03320081957A /* gps_track_collection.hpp in Headers */, ); @@ -634,6 +641,7 @@ 670E39401C46C5C700E9C0A6 /* gps_tracker.cpp in Sources */, 6753464A1A4054E800A0A8C3 /* bookmark.cpp in Sources */, 45580ABE1E2CBD5E00CD535D /* benchmark_tools.cpp in Sources */, + BBD9E2C61EE9D01900DF189A /* routing_mark.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From ead806a4ef4fd561c9d43106a2f085f6eeacbaab Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Fri, 9 Jun 2017 10:28:18 +0300 Subject: [PATCH 4/4] Review fixes. --- map/framework.cpp | 26 ++------------------------ map/routing_mark.cpp | 5 ++++- map/routing_mark.hpp | 2 +- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/map/framework.cpp b/map/framework.cpp index f1e8a2627a..bf72690047 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -947,30 +947,8 @@ void Framework::FillRouteMarkInfo(RouteMarkPoint const & rmp, place_page::Info & { FillPointInfo(rmp.GetPivot(), "", info); info.m_isRoutePoint = true; - - std::string title; - RouteMarkType const type = rmp.GetRoutePointType(); - int8_t const intermediateIndex = rmp.GetIntermediateIndex(); - switch (type) - { - case RouteMarkType::Start: - title = "Start"; - break; - case RouteMarkType::Intermediate: - if (intermediateIndex == 0) - title = "First stop A"; - else if (intermediateIndex == 1) - title = "Second stop B"; - else - title = "Third stop C"; - break; - case RouteMarkType::Finish: - title = "Finish"; - break; - } - info.m_customName = title; - info.m_routeMarkType = type; - info.m_intermediateIndex = intermediateIndex; + info.m_routeMarkType = rmp.GetRoutePointType(); + info.m_intermediateIndex = rmp.GetIntermediateIndex(); } void Framework::ShowBookmark(BookmarkAndCategory const & bnc) diff --git a/map/routing_mark.cpp b/map/routing_mark.cpp index 8d5ee58658..23030a9f45 100644 --- a/map/routing_mark.cpp +++ b/map/routing_mark.cpp @@ -53,11 +53,14 @@ UserMark * RouteUserMarkContainer::AllocateUserMark(m2::PointD const & ptOrg) return new RouteMarkPoint(ptOrg, this); } +int8_t const RoutePointsLayout::kMaxIntermediatePointsCount = 1; + RoutePointsLayout::RoutePointsLayout(UserMarksController & routeMarks) : m_routeMarks(routeMarks) {} -RouteMarkPoint * RoutePointsLayout::AddRoutePoint(m2::PointD const & ptOrg, RouteMarkType type, int8_t intermediateIndex) +RouteMarkPoint * RoutePointsLayout::AddRoutePoint(m2::PointD const & ptOrg, RouteMarkType type, + int8_t intermediateIndex) { if (m_routeMarks.GetUserMarkCount() == kMaxIntermediatePointsCount + 2) return nullptr; diff --git a/map/routing_mark.hpp b/map/routing_mark.hpp index 90cd726b84..33c4040e43 100644 --- a/map/routing_mark.hpp +++ b/map/routing_mark.hpp @@ -50,7 +50,7 @@ protected: class RoutePointsLayout { public: - static int8_t const kMaxIntermediatePointsCount = 1; + static int8_t const kMaxIntermediatePointsCount; RoutePointsLayout(UserMarksController & routeMarks);