mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Undo: implement undo of dive site editing
This one is a bit more tricky. There are two modes: set dive site and set newly created dive site. This is realized using an OO model with derived classed. Quite convoluted - but it seems to work. Moreover, editing a dive site is not simply setting a value, but the list of dives in a dive site has to be kept up to date. Finally, we have to inform the dive site list of the changed number of dives. Therefore add a new signal diveSiteDivesChanged. To send only one signal per dive site, hook into the undo() and redo() functions and call the functions of the base class there. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
4cb1ceefff
commit
6f574c53a3
10 changed files with 160 additions and 106 deletions
|
@ -25,6 +25,7 @@ namespace Command {
|
|||
|
||||
template <typename T>
|
||||
class EditBase : public Base {
|
||||
protected:
|
||||
T value; // Value to be set
|
||||
T old; // Previous value
|
||||
|
||||
|
@ -101,6 +102,30 @@ public:
|
|||
DiveField fieldId() const override;
|
||||
};
|
||||
|
||||
class EditDiveSite : public EditBase<struct dive_site *> {
|
||||
public:
|
||||
using EditBase<struct dive_site *>::EditBase; // Use constructor of base class.
|
||||
void set(struct dive *d, struct dive_site *value) const override;
|
||||
struct dive_site *data(struct dive *d) const override;
|
||||
QString fieldName() const override;
|
||||
DiveField fieldId() const override;
|
||||
|
||||
// We specialize these so that we can send dive-site changed signals.
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
};
|
||||
|
||||
// Edit dive site, but add a new dive site first. Reuses the code of EditDiveSite by
|
||||
// deriving from it and hooks into undo() and redo() to add / remove the dive site.
|
||||
class EditDiveSiteNew : public EditDiveSite {
|
||||
public:
|
||||
OwningDiveSitePtr diveSiteToAdd;
|
||||
struct dive_site *diveSiteToRemove;
|
||||
EditDiveSiteNew(const QVector<dive *> &dives, const QString &newName, struct dive_site *oldValue);
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
};
|
||||
|
||||
class EditMode : public EditBase<int> {
|
||||
int index;
|
||||
public:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue