undo: more fine-grained editing of cylinder

Don't overwrite the full cylinder when editing a single field.
Implement three "modes": editing of type, pressure and gasmix.

Don't consider individual fields, because some of them are
related. E.g. you can change the gasmix by setting the MOD.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2020-03-27 21:09:59 +01:00
parent 4e8a838f74
commit 2eeb5f4fc2
7 changed files with 64 additions and 22 deletions

View file

@ -5,6 +5,7 @@
#define COMMAND_EDIT_H
#include "command_base.h"
#include "command.h" // for EditCylinderType
#include "core/subsurface-qt/divelistnotifier.h"
#include <QVector>
@ -406,10 +407,16 @@ private:
void redo() override;
};
// Instead of implementing an undo command for every single field in a cylinder,
// we only have one and pass an edit "type". We either edit the type, pressure
// or gasmix fields. This has mostly historical reasons rooted in the way the
// CylindersModel code works. The model works for undo and also in the planner
// without undo. Having a single undo-command simplifies the code there.
class EditCylinder : public EditCylinderBase {
public:
EditCylinder(int index, cylinder_t cyl, bool currentDiveOnly); // Clones cylinder
EditCylinder(int index, cylinder_t cyl, EditCylinderType type, bool currentDiveOnly); // Clones cylinder
private:
EditCylinderType type;
void undo() override;
void redo() override;
};