aboutsummaryrefslogtreecommitdiffstats
path: root/desktop-widgets/command_edit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/command_edit.cpp')
-rw-r--r--desktop-widgets/command_edit.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/desktop-widgets/command_edit.cpp b/desktop-widgets/command_edit.cpp
index 74cffb177..b11ede6a5 100644
--- a/desktop-widgets/command_edit.cpp
+++ b/desktop-widgets/command_edit.cpp
@@ -837,4 +837,72 @@ void PasteDives::redo()
undo();
}
+// ***** Paste *****
+ReplanDive::ReplanDive(dive *source) : d(current_dive),
+ dc({ 0 }),
+ notes(nullptr)
+{
+ memset(&cylinders[0], 0, sizeof(cylinders));
+ if (!d)
+ return;
+
+ when = source->when;
+ maxdepth = source->maxdepth;
+ meandepth = source->meandepth;
+ notes = copy_string(source->notes);
+ duration = source->duration;
+ salinity = source->salinity;
+ surface_pressure = source->surface_pressure;
+
+ // This resets the dive computers and cylinders of the source dive, avoiding deep copies.
+ std::swap(source->cylinder, cylinders);
+ std::swap(source->dc, dc);
+
+ setText(tr("Replan dive"));
+}
+
+ReplanDive::~ReplanDive()
+{
+ for (cylinder_t &c: cylinders)
+ free((void *)c.type.description);
+ free_dive_dcs(&dc);
+ free(notes);
+}
+
+bool ReplanDive::workToBeDone()
+{
+ return !!d;
+}
+
+void ReplanDive::undo()
+{
+ std::swap(d->when, when);
+ std::swap(d->maxdepth, maxdepth);
+ std::swap(d->meandepth, meandepth);
+ std::swap(d->cylinder, cylinders);
+ std::swap(d->dc, dc);
+ std::swap(d->notes, notes);
+ std::swap(d->surface_pressure, surface_pressure);
+ std::swap(d->duration, duration);
+ std::swap(d->salinity, salinity);
+ fixup_dive(d);
+
+ QVector<dive *> divesToNotify = { d };
+ // TODO: Turn field into flags to avoid multiple signals
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::DATETIME);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::DURATION);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::DEPTH);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::MODE);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::NOTES);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::SALINITY);
+ emit diveListNotifier.divesChanged(divesToNotify, DiveField::ATM_PRESS);
+ emit diveListNotifier.cylindersReset(divesToNotify);
+}
+
+// Redo and undo do the same
+void ReplanDive::redo()
+{
+ undo();
+}
+
} // namespace Command