Fix group subtitle deletion undo

parent 824741bd
...@@ -1915,10 +1915,7 @@ bool TimelineModel::requestSubtitleDeletion(int clipId, Fun &undo, Fun &redo) ...@@ -1915,10 +1915,7 @@ bool TimelineModel::requestSubtitleDeletion(int clipId, Fun &undo, Fun &redo)
GenTime end = sub.end(); GenTime end = sub.end();
QString text = sub.subtitle(); QString text = sub.subtitle();
Fun reverse = [this, clipId, start, end, text]() { Fun reverse = [this, clipId, start, end, text]() {
// We capture a shared_ptr to the clip, which means that as long as this undo object lives, the clip object is not deleted. To insert it back it is return m_subtitleModel->addSubtitle(clipId, start, end, text);
// sufficient to register it.
m_subtitleModel->addSubtitle(clipId, start, end, text);
return true;
}; };
if (operation()) { if (operation()) {
UPDATE_UNDO_REDO(operation, reverse, undo, redo); UPDATE_UNDO_REDO(operation, reverse, undo, redo);
...@@ -2541,7 +2538,8 @@ bool TimelineModel::requestGroupDeletion(int clipId, Fun &undo, Fun &redo) ...@@ -2541,7 +2538,8 @@ bool TimelineModel::requestGroupDeletion(int clipId, Fun &undo, Fun &redo)
group_queue.push(m_groups->getRootId(clipId)); group_queue.push(m_groups->getRootId(clipId));
std::unordered_set<int> all_items; std::unordered_set<int> all_items;
std::unordered_set<int> all_compositions; std::unordered_set<int> all_compositions;
std::unordered_set<int> all_subtitles; // Subtitles MUST BE SORTED BY REVERSE timeline id to preserve the qml model index on undo!!
std::set<int> all_subtitles;
while (!group_queue.empty()) { while (!group_queue.empty()) {
int current_group = group_queue.front(); int current_group = group_queue.front();
bool isSelection = m_currentSelection == current_group; bool isSelection = m_currentSelection == current_group;
...@@ -2598,8 +2596,9 @@ bool TimelineModel::requestGroupDeletion(int clipId, Fun &undo, Fun &redo) ...@@ -2598,8 +2596,9 @@ bool TimelineModel::requestGroupDeletion(int clipId, Fun &undo, Fun &redo)
return false; return false;
} }
} }
for (int sub : all_subtitles) { std::set<int>::reverse_iterator rit;
bool res = requestSubtitleDeletion(sub, undo, redo); for (rit = all_subtitles.rbegin(); rit != all_subtitles.rend(); ++rit) {
bool res = requestSubtitleDeletion(*rit, undo, redo);
if (!res) { if (!res) {
undo(); undo();
return false; return false;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment