mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Undo: Implement undo of dive site name editing
Implement an undo command that edits the name of a dive site. Connect it to the dive site table, so that names can be edited directly in the table. Send signals on undo / redo so that the dive site table and the dive site edit widget can be updated. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
8e1f736d2b
commit
0e1b0cf1da
9 changed files with 97 additions and 2 deletions
|
|
@ -83,4 +83,9 @@ void deleteDiveSites(const QVector <dive_site *> &sites)
|
|||
execute(new DeleteDiveSites(sites));
|
||||
}
|
||||
|
||||
void editDiveSiteName(dive_site *ds, const QString &value)
|
||||
{
|
||||
execute(new EditDiveSiteName(ds, value));
|
||||
}
|
||||
|
||||
} // namespace Command
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ void mergeDives(const QVector <dive *> &dives);
|
|||
// 3) Dive-site related commands
|
||||
|
||||
void deleteDiveSites(const QVector <dive_site *> &sites);
|
||||
void editDiveSiteName(dive_site *ds, const QString &value);
|
||||
|
||||
} // namespace Command
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
#include "command_divesite.h"
|
||||
#include "core/divesite.h"
|
||||
#include "core/subsurface-qt/DiveListNotifier.h"
|
||||
#include "core/qthelper.h"
|
||||
#include "qt-models/divelocationmodel.h"
|
||||
|
||||
namespace Command {
|
||||
|
||||
|
|
@ -80,4 +82,29 @@ void DeleteDiveSites::undo()
|
|||
sitesToRemove = std::move(addDiveSites(sitesToAdd));
|
||||
}
|
||||
|
||||
EditDiveSiteName::EditDiveSiteName(dive_site *dsIn, const QString &name) : ds(dsIn),
|
||||
value(name)
|
||||
{
|
||||
}
|
||||
|
||||
bool EditDiveSiteName::workToBeDone()
|
||||
{
|
||||
return value != QString(ds->name);
|
||||
}
|
||||
|
||||
void EditDiveSiteName::redo()
|
||||
{
|
||||
QString s = ds->name;
|
||||
free(ds->name);
|
||||
ds->name = copy_qstring(value);
|
||||
value = s;
|
||||
emit diveListNotifier.diveSiteChanged(ds, LocationInformationModel::NAME); // Inform frontend of changed dive site.
|
||||
}
|
||||
|
||||
void EditDiveSiteName::undo()
|
||||
{
|
||||
// Undo and redo do the same
|
||||
redo();
|
||||
}
|
||||
|
||||
} // namespace Command
|
||||
|
|
|
|||
|
|
@ -16,14 +16,26 @@ public:
|
|||
DeleteDiveSites(const QVector<dive_site *> &sites);
|
||||
private:
|
||||
bool workToBeDone() override;
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
// For redo
|
||||
std::vector<dive_site *> sitesToRemove;
|
||||
|
||||
// For undo
|
||||
std::vector<OwningDiveSitePtr> sitesToAdd;
|
||||
};
|
||||
|
||||
class EditDiveSiteName : public Base {
|
||||
public:
|
||||
EditDiveSiteName(dive_site *ds, const QString &name);
|
||||
private:
|
||||
bool workToBeDone() override;
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
dive_site *ds;
|
||||
QString value; // Value to be set
|
||||
};
|
||||
|
||||
} // namespace Command
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "qt-models/filtermodels.h"
|
||||
#include "core/divesitehelpers.h"
|
||||
#include "desktop-widgets/modeldelegates.h"
|
||||
#include "core/subsurface-qt/DiveListNotifier.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QShowEvent>
|
||||
|
|
@ -38,6 +39,8 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo
|
|||
connect(ui.diveSiteCoordinates, SIGNAL(returnPressed()), this, SLOT(updateLocationOnMap()));
|
||||
ui.diveSiteCoordinates->installEventFilter(this);
|
||||
|
||||
connect(&diveListNotifier, &DiveListNotifier::diveSiteChanged, this, &LocationInformationWidget::diveSiteChanged);
|
||||
|
||||
ui.diveSiteListView->setModel(&filter_model);
|
||||
ui.diveSiteListView->setModelColumn(LocationInformationModel::NAME);
|
||||
ui.diveSiteListView->installEventFilter(this);
|
||||
|
|
@ -121,6 +124,18 @@ void LocationInformationWidget::updateLabels()
|
|||
ui.locationTags->setText(constructLocationTags(&taxonomy, false));
|
||||
}
|
||||
|
||||
void LocationInformationWidget::diveSiteChanged(struct dive_site *ds, int field)
|
||||
{
|
||||
if (diveSite != ds)
|
||||
return; // A different dive site was changed -> do nothing.
|
||||
switch (field) {
|
||||
case LocationInformationModel::NAME:
|
||||
ui.diveSiteName->setText(diveSite->name);
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void LocationInformationWidget::clearLabels()
|
||||
{
|
||||
ui.diveSiteName->clear();
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ public slots:
|
|||
private slots:
|
||||
void updateLabels();
|
||||
void updateLocationOnMap();
|
||||
void diveSiteChanged(struct dive_site *ds, int field);
|
||||
signals:
|
||||
void endEditDiveSite();
|
||||
void nameChanged(const QString &oldName, const QString &newName);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue