summaryrefslogtreecommitdiffstats
path: root/qt-ui/models.cpp
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-04-23 15:24:02 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-04-23 15:27:21 -0700
commit415abeea66d180da05bdb5ad31439d6f937d7168 (patch)
tree663de2cf3b3d0cc0c9de0866dbcec6d06bbc6cf7 /qt-ui/models.cpp
parentbbfa2b655bac88306f8e7805f2eb61b2f801ad0a (diff)
downloadsubsurface-415abeea66d180da05bdb5ad31439d6f937d7168.tar.gz
When deleting a cylinder, adapt gas changes
When we delete a cylinder the gas changes in that dive may have to be adjusted. We didn't do this at all in the past. With this commit we should be doing this right for a single dive that is being edited. This does NOT handle multiple dives being edited at the same time (or more specifically - if you have multiple dives selected and delete a cylinder, the dives that had the same set of cylinders (other than the displayed dive) will get that particular cylinder deleted, but won't have their gas change events (and sensor data in the samples) adapted. Possibly we should simply prohibit deleting cylinders when more than one dive are selected. See #834 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/models.cpp')
-rw-r--r--qt-ui/models.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 6376bb82a..d6b425b52 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -388,6 +388,7 @@ Qt::ItemFlags CylindersModel::flags(const QModelIndex &index) const
void CylindersModel::remove(const QModelIndex &index)
{
+ int mapping[MAX_CYLINDERS];
if (index.column() != REMOVE) {
return;
}
@@ -395,6 +396,7 @@ void CylindersModel::remove(const QModelIndex &index)
cylinder_t *cyl = &displayed_dive.cylinder[index.row()];
struct gasmix *mygas = &cyl->gasmix;
for (int i = 0; i < MAX_CYLINDERS; i++) {
+ mapping[i] = i;
if (i == index.row() || cylinder_none(&displayed_dive.cylinder[i]))
continue;
struct gasmix *gas2 = &displayed_dive.cylinder[i].gasmix;
@@ -419,11 +421,24 @@ void CylindersModel::remove(const QModelIndex &index)
// as first gas
memmove(cyl, &displayed_dive.cylinder[same_gas], sizeof(*cyl));
remove_cylinder(&displayed_dive, same_gas);
+ mapping[same_gas] = 0;
+ for (int i = same_gas + 1; i < MAX_CYLINDERS; i++)
+ mapping[i] = i - 1;
} else {
remove_cylinder(&displayed_dive, index.row());
+ if (same_gas > index.row())
+ same_gas--;
+ mapping[index.row()] = same_gas;
+ for (int i = index.row() + 1; i < MAX_CYLINDERS; i++)
+ mapping[i] = i - 1;
}
changed = true;
endRemoveRows();
+ struct divecomputer *dc = &displayed_dive.dc;
+ while (dc) {
+ dc_cylinder_renumber(&displayed_dive, dc, mapping);
+ dc = dc->next;
+ }
}
WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),