summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-11-30 15:51:34 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-12-03 20:55:58 -0800
commita6fa6cdb410514ba61b8886d3acadd4500c1d86e (patch)
tree017877ddaa99ce88023e2c8a07bd222ad19b00b9
parent7c024f12d2123e08c272cefb2991623bc1da107a (diff)
downloadsubsurface-a6fa6cdb410514ba61b8886d3acadd4500c1d86e.tar.gz
Undo: make profile-editing undoable
Recently, undo of dive-replanning was introduced. Therefore, it appears logical to do the same thing for editing of the profile of manually added dives. For now, use the same undo-command, just change the displayed text from "replan dive" to "edit profile". Move the fixup dive call into the undo-command. Eventually, every action on the profile should be made undoable. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--commands/command.cpp7
-rw-r--r--commands/command.h1
-rw-r--r--commands/command_edit.cpp8
-rw-r--r--commands/command_edit.h4
-rw-r--r--desktop-widgets/tab-widgets/maintab.cpp19
5 files changed, 17 insertions, 22 deletions
diff --git a/commands/command.cpp b/commands/command.cpp
index d04128b8a..47595674f 100644
--- a/commands/command.cpp
+++ b/commands/command.cpp
@@ -260,7 +260,12 @@ void pasteDives(const dive *d, dive_components what)
void replanDive(dive *d)
{
- execute(new ReplanDive(d));
+ execute(new ReplanDive(d, false));
+}
+
+void editProfile(dive *d)
+{
+ execute(new ReplanDive(d, true));
}
// Trip editing related commands
diff --git a/commands/command.h b/commands/command.h
index 1b7e65394..6446b32fd 100644
--- a/commands/command.h
+++ b/commands/command.h
@@ -80,6 +80,7 @@ int editBuddies(const QStringList &newList, bool currentDiveOnly);
int editDiveMaster(const QStringList &newList, bool currentDiveOnly);
void pasteDives(const dive *d, dive_components what);
void replanDive(dive *d); // dive computer(s) and cylinder(s) will be reset!
+void editProfile(dive *d); // dive computer(s) and cylinder(s) will be reset!
// 5) Trip editing commands
diff --git a/commands/command_edit.cpp b/commands/command_edit.cpp
index 215f57899..7f4726a6b 100644
--- a/commands/command_edit.cpp
+++ b/commands/command_edit.cpp
@@ -887,7 +887,7 @@ void PasteDives::redo()
}
// ***** Paste *****
-ReplanDive::ReplanDive(dive *source) : d(current_dive),
+ReplanDive::ReplanDive(dive *source, bool edit_profile) : d(current_dive),
dc({ 0 }),
notes(nullptr)
{
@@ -895,6 +895,10 @@ ReplanDive::ReplanDive(dive *source) : d(current_dive),
if (!d)
return;
+ // Fix source. Things might be inconsistent after modifying the profile.
+ source->maxdepth.mm = source->dc.maxdepth.mm = 0;
+ fixup_dive(source);
+
when = source->when;
maxdepth = source->maxdepth;
meandepth = source->meandepth;
@@ -907,7 +911,7 @@ ReplanDive::ReplanDive(dive *source) : d(current_dive),
std::swap(source->cylinders, cylinders);
std::swap(source->dc, dc);
- setText(tr("Replan dive"));
+ setText(edit_profile ? tr("Replan dive") : tr("Edit profile"));
}
ReplanDive::~ReplanDive()
diff --git a/commands/command_edit.h b/commands/command_edit.h
index cd12eaa04..c3acf9d48 100644
--- a/commands/command_edit.h
+++ b/commands/command_edit.h
@@ -320,7 +320,9 @@ class ReplanDive : public Base {
duration_t duration;
int salinity;
public:
- ReplanDive(dive *source); // Dive computer(s) and cylinders(s) of the source dive will be reset!
+ // Dive computer(s) and cylinders(s) of the source dive will be reset!
+ // If edit_profile is true, the text will be changed from "replan dive" to "edit profile".
+ ReplanDive(dive *source, bool edit_profile);
~ReplanDive();
private:
void undo() override;
diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp
index 3e6de0f39..82e7e4fa5 100644
--- a/desktop-widgets/tab-widgets/maintab.cpp
+++ b/desktop-widgets/tab-widgets/maintab.cpp
@@ -529,8 +529,6 @@ void MainTab::refreshDisplayedDiveSite()
void MainTab::acceptChanges()
{
- int addedId = -1;
-
if (ui.location->hasFocus())
stealFocus();
@@ -541,33 +539,18 @@ void MainTab::acceptChanges()
ui.dateEdit->setEnabled(true);
hideMessage();
- if (lastMode == MANUALLY_ADDED_DIVE) {
- // preserve any changes to the profile
- free(current_dive->dc.sample);
- copy_samples(&displayed_dive.dc, &current_dive->dc);
- addedId = displayed_dive.id;
- }
-
// TODO: This is a temporary hack until the equipment tab is included in the undo system:
// The equipment tab is hardcoded at the first place of the "extra widgets".
((TabDiveEquipment *)extraWidgets[0])->acceptChanges();
if (lastMode == MANUALLY_ADDED_DIVE) {
- // we just added or edited the dive, let fixup_dive() make
- // sure we get the max. depth right
- current_dive->maxdepth.mm = current_dc->maxdepth.mm = 0;
- fixup_dive(current_dive);
- set_dive_nr_for_current_dive();
MainWindow::instance()->showProfile();
- mark_divelist_changed(true);
DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::NOTHING);
+ Command::editProfile(&displayed_dive);
}
int scrolledBy = MainWindow::instance()->diveList->verticalScrollBar()->sliderPosition();
if (lastMode == MANUALLY_ADDED_DIVE) {
MainWindow::instance()->diveList->reload();
- int newDiveNr = get_divenr(get_dive_by_uniq_id(addedId));
- MainWindow::instance()->diveList->unselectDives();
- MainWindow::instance()->diveList->selectDive(newDiveNr, true);
MainWindow::instance()->refreshDisplay();
MainWindow::instance()->graphics->replot();
} else {