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 &dives); void divesTimeChanged(dive_trip *trip, timestamp_t delta, const QVector &dives); + void cylindersReset(dive_trip *trip, const QVector &dives); + void weightsystemsReset(dive_trip *trip, const QVector &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") < &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 &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 &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 &dives); private: int rows;