Undo: implement undo of rating and visibility rating

This was rather trivial and modeled after the previous edit
UndoCommands. Since this is the first time we're editing
integers a new constructor instantiation had to be added.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-01-28 22:35:07 +01:00 committed by Dirk Hohndel
parent 512a2e6b68
commit 42cfd3f963
5 changed files with 86 additions and 16 deletions

View file

@ -145,4 +145,14 @@ void editSuit(const QVector<dive *> dives, const QString &newValue, const QStrin
execute(new EditSuit(dives, newValue, oldValue));
}
void editRating(const QVector<dive *> dives, int newValue, int oldValue)
{
execute(new EditRating(dives, newValue, oldValue));
}
void editVisibility(const QVector<dive *> dives, int newValue, int oldValue)
{
execute(new EditVisibility(dives, newValue, oldValue));
}
} // namespace Command

View file

@ -55,6 +55,8 @@ void purgeUnusedDiveSites();
void editNotes(const QVector<dive *> dives, const QString &newValue, const QString &oldValue);
void editSuit(const QVector<dive *> dives, const QString &newValue, const QString &oldValue);
void editMode(const QVector<dive *> dives, int index, int newValue, int oldValue);
void editRating(const QVector<dive *> dives, int newValue, int oldValue);
void editVisibility(const QVector<dive *> dives, int newValue, int oldValue);
} // namespace Command

View file

@ -68,6 +68,8 @@ void EditBase<T>::undo()
// class by virtue of a "using" declaration.
template
EditBase<QString>::EditBase(const QVector<dive *> &dives, QString oldValue, QString newValue);
template
EditBase<int>::EditBase(const QVector<dive *> &dives, int oldValue, int newValue);
// Undo and redo do the same as just the stored value is exchanged
template<typename T>
@ -122,6 +124,48 @@ DiveField EditSuit::fieldId() const
return DiveField::SUIT;
}
// ***** 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 tr("rating");
}
DiveField EditRating::fieldId() const
{
return DiveField::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 tr("visibility");
}
DiveField EditVisibility::fieldId() const
{
return DiveField::VISIBILITY;
}
// ***** Mode *****
// Editing the dive mode has very peculiar semantics for historic reasons:
// Since the dive-mode depends on the dive computer, the i-th dive computer

View file

@ -65,6 +65,24 @@ public:
DiveField fieldId() const override;
};
class EditRating : public EditBase<int> {
public:
using EditBase<int>::EditBase; // Use constructor of base class.
void set(struct dive *d, int value) const override;
int data(struct dive *d) const override;
QString fieldName() const override;
DiveField fieldId() const override;
};
class EditVisibility : public EditBase<int> {
public:
using EditBase<int>::EditBase; // Use constructor of base class.
void set(struct dive *d, int value) const override;
int data(struct dive *d) const override;
QString fieldName() const override;
DiveField fieldId() const override;
};
class EditMode : public EditBase<int> {
int index;
public:

View file

@ -342,6 +342,12 @@ void MainTab::divesEdited(const QVector<dive *> &, DiveField field)
return;
switch(field) {
case DiveField::RATING:
ui.rating->setCurrentStars(current_dive->rating);
break;
case DiveField::VISIBILITY:
ui.visibility->setCurrentStars(current_dive->visibility);
break;
case DiveField::SUIT:
ui.suit->setText(QString(current_dive->suit));
break;
@ -798,10 +804,6 @@ void MainTab::acceptChanges()
struct dive *cd = current_dive;
// now check if something has changed and if yes, edit the selected dives that
// were identical with the master dive shown (and mark the divelist as changed)
if (displayed_dive.rating != cd->rating)
MODIFY_DIVES(selectedDives, EDIT_VALUE(rating));
if (displayed_dive.visibility != cd->visibility)
MODIFY_DIVES(selectedDives, EDIT_VALUE(visibility));
if (displayed_dive.airtemp.mkelvin != cd->airtemp.mkelvin)
MODIFY_DIVES(selectedDives, EDIT_VALUE(airtemp.mkelvin));
if (displayed_dive.watertemp.mkelvin != cd->watertemp.mkelvin)
@ -1378,24 +1380,18 @@ void MainTab::on_notes_editingFinished()
void MainTab::on_rating_valueChanged(int value)
{
if (acceptingEdit == true)
if (acceptingEdit == true || !current_dive)
return;
if (displayed_dive.rating != value) {
displayed_dive.rating = value;
modified = true;
enableEdition();
}
Command::editRating(getSelectedDivesCurrentLast(), value, current_dive->rating);
}
void MainTab::on_visibility_valueChanged(int value)
{
if (acceptingEdit == true)
if (acceptingEdit == true || !current_dive)
return;
if (displayed_dive.visibility != value) {
displayed_dive.visibility = value;
modified = true;
enableEdition();
}
Command::editVisibility(getSelectedDivesCurrentLast(), value, current_dive->visibility);
}
#undef MODIFY_DIVES