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>
This commit is contained in:
Berthold Stoeger 2019-03-13 20:58:25 +01:00 committed by Dirk Hohndel
parent 2dcc0a7d1e
commit 56dcbd9588
6 changed files with 55 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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()));

View file

@ -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);

View file

@ -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"));
}

View file

@ -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;