forked from organicmaps/organicmaps
Fixed processing of category deletion.
This commit is contained in:
parent
4c6f3c2f7f
commit
54d545ec61
8 changed files with 96 additions and 31 deletions
|
@ -271,6 +271,10 @@ void DrapeEngine::UpdateUserMarks(UserMarksProvider * provider, bool firstTime)
|
|||
auto const & removedMarkIds = provider->GetRemovedMarkIds();
|
||||
removedIdCollection->m_markIds.reserve(removedMarkIds.size());
|
||||
removedIdCollection->m_markIds.assign(removedMarkIds.begin(), removedMarkIds.end());
|
||||
|
||||
auto const & removedLineIds = provider->GetRemovedLineIds();
|
||||
removedIdCollection->m_lineIds.reserve(removedLineIds.size());
|
||||
removedIdCollection->m_lineIds.assign(removedLineIds.begin(), removedLineIds.end());
|
||||
}
|
||||
|
||||
std::map<df::MarkGroupID, drape_ptr<IDCollections>> dirtyMarkIds;
|
||||
|
|
|
@ -102,6 +102,7 @@ class UserMarksProvider
|
|||
public:
|
||||
virtual ~UserMarksProvider() {}
|
||||
virtual GroupIDSet const & GetDirtyGroupIds() const = 0;
|
||||
virtual GroupIDSet const & GetRemovedGroupIds() const = 0;
|
||||
virtual GroupIDSet GetAllGroupIds() const = 0;
|
||||
virtual bool IsGroupVisible(MarkGroupID groupId) const = 0;
|
||||
virtual bool IsGroupVisibilityChanged(MarkGroupID groupId) const = 0;
|
||||
|
@ -110,6 +111,7 @@ public:
|
|||
virtual MarkIDSet const & GetCreatedMarkIds() const = 0;
|
||||
virtual MarkIDSet const & GetRemovedMarkIds() const = 0;
|
||||
virtual MarkIDSet const & GetUpdatedMarkIds() const = 0;
|
||||
virtual LineIDSet const & GetRemovedLineIds() const = 0;
|
||||
/// Never store UserPointMark reference.
|
||||
virtual UserPointMark const * GetUserPointMark(MarkID markId) const = 0;
|
||||
/// Never store UserLineMark reference.
|
||||
|
|
|
@ -152,18 +152,6 @@ BookmarkCategory::~BookmarkCategory()
|
|||
{
|
||||
}
|
||||
|
||||
void BookmarkCategory::AttachTrack(df::LineID trackId)
|
||||
{
|
||||
SetDirty();
|
||||
m_tracks.insert(trackId);
|
||||
}
|
||||
|
||||
void BookmarkCategory::DetachTrack(df::LineID trackId)
|
||||
{
|
||||
SetDirty();
|
||||
m_tracks.erase(trackId);
|
||||
}
|
||||
|
||||
void BookmarkCategory::SetName(std::string const & name)
|
||||
{
|
||||
SetDirty();
|
||||
|
|
|
@ -121,11 +121,7 @@ public:
|
|||
|
||||
static std::string GetDefaultType();
|
||||
|
||||
void AttachTrack(df::LineID markId);
|
||||
void DetachTrack(df::LineID markId);
|
||||
|
||||
df::MarkGroupID GetID() const { return m_groupId; }
|
||||
df::LineIDSet const & GetUserLines() const override { return m_tracks; }
|
||||
|
||||
void SetName(std::string const & name);
|
||||
void SetFileName(std::string const & fileName) { m_file = fileName; }
|
||||
|
@ -140,7 +136,6 @@ private:
|
|||
// Stores file name from which bookmarks were loaded.
|
||||
std::string m_file;
|
||||
bool m_autoSave = true;
|
||||
df::LineIDSet m_tracks;
|
||||
};
|
||||
|
||||
struct KMLData
|
||||
|
|
|
@ -241,10 +241,8 @@ void BookmarkManager::DeleteBookmark(df::MarkID bmId)
|
|||
auto groupIt = m_bookmarks.find(bmId);
|
||||
auto const groupId = groupIt->second->GetGroupId();
|
||||
if (groupId)
|
||||
{
|
||||
m_changesTracker.OnDeleteMark(bmId);
|
||||
GetGroup(groupId)->DetachUserMark(bmId);
|
||||
}
|
||||
m_changesTracker.OnDeleteMark(bmId);
|
||||
m_bookmarks.erase(groupIt);
|
||||
}
|
||||
|
||||
|
@ -277,6 +275,7 @@ void BookmarkManager::DeleteTrack(df::LineID trackId)
|
|||
auto const groupId = it->second->GetGroupId();
|
||||
if (groupId != df::kInvalidMarkGroupId)
|
||||
GetBmCategory(groupId)->DetachTrack(trackId);
|
||||
m_changesTracker.OnDeleteLine(trackId);
|
||||
m_tracks.erase(it);
|
||||
}
|
||||
|
||||
|
@ -333,18 +332,19 @@ void BookmarkManager::NotifyChanges()
|
|||
auto engine = lock.Get();
|
||||
for (auto groupId : m_changesTracker.GetDirtyGroupIds())
|
||||
{
|
||||
auto *group = GetGroup(groupId);
|
||||
auto * group = GetGroup(groupId);
|
||||
engine->ChangeVisibilityUserMarksGroup(groupId, group->IsVisible());
|
||||
}
|
||||
|
||||
for (auto groupId : m_changesTracker.GetRemovedGroupIds())
|
||||
engine->ClearUserMarksGroup(groupId);
|
||||
|
||||
engine->UpdateUserMarks(&m_changesTracker, m_firstDrapeNotification);
|
||||
m_firstDrapeNotification = false;
|
||||
|
||||
for (auto groupId : m_changesTracker.GetDirtyGroupIds())
|
||||
{
|
||||
auto *group = GetGroup(groupId);
|
||||
if (group->GetUserMarks().empty() && group->GetUserLines().empty())
|
||||
engine->ClearUserMarksGroup(groupId);
|
||||
auto * group = GetGroup(groupId);
|
||||
group->ResetChanges();
|
||||
}
|
||||
|
||||
|
@ -379,7 +379,10 @@ void BookmarkManager::ClearGroup(df::MarkGroupID groupId)
|
|||
m_userMarks.erase(markId);
|
||||
}
|
||||
for (auto trackId : group->GetUserLines())
|
||||
{
|
||||
m_changesTracker.OnDeleteLine(trackId);
|
||||
m_tracks.erase(trackId);
|
||||
}
|
||||
group->Clear();
|
||||
}
|
||||
|
||||
|
@ -463,6 +466,7 @@ Track * BookmarkManager::AddTrack(std::unique_ptr<Track> && track)
|
|||
auto const trackId = t->GetId();
|
||||
ASSERT(m_tracks.count(trackId) == 0, ());
|
||||
m_tracks.emplace(trackId, std::move(track));
|
||||
m_changesTracker.OnAddLine(trackId);
|
||||
return t;
|
||||
}
|
||||
|
||||
|
@ -764,6 +768,7 @@ df::MarkGroupID BookmarkManager::CreateBookmarkCategory(std::string const & name
|
|||
auto & cat = m_categories[groupId];
|
||||
cat = my::make_unique<BookmarkCategory>(name, groupId, autoSave);
|
||||
m_bmGroupsIdList.push_back(groupId);
|
||||
m_changesTracker.OnAddGroup(groupId);
|
||||
return groupId;
|
||||
}
|
||||
|
||||
|
@ -779,11 +784,11 @@ bool BookmarkManager::DeleteBmCategory(df::MarkGroupID groupId)
|
|||
if (it == m_categories.end())
|
||||
return false;
|
||||
|
||||
BookmarkCategory & group = *it->second.get();
|
||||
FileWriter::DeleteFileX(group.GetFileName());
|
||||
ClearGroup(groupId);
|
||||
// TODO(darina): think of a way to get rid of extra Notify here
|
||||
NotifyChanges();
|
||||
m_changesTracker.OnDeleteGroup(groupId);
|
||||
|
||||
FileWriter::DeleteFileX(it->second->GetFileName());
|
||||
|
||||
m_categories.erase(it);
|
||||
m_bmGroupsIdList.erase(std::remove(m_bmGroupsIdList.begin(), m_bmGroupsIdList.end(), groupId),
|
||||
m_bmGroupsIdList.end());
|
||||
|
@ -1207,7 +1212,7 @@ void BookmarkManager::EndSharing(df::MarkGroupID categoryId)
|
|||
|
||||
bool BookmarkManager::IsCategoryEmpty(df::MarkGroupID categoryId) const
|
||||
{
|
||||
return GetUserMarkIds(categoryId).empty() && GetTrackIds(categoryId).empty();
|
||||
return GetBmCategory(categoryId)->IsEmpty();
|
||||
}
|
||||
|
||||
BookmarkManager::SharingResult BookmarkManager::GetFileForSharing(df::MarkGroupID categoryId)
|
||||
|
@ -1303,6 +1308,34 @@ void BookmarkManager::MarksChangesTracker::OnUpdateMark(df::MarkID markId)
|
|||
m_updatedMarks.insert(markId);
|
||||
}
|
||||
|
||||
void BookmarkManager::MarksChangesTracker::OnAddLine(df::LineID lineId)
|
||||
{
|
||||
m_createdLines.insert(lineId);
|
||||
}
|
||||
|
||||
void BookmarkManager::MarksChangesTracker::OnDeleteLine(df::LineID lineId)
|
||||
{
|
||||
auto const it = m_createdLines.find(lineId);
|
||||
if (it != m_createdLines.end())
|
||||
m_createdLines.erase(it);
|
||||
else
|
||||
m_removedLines.insert(lineId);
|
||||
}
|
||||
|
||||
void BookmarkManager::MarksChangesTracker::OnAddGroup(df::MarkGroupID groupId)
|
||||
{
|
||||
m_createdGroups.insert(groupId);
|
||||
}
|
||||
|
||||
void BookmarkManager::MarksChangesTracker::OnDeleteGroup(df::MarkGroupID groupId)
|
||||
{
|
||||
auto const it = m_createdGroups.find(groupId);
|
||||
if (it != m_createdGroups.end())
|
||||
m_createdGroups.erase(it);
|
||||
else
|
||||
m_removedGroups.insert(groupId);
|
||||
}
|
||||
|
||||
bool BookmarkManager::MarksChangesTracker::CheckChanges()
|
||||
{
|
||||
m_bmManager.CollectDirtyGroups(m_dirtyGroups);
|
||||
|
@ -1318,9 +1351,15 @@ bool BookmarkManager::MarksChangesTracker::CheckChanges()
|
|||
void BookmarkManager::MarksChangesTracker::ResetChanges()
|
||||
{
|
||||
m_dirtyGroups.clear();
|
||||
m_createdGroups.clear();
|
||||
m_removedGroups.clear();
|
||||
|
||||
m_createdMarks.clear();
|
||||
m_removedMarks.clear();
|
||||
m_updatedMarks.clear();
|
||||
|
||||
m_createdLines.clear();
|
||||
m_removedLines.clear();
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
@ -242,15 +242,23 @@ private:
|
|||
void OnDeleteMark(df::MarkID markId);
|
||||
void OnUpdateMark(df::MarkID markId);
|
||||
|
||||
void OnAddLine(df::LineID lineId);
|
||||
void OnDeleteLine(df::LineID lineId);
|
||||
|
||||
void OnAddGroup(df::MarkGroupID groupId);
|
||||
void OnDeleteGroup(df::MarkGroupID groupId);
|
||||
|
||||
bool CheckChanges();
|
||||
void ResetChanges();
|
||||
|
||||
// UserMarksProvider
|
||||
df::GroupIDSet GetAllGroupIds() const override;
|
||||
df::GroupIDSet const & GetDirtyGroupIds() const override { return m_dirtyGroups; }
|
||||
df::GroupIDSet const & GetRemovedGroupIds() const override { return m_removedGroups; }
|
||||
df::MarkIDSet const & GetCreatedMarkIds() const override { return m_createdMarks; }
|
||||
df::MarkIDSet const & GetRemovedMarkIds() const override { return m_removedMarks; }
|
||||
df::MarkIDSet const & GetUpdatedMarkIds() const override { return m_updatedMarks; }
|
||||
df::LineIDSet const & GetRemovedLineIds() const override { return m_removedLines; }
|
||||
bool IsGroupVisible(df::MarkGroupID groupId) const override;
|
||||
bool IsGroupVisibilityChanged(df::MarkGroupID groupId) const override;
|
||||
df::MarkIDSet const & GetGroupPointIds(df::MarkGroupID groupId) const override;
|
||||
|
@ -264,7 +272,13 @@ private:
|
|||
df::MarkIDSet m_createdMarks;
|
||||
df::MarkIDSet m_removedMarks;
|
||||
df::MarkIDSet m_updatedMarks;
|
||||
|
||||
df::LineIDSet m_createdLines;
|
||||
df::LineIDSet m_removedLines;
|
||||
|
||||
df::GroupIDSet m_dirtyGroups;
|
||||
df::GroupIDSet m_createdGroups;
|
||||
df::GroupIDSet m_removedGroups;
|
||||
};
|
||||
|
||||
template <typename UserMarkT>
|
||||
|
|
|
@ -40,6 +40,12 @@ void UserMarkLayer::Clear()
|
|||
{
|
||||
SetDirty();
|
||||
m_userMarks.clear();
|
||||
m_tracks.clear();
|
||||
}
|
||||
|
||||
bool UserMarkLayer::IsEmpty() const
|
||||
{
|
||||
return m_userMarks.empty() && m_tracks.empty();
|
||||
}
|
||||
|
||||
void UserMarkLayer::SetIsVisible(bool isVisible)
|
||||
|
@ -68,3 +74,15 @@ void UserMarkLayer::DetachUserMark(df::MarkID markId)
|
|||
SetDirty();
|
||||
m_userMarks.erase(markId);
|
||||
}
|
||||
|
||||
void UserMarkLayer::AttachTrack(df::LineID trackId)
|
||||
{
|
||||
SetDirty();
|
||||
m_tracks.insert(trackId);
|
||||
}
|
||||
|
||||
void UserMarkLayer::DetachTrack(df::LineID trackId)
|
||||
{
|
||||
SetDirty();
|
||||
m_tracks.erase(trackId);
|
||||
}
|
||||
|
|
|
@ -28,12 +28,17 @@ public:
|
|||
UserMark::Type GetType() const;
|
||||
|
||||
df::MarkIDSet const & GetUserMarks() const { return m_userMarks; }
|
||||
virtual df::LineIDSet const & GetUserLines() const { return m_userLines; }
|
||||
df::LineIDSet const & GetUserLines() const { return m_tracks; }
|
||||
|
||||
void AttachUserMark(df::MarkID markId);
|
||||
void DetachUserMark(df::MarkID markId);
|
||||
|
||||
void AttachTrack(df::LineID trackId);
|
||||
void DetachTrack(df::LineID trackId);
|
||||
|
||||
void Clear();
|
||||
bool IsEmpty() const;
|
||||
|
||||
void SetIsVisible(bool isVisible);
|
||||
|
||||
protected:
|
||||
|
@ -42,7 +47,7 @@ protected:
|
|||
UserMark::Type m_type;
|
||||
|
||||
df::MarkIDSet m_userMarks;
|
||||
df::LineIDSet m_userLines;
|
||||
df::LineIDSet m_tracks;
|
||||
|
||||
bool m_isDirty = true;
|
||||
bool m_isVisible = true;
|
||||
|
|
Loading…
Add table
Reference in a new issue