summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-02-23 19:24:06 +0100
committerGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-04-07 00:13:35 +0200
commit5b7a3165932d9b3fced80fec17de01eb1ad89bf7 (patch)
tree8d93ac1a2201f3051cddca19656c3abd92b47886
parenta37939889b1a77dd269fd7f25f97b813f733133a (diff)
downloadsubsurface-5b7a3165932d9b3fced80fec17de01eb1ad89bf7.tar.gz
undo: reorder cylinders on remove-cylinder undo/redo
The cylinders in the events must be reordered if we remove a cylinder. To avoid duplication of code, move the reordering function into qthelper.cpp, though it might not be ideal there. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--commands/command_edit.cpp3
-rw-r--r--core/qthelper.cpp33
-rw-r--r--core/qthelper.h2
-rw-r--r--qt-models/cylindermodel.cpp10
4 files changed, 39 insertions, 9 deletions
diff --git a/commands/command_edit.cpp b/commands/command_edit.cpp
index c06ef1ffa..3ba7a2823 100644
--- a/commands/command_edit.cpp
+++ b/commands/command_edit.cpp
@@ -1106,6 +1106,7 @@ RemoveCylinder::RemoveCylinder(int index, bool currentDiveOnly) :
void RemoveCylinder::undo()
{
for (size_t i = 0; i < dives.size(); ++i) {
+ std::vector<int> mapping = get_cylinder_map_for_add(dives[i]->cylinders.nr, indexes[i]);
add_to_cylinder_table(&dives[i]->cylinders, indexes[i], clone_cylinder(cyl));
emit diveListNotifier.cylinderAdded(dives[i], indexes[i]);
}
@@ -1114,7 +1115,9 @@ void RemoveCylinder::undo()
void RemoveCylinder::redo()
{
for (size_t i = 0; i < dives.size(); ++i) {
+ std::vector<int> mapping = get_cylinder_map_for_remove(dives[i]->cylinders.nr, indexes[i]);
remove_cylinder(dives[i], indexes[i]);
+ cylinder_renumber(dives[i], &mapping[0]);
emit diveListNotifier.cylinderRemoved(dives[i], indexes[i]);
}
}
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index 7b879e7d6..10e62eabe 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -1661,3 +1661,36 @@ extern "C" char *get_changes_made()
else
return nullptr;
}
+
+// Generate a cylinder-renumber map for use when the n-th cylinder
+// of a dive with count cylinders is removed. It fills an int vector
+// with 0..n, -1, n..count-1. Each entry in the vector represents
+// the new id of the cylinder, whereby <0 means that this particular
+// cylinder does not get any new id. This should probably be moved
+// to the C-core, but using std::vector is simply more convenient.
+// The function assumes that n < count!
+std::vector<int> get_cylinder_map_for_remove(int count, int n)
+{
+ // 1) Fill mapping[0]..mapping[n-1] with 0..n-1
+ // 2) Set mapping[n] to -1
+ // 3) Fill mapping[n+1]..mapping[count-1] with n..count-2
+ std::vector<int> mapping(count);
+ std::iota(mapping.begin(), mapping.begin() + n, 0);
+ mapping[n] = -1;
+ std::iota(mapping.begin() + n + 1, mapping.end(), n);
+ return mapping;
+}
+
+// Generate a cylinder-renumber map for use when a cylinder is added
+// before the n-th cylinder. It fills an int vector with
+// with 0..n-1, n+1..count. Each entry in the vector represents
+// the new id of the cylinder. This probably should be moved
+// to the C-core, but using std::vector is simply more convenient.
+// This function assumes that that n <= count!
+std::vector<int> get_cylinder_map_for_add(int count, int n)
+{
+ std::vector<int> mapping(count);
+ std::iota(mapping.begin(), mapping.begin() + n, 0);
+ std::iota(mapping.begin() + n, mapping.end(), n + 1);
+ return mapping;
+}
diff --git a/core/qthelper.h b/core/qthelper.h
index bb8876383..848763138 100644
--- a/core/qthelper.h
+++ b/core/qthelper.h
@@ -83,6 +83,8 @@ QLocale getLocale();
QVector<QPair<QString, int>> selectedDivesGasUsed();
QString getUserAgent();
QString printGPSCoords(const location_t *loc);
+std::vector<int> get_cylinder_map_for_remove(int count, int n);
+std::vector<int> get_cylinder_map_for_add(int count, int n);
extern QString (*changesCallback)();
void uiNotification(const QString &msg);
diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp
index 4b329eafe..3a3f14605 100644
--- a/qt-models/cylindermodel.cpp
+++ b/qt-models/cylindermodel.cpp
@@ -513,15 +513,7 @@ void CylindersModel::remove(QModelIndex index)
changed = true;
endRemoveRows();
- // Create a mapping of cylinder indices:
- // 1) Fill mapping[0]..mapping[index-1] with 0..index
- // 2) Set mapping[index] to -1
- // 3) Fill mapping[index+1]..mapping[end] with index..
- std::vector<int> mapping(d->cylinders.nr + 1);
- std::iota(mapping.begin(), mapping.begin() + index.row(), 0);
- mapping[index.row()] = -1;
- std::iota(mapping.begin() + index.row() + 1, mapping.end(), index.row());
-
+ std::vector<int> mapping = get_cylinder_map_for_remove(d->cylinders.nr + 1, index.row());
cylinder_renumber(d, &mapping[0]);
if (in_planner())
DivePlannerPointsModel::instance()->cylinderRenumber(&mapping[0]);