aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.c18
-rw-r--r--core/dive.h2
-rw-r--r--desktop-widgets/command.cpp5
-rw-r--r--desktop-widgets/command.h1
-rw-r--r--desktop-widgets/command_divelist.cpp29
-rw-r--r--desktop-widgets/command_divelist.h23
-rw-r--r--profile-widget/profilewidget2.cpp7
7 files changed, 60 insertions, 25 deletions
diff --git a/core/dive.c b/core/dive.c
index e6b27e0bb..b8162edd0 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -4234,10 +4234,22 @@ static void delete_divecomputer(struct dive *d, int num)
invalidate_dive_cache(d);
}
-/* always acts on the current dive */
-void delete_current_divecomputer(void)
+/* Clone a dive and delete goven dive computer */
+struct dive *clone_delete_divecomputer(const struct dive *d, int dc_number)
{
- delete_divecomputer(current_dive, dc_number);
+ struct dive *res;
+
+ /* copy the dive */
+ res = alloc_dive();
+ copy_dive(d, res);
+
+ /* make a new unique id, since we still can't handle two equal ids */
+ res->id = dive_getUniqID();
+ invalidate_dive_cache(res);
+
+ delete_divecomputer(res, dc_number);
+
+ return res;
}
/*
diff --git a/core/dive.h b/core/dive.h
index ebc127bd7..e26e0e02e 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -436,7 +436,7 @@ extern timestamp_t dive_endtime(const struct dive *dive);
extern struct dive *make_first_dc(const struct dive *d, int dc_number);
extern unsigned int count_divecomputers(void);
-extern void delete_current_divecomputer(void);
+extern struct dive *clone_delete_divecomputer(const struct dive *d, int dc_number);
void split_divecomputer(const struct dive *src, int num, struct dive **out1, struct dive **out2);
/*
diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp
index b6283ec8d..df1ae299d 100644
--- a/desktop-widgets/command.cpp
+++ b/desktop-widgets/command.cpp
@@ -79,6 +79,11 @@ void moveDiveComputerToFront(dive *d, int dc_num)
execute(new MoveDiveComputerToFront(d, dc_num));
}
+void deleteDiveComputer(dive *d, int dc_num)
+{
+ execute(new DeleteDiveComputer(d, dc_num));
+}
+
void mergeDives(const QVector <dive *> &dives)
{
execute(new MergeDives(dives));
diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h
index 543e3bcae..497c59a9a 100644
--- a/desktop-widgets/command.h
+++ b/desktop-widgets/command.h
@@ -37,6 +37,7 @@ void mergeTrips(dive_trip *trip1, dive_trip *trip2);
void splitDives(dive *d, duration_t time);
void splitDiveComputer(dive *d, int dc_num);
void moveDiveComputerToFront(dive *d, int dc_num);
+void deleteDiveComputer(dive *d, int dc_num);
void mergeDives(const QVector <dive *> &dives);
// 3) Dive-site related commands
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp
index 4c4a7e7d3..eb3de65cd 100644
--- a/desktop-widgets/command_divelist.cpp
+++ b/desktop-widgets/command_divelist.cpp
@@ -803,15 +803,12 @@ SplitDiveComputer::SplitDiveComputer(dive *d, int dc_num) : SplitDivesBase(d, sp
setText(tr("split dive computer"));
}
-MoveDiveComputerToFront::MoveDiveComputerToFront(dive *d, int dc_num)
+DiveComputerBase::DiveComputerBase(dive *old_dive, dive *new_dive)
{
- setText(tr("move dive computer to front"));
-
- dive *new_dive = make_first_dc(d, dc_num);
if (!new_dive)
return;
- diveToRemove.dives.push_back(d);
+ diveToRemove.dives.push_back(old_dive);
// Currently, the core code selects the dive -> this is not what we want, as
// we manually manage the selection post-command.
@@ -825,16 +822,16 @@ MoveDiveComputerToFront::MoveDiveComputerToFront(dive *d, int dc_num)
diveToAdd.dives.resize(1);
diveToAdd.dives[0].dive.reset(new_dive);
- diveToAdd.dives[0].trip = d->divetrip;
- diveToAdd.dives[0].site = d->dive_site;
+ diveToAdd.dives[0].trip = old_dive->divetrip;
+ diveToAdd.dives[0].site = old_dive->dive_site;
}
-bool MoveDiveComputerToFront::workToBeDone()
+bool DiveComputerBase::workToBeDone()
{
return !diveToRemove.dives.empty() || !diveToAdd.dives.empty();
}
-void MoveDiveComputerToFront::redoit()
+void DiveComputerBase::redoit()
{
DivesAndSitesToRemove addedDive = addDives(diveToAdd);
diveToAdd = removeDives(diveToRemove);
@@ -848,12 +845,24 @@ void MoveDiveComputerToFront::redoit()
MainWindow::instance()->graphics->replot(current_dive);
}
-void MoveDiveComputerToFront::undoit()
+void DiveComputerBase::undoit()
{
// Undo and redo do the same
redoit();
}
+MoveDiveComputerToFront::MoveDiveComputerToFront(dive *d, int dc_num)
+ : DiveComputerBase(d, make_first_dc(d, dc_num))
+{
+ setText(tr("move dive computer to front"));
+}
+
+DeleteDiveComputer::DeleteDiveComputer(dive *d, int dc_num)
+ : DiveComputerBase(d, clone_delete_divecomputer(d, dc_num))
+{
+ setText(tr("delete dive computer"));
+}
+
MergeDives::MergeDives(const QVector <dive *> &dives)
{
setText(tr("merge dive"));
diff --git a/desktop-widgets/command_divelist.h b/desktop-widgets/command_divelist.h
index d46697454..7de168e9a 100644
--- a/desktop-widgets/command_divelist.h
+++ b/desktop-widgets/command_divelist.h
@@ -236,23 +236,36 @@ public:
SplitDiveComputer(dive *d, int dc_num);
};
-// When moving the dive computer to the front, we go the ineffective,
-// but easy way: We keep two full copies of the dive (before and after).
+// When manipulating dive computers (moving, deleting) we go the ineffective,
+// but simple and robust way: We keep two full copies of the dive (before and after).
// Removing and readding assures that the dive stays at the correct
// position in the list (the dive computer list is used for sorting dives).
-class MoveDiveComputerToFront : public DiveListBase {
-public:
- MoveDiveComputerToFront(dive *d, int dc_num);
+class DiveComputerBase : public DiveListBase {
+protected:
+ // old_dive must be a dive known to the core.
+ // new_dive must be new dive whose ownership is taken.
+ DiveComputerBase(dive *old_dive, dive *new_dive);
private:
void undoit() override;
void redoit() override;
bool workToBeDone() override;
+protected:
// For redo and undo
DivesAndTripsToAdd diveToAdd;
DivesAndSitesToRemove diveToRemove;
};
+class MoveDiveComputerToFront : public DiveComputerBase {
+public:
+ MoveDiveComputerToFront(dive *d, int dc_num);
+};
+
+class DeleteDiveComputer : public DiveComputerBase {
+public:
+ DeleteDiveComputer(dive *d, int dc_num);
+};
+
class MergeDives : public DiveListBase {
public:
MergeDives(const QVector<dive *> &dives);
diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp
index 46a1eb1a0..c233b2b44 100644
--- a/profile-widget/profilewidget2.cpp
+++ b/profile-widget/profilewidget2.cpp
@@ -1575,12 +1575,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
void ProfileWidget2::deleteCurrentDC()
{
- delete_current_divecomputer();
- mark_divelist_changed(true);
- // we need to force it since it's likely the same dive and same dc_number - but that's a different dive computer now
- plotDive(0, true, false);
-
- emit refreshDisplay(true);
+ Command::deleteDiveComputer(current_dive, dc_number);
}
void ProfileWidget2::splitCurrentDC()