summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.c15
-rw-r--r--core/dive.h1
-rw-r--r--core/subsurface-qt/DiveListNotifier.h3
-rw-r--r--desktop-widgets/command_edit.cpp4
-rw-r--r--qt-models/cylindermodel.cpp16
-rw-r--r--qt-models/cylindermodel.h1
-rw-r--r--qt-models/weightmodel.cpp16
-rw-r--r--qt-models/weightmodel.h1
8 files changed, 52 insertions, 5 deletions
diff --git a/core/dive.c b/core/dive.c
index b82970862..14ab13f95 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -649,6 +649,15 @@ struct dive *clone_dive(struct dive *s)
if (what._component) \
d->_component = copy_string(s->_component)
+void copy_weights(const struct dive *s, struct dive *d)
+{
+ for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) {
+ free((void *)d->weightsystem[i].description);
+ d->weightsystem[i] = s->weightsystem[i];
+ d->weightsystem[i].description = copy_string(s->weightsystem[i].description);
+ }
+}
+
// copy elements, depending on bits in what that are set
void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_components what, bool clear)
{
@@ -671,11 +680,7 @@ void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_compo
if (what.cylinders)
copy_cylinders(s, d, false);
if (what.weights)
- for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) {
- free((void *)d->weightsystem[i].description);
- d->weightsystem[i] = s->weightsystem[i];
- d->weightsystem[i].description = copy_string(s->weightsystem[i].description);
- }
+ copy_weights(s, d);
}
#undef CONDITIONAL_COPY_STRING
diff --git a/core/dive.h b/core/dive.h
index 06abc0df2..6e4940452 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -546,6 +546,7 @@ extern void copy_events(const struct divecomputer *s, struct divecomputer *d);
extern void free_events(struct event *ev);
extern void copy_cylinders(const struct dive *s, struct dive *d, bool used_only);
extern void copy_samples(const struct divecomputer *s, struct divecomputer *d);
+extern void copy_weights(const struct dive *s, struct dive *d);
extern bool is_cylinder_used(const struct dive *dive, int idx);
extern bool is_cylinder_prot(const struct dive *dive, int idx);
extern void fill_default_cylinder(cylinder_t *cyl);
diff --git a/core/subsurface-qt/DiveListNotifier.h b/core/subsurface-qt/DiveListNotifier.h
index 53009410e..46e160208 100644
--- a/core/subsurface-qt/DiveListNotifier.h
+++ b/core/subsurface-qt/DiveListNotifier.h
@@ -51,6 +51,9 @@ signals:
void divesMovedBetweenTrips(dive_trip *from, dive_trip *to, bool deleteFrom, bool createTo, const QVector<dive *> &dives);
void divesTimeChanged(dive_trip *trip, timestamp_t delta, const QVector<dive *> &dives);
+ void cylindersReset(dive_trip *trip, const QVector<dive *> &dives);
+ void weightsystemsReset(dive_trip *trip, const QVector<dive *> &dives);
+
// Selection-signals come in two kinds:
// - divesSelected, divesDeselected and currentDiveChanged are finer grained and are
// called batch-wise per trip (except currentDiveChanged, of course). These signals
diff --git a/desktop-widgets/command_edit.cpp b/desktop-widgets/command_edit.cpp
index 106670978..a1e4de358 100644
--- a/desktop-widgets/command_edit.cpp
+++ b/desktop-widgets/command_edit.cpp
@@ -760,6 +760,10 @@ void PasteDives::undo()
emit diveListNotifier.divesChanged(trip, divesInTrip, DiveField::DIVESITE);
if (what.tags)
emit diveListNotifier.divesChanged(trip, divesInTrip, DiveField::TAGS);
+ if (what.cylinders)
+ emit diveListNotifier.cylindersReset(trip, divesInTrip);
+ if (what.weights)
+ emit diveListNotifier.weightsystemsReset(trip, divesInTrip);
});
if (diveSiteListChanged)
diff --git a/qt-models/cylindermodel.cpp b/qt-models/cylindermodel.cpp
index 9796907cf..83c520634 100644
--- a/qt-models/cylindermodel.cpp
+++ b/qt-models/cylindermodel.cpp
@@ -6,6 +6,7 @@
#include "core/color.h"
#include "qt-models/diveplannermodel.h"
#include "core/gettextfromc.h"
+#include "core/subsurface-qt/DiveListNotifier.h"
CylindersModel::CylindersModel(QObject *parent) :
CleanerTableModel(parent),
@@ -16,6 +17,7 @@ CylindersModel::CylindersModel(QObject *parent) :
setHeaderDataStrings(QStringList() << "" << tr("Type") << tr("Size") << tr("Work press.") << tr("Start press.") << tr("End press.") << tr("O₂%") << tr("He%")
<< tr("Deco switch at") <<tr("Bot. MOD") <<tr("MND") << tr("Use"));
+ connect(&diveListNotifier, &DiveListNotifier::cylindersReset, this, &CylindersModel::cylindersReset);
}
QVariant CylindersModel::headerData(int section, Qt::Orientation orientation, int role) const
@@ -630,3 +632,17 @@ bool CylindersModel::updateBestMixes()
emit dataChanged(createIndex(0, 0), createIndex(MAX_CYLINDERS - 1, COLUMNS - 1));
return gasUpdated;
}
+
+void CylindersModel::cylindersReset(dive_trip *trip, const QVector<dive *> &dives)
+{
+ // This model only concerns the currently displayed dive. If this is not among the
+ // dives that had their cylinders reset, exit.
+ if (!current_dive || std::find(dives.begin(), dives.end(), current_dive) == dives.end())
+ return;
+
+ // Copy the cylinders from the current dive to the displayed dive.
+ copy_cylinders(current_dive, &displayed_dive, false);
+
+ // And update the model..
+ updateDive();
+}
diff --git a/qt-models/cylindermodel.h b/qt-models/cylindermodel.h
index c97eac179..d53aaa564 100644
--- a/qt-models/cylindermodel.h
+++ b/qt-models/cylindermodel.h
@@ -48,6 +48,7 @@ public:
public
slots:
void remove(const QModelIndex &index);
+ void cylindersReset(dive_trip *trip, const QVector<dive *> &dives);
bool updateBestMixes();
private:
diff --git a/qt-models/weightmodel.cpp b/qt-models/weightmodel.cpp
index b8e9ffa5d..6f913c63b 100644
--- a/qt-models/weightmodel.cpp
+++ b/qt-models/weightmodel.cpp
@@ -4,6 +4,7 @@
#include "core/gettextfromc.h"
#include "core/metrics.h"
#include "core/qthelper.h"
+#include "core/subsurface-qt/DiveListNotifier.h"
#include "qt-models/weightsysteminfomodel.h"
WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
@@ -12,6 +13,7 @@ WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
{
//enum Column {REMOVE, TYPE, WEIGHT};
setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
+ connect(&diveListNotifier, &DiveListNotifier::weightsystemsReset, this, &WeightModel::weightsystemsReset);
}
weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
@@ -173,3 +175,17 @@ void WeightModel::updateDive()
endInsertRows();
}
}
+
+void WeightModel::weightsystemsReset(dive_trip *trip, const QVector<dive *> &dives)
+{
+ // This model only concerns the currently displayed dive. If this is not among the
+ // dives that had their cylinders reset, exit.
+ if (!current_dive || std::find(dives.begin(), dives.end(), current_dive) == dives.end())
+ return;
+
+ // Copy the cylinders from the current dive to the displayed dive.
+ copy_weights(current_dive, &displayed_dive);
+
+ // And update the model..
+ updateDive();
+}
diff --git a/qt-models/weightmodel.h b/qt-models/weightmodel.h
index 574a40c29..ec43bbbb8 100644
--- a/qt-models/weightmodel.h
+++ b/qt-models/weightmodel.h
@@ -32,6 +32,7 @@ public:
public
slots:
void remove(const QModelIndex &index);
+ void weightsystemsReset(dive_trip *trip, const QVector<dive *> &dives);
private:
int rows;