mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
undo: autogenerate trivial set() and data() functions by a template
Some dive-editing undo commands have trivial setter and getter functions: they simply read and write a struct dive member. Autogenerate these in a template to which we pass a pointer to member as template argument. For the invalid-flag we have to turn the edit command from int to bool, since that is how the flag is store in the dive struct. Sadly, quite a number of the setters do funky things and we cannot autogenerate them. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
ad540ce5e8
commit
ea813938a8
2 changed files with 38 additions and 99 deletions
|
@ -26,6 +26,18 @@ DiveField EditTagsTemplate<ID>::fieldId() const
|
|||
return ID;
|
||||
}
|
||||
|
||||
template <typename T, DiveField::Flags ID, T dive::*PTR>
|
||||
void EditDefaultSetter<T, ID, PTR>::set(struct dive *d, T v) const
|
||||
{
|
||||
d->*PTR = v;
|
||||
}
|
||||
|
||||
template <typename T, DiveField::Flags ID, T dive::*PTR>
|
||||
T EditDefaultSetter<T, ID, PTR>::data(struct dive *d) const
|
||||
{
|
||||
return d->*PTR;
|
||||
}
|
||||
|
||||
static std::vector<dive *> getDives(bool currentDiveOnly)
|
||||
{
|
||||
if (currentDiveOnly)
|
||||
|
@ -147,6 +159,8 @@ EditBase<QString>::EditBase(QString newValue, bool currentDiveOnly);
|
|||
template
|
||||
EditBase<int>::EditBase(int newValue, bool currentDiveOnly);
|
||||
template
|
||||
EditBase<bool>::EditBase(bool newValue, bool currentDiveOnly);
|
||||
template
|
||||
EditBase<struct dive_site *>::EditBase(struct dive_site *newValue, bool currentDiveOnly);
|
||||
|
||||
// Undo and redo do the same as just the stored value is exchanged
|
||||
|
@ -196,96 +210,36 @@ QString EditSuit::fieldName() const
|
|||
}
|
||||
|
||||
// ***** Rating *****
|
||||
void EditRating::set(struct dive *d, int value) const
|
||||
{
|
||||
d->rating = value;
|
||||
}
|
||||
|
||||
int EditRating::data(struct dive *d) const
|
||||
{
|
||||
return d->rating;
|
||||
}
|
||||
|
||||
QString EditRating::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("rating");
|
||||
}
|
||||
|
||||
// ***** Visibility *****
|
||||
void EditVisibility::set(struct dive *d, int value) const
|
||||
{
|
||||
d->visibility = value;
|
||||
}
|
||||
|
||||
int EditVisibility::data(struct dive *d) const
|
||||
{
|
||||
return d->visibility;
|
||||
}
|
||||
|
||||
QString EditVisibility::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("visibility");
|
||||
}
|
||||
|
||||
// ***** WaveSize *****
|
||||
void EditWaveSize::set(struct dive *d, int value) const
|
||||
{
|
||||
d->wavesize = value;
|
||||
}
|
||||
|
||||
int EditWaveSize::data(struct dive *d) const
|
||||
{
|
||||
return d->wavesize;
|
||||
}
|
||||
|
||||
QString EditWaveSize::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("wavesize");
|
||||
}
|
||||
|
||||
// ***** Current *****
|
||||
void EditCurrent::set(struct dive *d, int value) const
|
||||
{
|
||||
d->current = value;
|
||||
}
|
||||
|
||||
int EditCurrent::data(struct dive *d) const
|
||||
{
|
||||
return d->current;
|
||||
}
|
||||
|
||||
QString EditCurrent::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("current");
|
||||
}
|
||||
|
||||
// ***** Surge *****
|
||||
void EditSurge::set(struct dive *d, int value) const
|
||||
{
|
||||
d->surge = value;
|
||||
}
|
||||
|
||||
int EditSurge::data(struct dive *d) const
|
||||
{
|
||||
return d->surge;
|
||||
}
|
||||
|
||||
QString EditSurge::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("surge");
|
||||
}
|
||||
|
||||
// ***** Chill *****
|
||||
void EditChill::set(struct dive *d, int value) const
|
||||
{
|
||||
d->chill = value;
|
||||
}
|
||||
|
||||
int EditChill::data(struct dive *d) const
|
||||
{
|
||||
return d->chill;
|
||||
}
|
||||
|
||||
QString EditChill::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("chill");
|
||||
|
@ -507,16 +461,6 @@ QString EditMode::fieldName() const
|
|||
}
|
||||
|
||||
// ***** Invalid *****
|
||||
void EditInvalid::set(struct dive *d, int invalid) const
|
||||
{
|
||||
d->invalid = invalid;
|
||||
}
|
||||
|
||||
int EditInvalid::data(struct dive *d) const
|
||||
{
|
||||
return d->invalid;
|
||||
}
|
||||
|
||||
QString EditInvalid::fieldName() const
|
||||
{
|
||||
return Command::Base::tr("invalid");
|
||||
|
|
|
@ -74,6 +74,16 @@ private:
|
|||
DiveField fieldId() const override final; // final prevents further overriding - then just don't use this template
|
||||
};
|
||||
|
||||
// Automatically generate getter and setter in the case of simple assignments.
|
||||
// The third parameter is a pointer to a member of the dive structure.
|
||||
template <typename T, DiveField::Flags ID, T dive::*PTR>
|
||||
class EditDefaultSetter : public EditTemplate<T, ID> {
|
||||
private:
|
||||
using EditTemplate<T, ID>::EditTemplate;
|
||||
void set(struct dive *d, T) const override final; // final prevents further overriding - then just don't use this template
|
||||
T data(struct dive *d) const override final; // final prevents further overriding - then just don't use this template
|
||||
};
|
||||
|
||||
class EditNotes : public EditTemplate<QString, DiveField::NOTES> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
|
@ -90,52 +100,39 @@ public:
|
|||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditRating : public EditTemplate<int, DiveField::RATING> {
|
||||
class EditRating : public EditDefaultSetter<int, DiveField::RATING, &dive::rating> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditVisibility : public EditTemplate<int, DiveField::VISIBILITY> {
|
||||
class EditVisibility : public EditDefaultSetter<int, DiveField::VISIBILITY, &dive::visibility> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
|
||||
class EditWaveSize : public EditTemplate<int, DiveField::WAVESIZE> {
|
||||
class EditWaveSize : public EditDefaultSetter<int, DiveField::WAVESIZE, &dive::wavesize> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditCurrent : public EditTemplate<int, DiveField::CURRENT> {
|
||||
class EditCurrent : public EditDefaultSetter<int, DiveField::CURRENT, &dive::current> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditSurge : public EditTemplate<int, DiveField::SURGE> {
|
||||
class EditSurge : public EditDefaultSetter<int, DiveField::SURGE, &dive::surge> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditChill : public EditTemplate<int, DiveField::CHILL> {
|
||||
class EditChill : public EditDefaultSetter<int, DiveField::CHILL, &dive::chill> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int value) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
|
@ -219,11 +216,9 @@ public:
|
|||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
class EditInvalid : public EditTemplate<int, DiveField::INVALID> {
|
||||
class EditInvalid : public EditDefaultSetter<bool, DiveField::INVALID, &dive::invalid> {
|
||||
public:
|
||||
using EditTemplate::EditTemplate; // Use constructor of base class.
|
||||
void set(struct dive *d, int number) const override;
|
||||
int data(struct dive *d) const override;
|
||||
using EditDefaultSetter::EditDefaultSetter; // Use constructor of base class.
|
||||
QString fieldName() const override;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue