diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 3b4b127579..580b051bfa 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -3,6 +3,7 @@ #include "map/user_mark.hpp" #include "map/user_mark_id_storage.hpp" #include "map/track_mark.hpp" +#include "map/gps_tracker.hpp" #include "drape_frontend/drape_engine.hpp" #include "drape_frontend/selection_shape.hpp" @@ -1141,6 +1142,56 @@ kml::CompilationType BookmarkManager::GetCompilationType(kml::MarkGroupId id) co return compilation->second->GetCategoryData().m_type; } +void BookmarkManager::SaveTrackRecording(std::string trackName) +{ + CHECK_THREAD_CHECKER(m_threadChecker, ()); + auto const & tracker = GpsTracker::Instance(); + CHECK(!tracker.IsEmpty(), ("Track recording should be not be empty")); + + kml::MultiGeometry::LineT line; + tracker.ForEachTrackPoint([&line](location::GpsTrackInfo const & pt, size_t id)->bool + { + line.emplace_back(mercator::FromLatLon(pt.m_latitude, pt.m_longitude)); + return true; + }); + + kml::TrackData trackData; + if (trackName.empty()) + trackName = GenerateTrackRecordingName(); + kml::SetDefaultStr(trackData.m_name, trackName); + + kml::MultiGeometry geometry; + geometry.m_lines.push_back(std::move(line)); + trackData.m_geometry = std::move(geometry); + + kml::ColorData colorData; + colorData.m_rgba = GenerateTrackRecordingColor().GetRGBA(); + kml::TrackLayer layer; + layer.m_color = colorData; + + std::vector m_layers; + m_layers.emplace_back(layer); + trackData.m_layers = std::move(m_layers); + trackData.m_timestamp = kml::TimestampClock::now(); + + auto editSession = GetEditSession(); + auto const track = editSession.CreateTrack(std::move(trackData)); + auto const groupId = LastEditedBMCategory(); + AttachTrack(track->GetId(), groupId); +} + +std::string BookmarkManager::GenerateTrackRecordingName() const +{ + /// @TODO(KK): - improve the track name generation + return platform::GetLocalizedMyPositionBookmarkName(); +} + +dp::Color BookmarkManager::GenerateTrackRecordingColor() const +{ + /// @TODO(KK): - improve the color generation + return kml::ColorFromPredefinedColor(kml::GetRandomPredefinedColor()); +} + void BookmarkManager::PrepareBookmarksAddresses(std::vector & bookmarksForSort, AddressesCollection & newAddresses) { diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 91b4312487..7cfaa375e6 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -435,6 +435,10 @@ public: bool IsCompilation(kml::MarkGroupId id) const; kml::CompilationType GetCompilationType(kml::MarkGroupId id) const; + void SaveTrackRecording(std::string trackName); + std::string GenerateTrackRecordingName() const; + dp::Color GenerateTrackRecordingColor() const; + private: class MarksChangesTracker : public df::UserMarksProvider { diff --git a/map/framework.cpp b/map/framework.cpp index 7ca5354ac9..29e6ea211d 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1650,11 +1650,49 @@ void Framework::ConnectToGpsTracker() void Framework::DisconnectFromGpsTracker() { m_connectToGpsTrack = false; - GpsTracker::Instance().Disconnect(); + auto & tracker = GpsTracker::Instance(); + tracker.Disconnect(); + tracker.SetEnabled(false); +} + +void Framework::StartTrackRecording() +{ + auto & tracker = GpsTracker::Instance(); + if (!tracker.IsEnabled()) + tracker.SetEnabled(true); + m_connectToGpsTrack = true; + if (m_drapeEngine) + { + m_drapeEngine->ClearGpsTrackPoints(); + tracker.Connect(bind(&Framework::OnUpdateGpsTrackPointsCallback, this, _1, _2)); + } +} + +void Framework::StopTrackRecording() +{ + m_connectToGpsTrack = false; + auto & tracker = GpsTracker::Instance(); + tracker.Disconnect(); + tracker.SetEnabled(false); +} + +void Framework::SaveTrackRecordingWithName(std::string const & name) +{ + GetBookmarkManager().SaveTrackRecording(name); if (m_drapeEngine) m_drapeEngine->ClearGpsTrackPoints(); } +bool Framework::IsTrackRecordingEmpty() const +{ + return GpsTracker::Instance().IsEmpty(); +} + +bool Framework::IsTrackRecordingEnabled() const +{ + return GpsTracker::Instance().IsEnabled(); +} + void Framework::OnUpdateGpsTrackPointsCallback(vector> && toAdd, pair const & toRemove) { diff --git a/map/framework.hpp b/map/framework.hpp index 4206543276..4a0ef6ce9d 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -435,6 +435,12 @@ public: void ConnectToGpsTracker(); void DisconnectFromGpsTracker(); + void StartTrackRecording(); + void StopTrackRecording(); + void SaveTrackRecordingWithName(std::string const & name); + bool IsTrackRecordingEmpty() const; + bool IsTrackRecordingEnabled() const; + void SetMapStyle(MapStyle mapStyle); void MarkMapStyle(MapStyle mapStyle); MapStyle GetMapStyle() const;