summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-03-13 20:58:25 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-04-12 18:19:07 +0300
commit56dcbd9588fa3b7d70a4b639b71cb18e1c462067 (patch)
tree7a82e3bcc5e56d8c755f1e0244b5ef296bebaa39
parent2dcc0a7d1ebf6435060168f343df2adb5f0abb3c (diff)
downloadsubsurface-56dcbd9588fa3b7d70a4b639b71cb18e1c462067.tar.gz
Undo: implement undo of dive site addition
Implement a dive site addition undo command and connect it to the add dive site button. The added dive site has a default name ("new dive site"). Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--desktop-widgets/command.cpp5
-rw-r--r--desktop-widgets/command.h1
-rw-r--r--desktop-widgets/command_divesite.cpp22
-rw-r--r--desktop-widgets/command_divesite.h17
-rw-r--r--desktop-widgets/tab-widgets/TabDiveSite.cpp8
-rw-r--r--desktop-widgets/tab-widgets/TabDiveSite.h2
6 files changed, 55 insertions, 0 deletions
diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp
index ee2016c6e..1d34d268b 100644
--- a/desktop-widgets/command.cpp
+++ b/desktop-widgets/command.cpp
@@ -93,4 +93,9 @@ void editDiveSiteDescription(dive_site *ds, const QString &value)
execute(new EditDiveSiteDescription(ds, value));
}
+void addDiveSite(const QString &name)
+{
+ execute(new AddDiveSite(name));
+}
+
} // namespace Command
diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h
index 785981831..4f89eb4c0 100644
--- a/desktop-widgets/command.h
+++ b/desktop-widgets/command.h
@@ -43,6 +43,7 @@ void mergeDives(const QVector <dive *> &dives);
void deleteDiveSites(const QVector <dive_site *> &sites);
void editDiveSiteName(dive_site *ds, const QString &value);
void editDiveSiteDescription(dive_site *ds, const QString &value);
+void addDiveSite(const QString &name);
} // namespace Command
diff --git a/desktop-widgets/command_divesite.cpp b/desktop-widgets/command_divesite.cpp
index 28d47d603..b3a4911e5 100644
--- a/desktop-widgets/command_divesite.cpp
+++ b/desktop-widgets/command_divesite.cpp
@@ -62,6 +62,28 @@ static std::vector<OwningDiveSitePtr> removeDiveSites(std::vector<dive_site *> &
return res;
}
+AddDiveSite::AddDiveSite(const QString &name)
+{
+ setText(tr("add dive site"));
+ sitesToAdd.emplace_back(alloc_dive_site());
+ sitesToAdd.back()->name = copy_qstring(name);
+}
+
+bool AddDiveSite::workToBeDone()
+{
+ return true;
+}
+
+void AddDiveSite::redo()
+{
+ sitesToRemove = std::move(addDiveSites(sitesToAdd));
+}
+
+void AddDiveSite::undo()
+{
+ sitesToAdd = std::move(removeDiveSites(sitesToRemove));
+}
+
DeleteDiveSites::DeleteDiveSites(const QVector<dive_site *> &sites) : sitesToRemove(sites.toStdVector())
{
setText(tr("delete %n dive site(s)", "", sites.size()));
diff --git a/desktop-widgets/command_divesite.h b/desktop-widgets/command_divesite.h
index 78622862e..f436a84b4 100644
--- a/desktop-widgets/command_divesite.h
+++ b/desktop-widgets/command_divesite.h
@@ -11,6 +11,23 @@
// We put everything in a namespace, so that we can shorten names without polluting the global namespace
namespace Command {
+class AddDiveSite : public Base {
+public:
+ AddDiveSite(const QString &name);
+private:
+ bool workToBeDone() override;
+ void undo() override;
+ void redo() override;
+
+ // Note: we only add one dive site. Nevertheless, we use vectors so that we
+ // can reuse the dive site deletion code.
+ // For redo
+ std::vector<dive_site *> sitesToRemove;
+
+ // For undo
+ std::vector<OwningDiveSitePtr> sitesToAdd;
+};
+
class DeleteDiveSites : public Base {
public:
DeleteDiveSites(const QVector<dive_site *> &sites);
diff --git a/desktop-widgets/tab-widgets/TabDiveSite.cpp b/desktop-widgets/tab-widgets/TabDiveSite.cpp
index 5e2831c93..648df6395 100644
--- a/desktop-widgets/tab-widgets/TabDiveSite.cpp
+++ b/desktop-widgets/tab-widgets/TabDiveSite.cpp
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0
#include "TabDiveSite.h"
#include "qt-models/divelocationmodel.h"
+#include "desktop-widgets/command.h"
#include <qt-models/divecomputerextradatamodel.h>
@@ -16,6 +17,8 @@ TabDiveSite::TabDiveSite(QWidget *parent) : TabBase(parent)
// Show only the first few columns
for (int i = LocationInformationModel::COORDS; i < LocationInformationModel::COLUMNS; ++i)
ui.diveSites->view()->setColumnHidden(i, true);
+
+ connect(ui.diveSites, &TableView::addButtonClicked, this, &TabDiveSite::add);
}
void TabDiveSite::updateData()
@@ -25,3 +28,8 @@ void TabDiveSite::updateData()
void TabDiveSite::clear()
{
}
+
+void TabDiveSite::add()
+{
+ Command::addDiveSite(tr("New dive site"));
+}
diff --git a/desktop-widgets/tab-widgets/TabDiveSite.h b/desktop-widgets/tab-widgets/TabDiveSite.h
index f0bf2d5d5..2538166b4 100644
--- a/desktop-widgets/tab-widgets/TabDiveSite.h
+++ b/desktop-widgets/tab-widgets/TabDiveSite.h
@@ -12,6 +12,8 @@ public:
TabDiveSite(QWidget *parent = 0);
void updateData() override;
void clear() override;
+private slots:
+ void add();
private:
Ui::TabDiveSite ui;
DiveSiteSortedModel model;