diff --git a/map/bookmark.cpp b/map/bookmark.cpp index 1381ca359a..cf7a7adade 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -141,11 +141,11 @@ void Bookmark::Detach() m_groupId = df::kInvalidMarkGroupId; } -BookmarkCategory::BookmarkCategory(std::string const & name, - df::MarkGroupID groupId) +BookmarkCategory::BookmarkCategory(std::string const & name, df::MarkGroupID groupId, bool autoSave) : Base(UserMark::Type::BOOKMARK) , m_groupId(groupId) , m_name(name) + , m_autoSave(autoSave) {} BookmarkCategory::~BookmarkCategory() diff --git a/map/bookmark.hpp b/map/bookmark.hpp index 8ffeff952d..cff728fbf8 100644 --- a/map/bookmark.hpp +++ b/map/bookmark.hpp @@ -116,7 +116,7 @@ class BookmarkCategory : public UserMarkLayer using Base = UserMarkLayer; public: - BookmarkCategory(std::string const & name, df::MarkGroupID groupId); + BookmarkCategory(std::string const & name, df::MarkGroupID groupId, bool autoSave); ~BookmarkCategory() override; static std::string GetDefaultType(); @@ -132,12 +132,14 @@ public: std::string const & GetName() const { return m_name; } std::string const & GetFileName() const { return m_file; } + bool IsAutoSave() const { return m_autoSave; } + private: df::MarkGroupID const m_groupId; std::string m_name; // Stores file name from which bookmarks were loaded. std::string m_file; - + bool m_autoSave = true; df::LineIDSet m_tracks; }; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 961310e3d6..75e8b397db 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -319,9 +319,9 @@ void BookmarkManager::NotifyChanges() { if (IsBookmarkCategory(groupId)) { - SaveToKMLFile(groupId); + if (GetBmCategory(groupId)->IsAutoSave()) + SaveToKMLFile(groupId); isBookmarks = true; - break; } } if (isBookmarks) @@ -758,11 +758,11 @@ bool BookmarkManager::HasBmCategory(df::MarkGroupID groupId) const return m_categories.find(groupId) != m_categories.end(); } -df::MarkGroupID BookmarkManager::CreateBookmarkCategory(std::string const & name) +df::MarkGroupID BookmarkManager::CreateBookmarkCategory(std::string const & name, bool autoSave) { auto const groupId = m_nextGroupID++; auto & cat = m_categories[groupId]; - cat = my::make_unique(name, groupId); + cat = my::make_unique(name, groupId, autoSave); m_bmGroupsIdList.push_back(groupId); return groupId; } @@ -858,7 +858,7 @@ UserMarkLayer * BookmarkManager::GetGroup(df::MarkGroupID groupId) return it != m_categories.end() ? it->second.get() : nullptr; } -void BookmarkManager::CreateCategories(KMLDataCollection && dataCollection) +void BookmarkManager::CreateCategories(KMLDataCollection && dataCollection, bool autoSave) { for (auto & data : dataCollection) { @@ -878,7 +878,7 @@ void BookmarkManager::CreateCategories(KMLDataCollection && dataCollection) } else { - groupId = CreateBookmarkCategory(data->m_name); + groupId = CreateBookmarkCategory(data->m_name, autoSave); group = GetBmCategory(groupId); group->SetFileName(data->m_file); group->SetIsVisible(data->m_visible); diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 46ae78c064..7907b86571 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -156,7 +156,7 @@ public: bool IsVisible(df::MarkGroupID groupId) const; - df::MarkGroupID CreateBookmarkCategory(std::string const & name); + df::MarkGroupID CreateBookmarkCategory(std::string const & name, bool autoSave = true); std::string const & GetCategoryName(df::MarkGroupID categoryId) const; std::string const & GetCategoryFileName(df::MarkGroupID categoryId) const; @@ -193,7 +193,7 @@ public: /// These functions are public for unit tests only. You shouldn't call them from client code. void SaveToKML(df::MarkGroupID groupId, std::ostream & s); - void CreateCategories(KMLDataCollection && dataCollection); + void CreateCategories(KMLDataCollection && dataCollection, bool autoSave = true); static std::string RemoveInvalidSymbols(std::string const & name); static std::string GenerateUniqueFileName(const std::string & path, std::string name); static std::string GenerateValidAndUniqueFilePathForKML(std::string const & fileName); diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index 7522851f91..47d4d5c6c4 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -177,7 +177,7 @@ UNIT_TEST(Bookmarks_ImportKML) kmlDataCollection.push_back(LoadKMLData(make_unique(kmlString, strlen(kmlString)))); TEST(kmlDataCollection[0], ()); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto const groupId = bmManager.GetBmGroupsIdList().front(); @@ -195,7 +195,7 @@ UNIT_TEST(Bookmarks_ExportKML) BookmarkManager::KMLDataCollection kmlDataCollection; kmlDataCollection.push_back(LoadKMLData(make_unique(kmlString, strlen(kmlString)))); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto const groupId1 = bmManager.GetBmGroupsIdList().front(); @@ -219,7 +219,7 @@ UNIT_TEST(Bookmarks_ExportKML) kmlDataCollection.clear(); kmlDataCollection.push_back(LoadKMLData(make_unique(BOOKMARKS_FILE_NAME))); TEST(kmlDataCollection[0], ()); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto const groupId2 = bmManager.GetBmGroupsIdList().front(); @@ -231,7 +231,7 @@ UNIT_TEST(Bookmarks_ExportKML) kmlDataCollection.clear(); kmlDataCollection.push_back(LoadKMLFile(BOOKMARKS_FILE_NAME)); TEST(kmlDataCollection[0], ()); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto const groupId3 = bmManager.GetBmGroupsIdList().front(); @@ -249,7 +249,7 @@ UNIT_TEST(Bookmarks_ExportKML) kmlDataCollection.clear(); kmlDataCollection.push_back(LoadKMLFile(catFileName)); TEST(kmlDataCollection[0], ()); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto const groupId4 = bmManager.GetBmGroupsIdList().front(); @@ -306,7 +306,7 @@ UNIT_TEST(Bookmarks_Timestamp) BookmarkManager & bmManager = fm.GetBookmarkManager(); BookmarkData b1("name", "type"); - auto cat1 = bmManager.CreateBookmarkCategory(arrCat[0]); + auto cat1 = bmManager.CreateBookmarkCategory(arrCat[0], false /* autoSave */); Bookmark const * pBm1 = bmManager.GetEditSession().CreateBookmark(orgPoint, b1, cat1); TEST_NOT_EQUAL(pBm1->GetTimeStamp(), my::INVALID_TIME_STAMP, ()); @@ -314,7 +314,7 @@ UNIT_TEST(Bookmarks_Timestamp) BookmarkData b2("newName", "newType"); Bookmark const * pBm2 = bmManager.GetEditSession().CreateBookmark(orgPoint, b2, cat1); - auto cat2 = bmManager.CreateBookmarkCategory(arrCat[0]); + auto cat2 = bmManager.CreateBookmarkCategory(arrCat[0], false /* autoSave */); Bookmark const * pBm3 = bmManager.GetEditSession().CreateBookmark(orgPoint, b2, cat2); // Check bookmarks order here. First added should be in the bottom of the list. @@ -355,9 +355,9 @@ UNIT_TEST(Bookmarks_Getting) BookmarkManager & bmManager = fm.GetBookmarkManager(); char const * arrCat[] = { "cat1", "cat2", "cat3" }; - auto const cat1 = bmManager.CreateBookmarkCategory(arrCat[0]); - auto const cat2 = bmManager.CreateBookmarkCategory(arrCat[1]); - auto const cat3 = bmManager.CreateBookmarkCategory(arrCat[2]); + auto const cat1 = bmManager.CreateBookmarkCategory(arrCat[0], false /* autoSave */); + auto const cat2 = bmManager.CreateBookmarkCategory(arrCat[1], false /* autoSave */); + auto const cat3 = bmManager.CreateBookmarkCategory(arrCat[2], false /* autoSave */); BookmarkData bm("1", "placemark-red"); auto const * pBm1 = bmManager.GetEditSession().CreateBookmark(m2::PointD(38, 20), bm, cat1); @@ -503,8 +503,8 @@ UNIT_TEST(Bookmarks_AddingMoving) BookmarkManager & bmManager = fm.GetBookmarkManager(); char const * arrCat[] = {"cat1", "cat2"}; - auto const cat1 = bmManager.CreateBookmarkCategory(arrCat[0]); - auto const cat2 = bmManager.CreateBookmarkCategory(arrCat[1]); + auto const cat1 = bmManager.CreateBookmarkCategory(arrCat[0], false /* autoSave */); + auto const cat2 = bmManager.CreateBookmarkCategory(arrCat[1], false /* autoSave */); BookmarkData bm("name", "placemark-red"); auto const * pBm1 = bmManager.GetEditSession().CreateBookmark(globalPoint, bm, cat1); @@ -569,7 +569,7 @@ UNIT_TEST(Bookmarks_InnerFolder) BookmarkManager::KMLDataCollection kmlDataCollection; kmlDataCollection.push_back(LoadKMLData(make_unique(kmlString2, strlen(kmlString2)))); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); auto const & groupIds = bmManager.GetBmGroupsIdList(); TEST_EQUAL(groupIds.size(), 1, ()); TEST_EQUAL(bmManager.GetUserMarkIds(groupIds.front()).size(), 1, ()); @@ -578,7 +578,7 @@ UNIT_TEST(Bookmarks_InnerFolder) UNIT_TEST(BookmarkCategory_EmptyName) { BookmarkManager bmManager((BookmarkManager::Callbacks(bmCallbacks))); - auto const catId = bmManager.CreateBookmarkCategory(""); + auto const catId = bmManager.CreateBookmarkCategory("", false /* autoSave */); auto bm = BookmarkData("", "placemark-red"); bmManager.GetEditSession().CreateBookmark(m2::PointD(0, 0), bm, catId); @@ -633,7 +633,7 @@ UNIT_TEST(Bookmarks_SpecialXMLNames) BookmarkManager bmManager((BookmarkManager::Callbacks(bmCallbacks))); BookmarkManager::KMLDataCollection kmlDataCollection; kmlDataCollection.push_back(LoadKMLData(make_unique(kmlString3, strlen(kmlString3)))); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); auto const & groupIds = bmManager.GetBmGroupsIdList(); TEST_EQUAL(groupIds.size(), 1, ()); @@ -649,7 +649,7 @@ UNIT_TEST(Bookmarks_SpecialXMLNames) kmlDataCollection.clear(); kmlDataCollection.push_back(LoadKMLFile(fileName)); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 2, ()); auto const catId2 = bmManager.GetBmGroupsIdList().back(); @@ -674,7 +674,7 @@ UNIT_TEST(TrackParsingTest_1) BookmarkManager::KMLDataCollection kmlDataCollection; kmlDataCollection.push_back(LoadKMLFile(kmlFile)); TEST(kmlDataCollection[0], ("KML can't be loaded")); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto catId = bmManager.GetBmGroupsIdList().front(); @@ -706,7 +706,7 @@ UNIT_TEST(TrackParsingTest_2) BookmarkManager::KMLDataCollection kmlDataCollection; kmlDataCollection.push_back(LoadKMLFile(kmlFile)); TEST(kmlDataCollection[0], ("KML can't be loaded")); - bmManager.CreateCategories(std::move(kmlDataCollection)); + bmManager.CreateCategories(std::move(kmlDataCollection), false /* autoSave */); TEST_EQUAL(bmManager.GetBmGroupsIdList().size(), 1, ()); auto catId = bmManager.GetBmGroupsIdList().front(); @@ -768,7 +768,7 @@ UNIT_TEST(Bookmarks_Listeners) BookmarkManager bmManager(std::move(callbacks)); - auto const catId = bmManager.CreateBookmarkCategory("Default"); + auto const catId = bmManager.CreateBookmarkCategory("Default", false /* autoSave */); { auto editSession = bmManager.GetEditSession();