summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c4
-rw-r--r--dive.h2
-rw-r--r--qt-ui/maintab.cpp10
-rw-r--r--qt-ui/models.cpp15
4 files changed, 29 insertions, 2 deletions
diff --git a/dive.c b/dive.c
index bdb6937d4..2b98c2a77 100644
--- a/dive.c
+++ b/dive.c
@@ -1758,7 +1758,7 @@ static void add_initial_gaschange(struct dive *dive, struct divecomputer *dc)
add_gas_switch_event(dive, dc, 0, 0);
}
-static void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[])
+void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[])
{
int i;
struct event *ev;
@@ -2259,7 +2259,7 @@ struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded
return NULL;
}
-static void free_events(struct event *ev)
+void free_events(struct event *ev)
{
while (ev) {
struct event *next = ev->next;
diff --git a/dive.h b/dive.h
index af4eb0d38..c50fb1a91 100644
--- a/dive.h
+++ b/dive.h
@@ -349,6 +349,7 @@ struct dive {
};
extern int get_cylinder_idx_by_use(struct dive *dive, enum cylinderuse cylinder_use_type);
+extern void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]);
/* when selectively copying dive information, which parts should be copied? */
struct dive_components {
@@ -721,6 +722,7 @@ extern struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool
extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded);
extern void renumber_dives(int start_nr, bool selected_only);
extern void copy_events(struct divecomputer *s, struct divecomputer *d);
+extern void free_events(struct event *ev);
extern void copy_cylinders(struct dive *s, struct dive *d, bool used_only);
extern void copy_samples(struct divecomputer *s, struct divecomputer *d);
extern bool is_cylinder_used(struct dive *dive, int idx);
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index a75b80722..314626c5d 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -813,6 +813,16 @@ void MainTab::acceptChanges()
cd->cylinder[i] = displayed_dive.cylinder[i];
cd->cylinder[i].type.description = copy_string(displayed_dive.cylinder[i].type.description);
}
+ /* if cylinders changed we may have changed gas change events
+ * - so far this is ONLY supported for a single selected dive */
+ struct divecomputer *tdc = &current_dive->dc;
+ struct divecomputer *sdc = &displayed_dive.dc;
+ while(tdc && sdc) {
+ free_events(tdc->events);
+ copy_events(sdc, tdc);
+ tdc = tdc->next;
+ sdc = sdc->next;
+ }
do_replot = true;
}
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),