Undo: implement undo of dive site country editing

Simply copy the code of notes editing, but use the taxonomy_* functions
to read and set the value. Moreover, replace the three TAXONOMY_n field
ids by a single TAXONOMY id. We will probably never show one column per
taxonomy field, but rather a single column with a string derived from all
taxonomy fields.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-03-14 08:26:50 +01:00 committed by Dirk Hohndel
parent 4d183e0d75
commit 021aa4bd57
8 changed files with 54 additions and 20 deletions

View file

@ -98,6 +98,11 @@ void editDiveSiteNotes(dive_site *ds, const QString &value)
execute(new EditDiveSiteNotes(ds, value)); execute(new EditDiveSiteNotes(ds, value));
} }
void editDiveSiteCountry(dive_site *ds, const QString &value)
{
execute(new EditDiveSiteCountry(ds, value));
}
void addDiveSite(const QString &name) void addDiveSite(const QString &name)
{ {
execute(new AddDiveSite(name)); execute(new AddDiveSite(name));

View file

@ -44,6 +44,7 @@ void deleteDiveSites(const QVector <dive_site *> &sites);
void editDiveSiteName(dive_site *ds, const QString &value); void editDiveSiteName(dive_site *ds, const QString &value);
void editDiveSiteDescription(dive_site *ds, const QString &value); void editDiveSiteDescription(dive_site *ds, const QString &value);
void editDiveSiteNotes(dive_site *ds, const QString &value); void editDiveSiteNotes(dive_site *ds, const QString &value);
void editDiveSiteCountry(dive_site *ds, const QString &value);
void addDiveSite(const QString &name); void addDiveSite(const QString &name);
} // namespace Command } // namespace Command

View file

@ -4,6 +4,7 @@
#include "core/divesite.h" #include "core/divesite.h"
#include "core/subsurface-qt/DiveListNotifier.h" #include "core/subsurface-qt/DiveListNotifier.h"
#include "core/qthelper.h" #include "core/qthelper.h"
#include "core/subsurface-string.h"
#include "qt-models/divelocationmodel.h" #include "qt-models/divelocationmodel.h"
namespace Command { namespace Command {
@ -182,4 +183,29 @@ void EditDiveSiteNotes::undo()
redo(); redo();
} }
EditDiveSiteCountry::EditDiveSiteCountry(dive_site *dsIn, const QString &country) : ds(dsIn),
value(country)
{
setText(tr("Edit dive site country"));
}
bool EditDiveSiteCountry::workToBeDone()
{
return !same_string(qPrintable(value), taxonomy_get_country(&ds->taxonomy));
}
void EditDiveSiteCountry::redo()
{
QString old = taxonomy_get_country(&ds->taxonomy);
taxonomy_set_country(&ds->taxonomy, copy_qstring(value), taxonomy_origin::GEOMANUAL);
value = old;
emit diveListNotifier.diveSiteChanged(ds, LocationInformationModel::TAXONOMY); // Inform frontend of changed dive site.
}
void EditDiveSiteCountry::undo()
{
// Undo and redo do the same
redo();
}
} // namespace Command } // namespace Command

View file

@ -79,6 +79,19 @@ private:
QString value; // Value to be set QString value; // Value to be set
}; };
class EditDiveSiteCountry : public Base {
public:
EditDiveSiteCountry(dive_site *ds, const QString &country);
private:
bool workToBeDone() override;
void undo() override;
void redo() override;
dive_site *ds;
QString value; // Value to be set
};
} // namespace Command } // namespace Command
#endif // COMMAND_DIVESITE_H #endif // COMMAND_DIVESITE_H

View file

@ -139,6 +139,9 @@ void LocationInformationWidget::diveSiteChanged(struct dive_site *ds, int field)
case LocationInformationModel::NOTES: case LocationInformationModel::NOTES:
ui.diveSiteNotes->setText(diveSite->notes); ui.diveSiteNotes->setText(diveSite->notes);
return; return;
case LocationInformationModel::TAXONOMY:
ui.diveSiteCountry->setText(taxonomy_get_country(&diveSite->taxonomy));
return;
default: default:
return; return;
} }
@ -183,18 +186,6 @@ void LocationInformationWidget::acceptChanges()
return; return;
} }
char *uiString;
uiString = copy_qstring(ui.diveSiteCountry->text());
// if the user entered a different country, first update the local taxonomy
// this below will get copied into the diveSite
if (!same_string(uiString, taxonomy_get_country(&taxonomy)) &&
!empty_string(uiString))
taxonomy_set_country(&taxonomy, uiString, taxonomy_origin::GEOMANUAL);
else
free(uiString);
// now update the diveSite
copy_taxonomy(&taxonomy, &diveSite->taxonomy);
if (!ui.diveSiteCoordinates->text().isEmpty()) if (!ui.diveSiteCoordinates->text().isEmpty())
parseGpsText(ui.diveSiteCoordinates->text(), diveSite->location); parseGpsText(ui.diveSiteCoordinates->text(), diveSite->location);
mark_divelist_changed(true); mark_divelist_changed(true);
@ -277,10 +268,10 @@ void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString
} }
} }
void LocationInformationWidget::on_diveSiteCountry_textChanged(const QString& text) void LocationInformationWidget::on_diveSiteCountry_editingFinished()
{ {
if (!same_string(qPrintable(text), taxonomy_get_country(&taxonomy))) if (diveSite)
markChangedWidget(ui.diveSiteCountry); Command::editDiveSiteCountry(diveSite, ui.diveSiteCountry->text());
} }
void LocationInformationWidget::on_diveSiteDescription_editingFinished() void LocationInformationWidget::on_diveSiteDescription_editingFinished()

View file

@ -29,7 +29,7 @@ public slots:
void enableEdition(); void enableEdition();
void resetState(); void resetState();
void resetPallete(); void resetPallete();
void on_diveSiteCountry_textChanged(const QString& text); void on_diveSiteCountry_editingFinished();
void on_diveSiteCoordinates_textChanged(const QString& text); void on_diveSiteCoordinates_textChanged(const QString& text);
void on_diveSiteDescription_editingFinished(); void on_diveSiteDescription_editingFinished();
void on_diveSiteName_editingFinished(); void on_diveSiteName_editingFinished();

View file

@ -97,9 +97,7 @@ QVariant LocationInformationModel::getDiveSiteData(const struct dive_site *ds, i
case COORDS: return "TODO"; case COORDS: return "TODO";
case DESCRIPTION: return ds->description; case DESCRIPTION: return ds->description;
case NOTES: return ds->name; case NOTES: return ds->name;
case TAXONOMY_1: return "TODO"; case TAXONOMY: return "TODO";
case TAXONOMY_2: return "TODO";
case TAXONOMY_3: return "TODO";
} }
break; break;
case Qt::ToolTipRole: case Qt::ToolTipRole:

View file

@ -17,7 +17,7 @@ class LocationInformationModel : public QAbstractTableModel {
public: public:
// Common columns, roles and accessor function for all dive-site models. // Common columns, roles and accessor function for all dive-site models.
// Thus, different views can connect to different models. // Thus, different views can connect to different models.
enum Columns { REMOVE, NAME, DESCRIPTION, NUM_DIVES, COORDS, NOTES, LATITUDE, LONGITUDE, DIVESITE, TAXONOMY_1, TAXONOMY_2, TAXONOMY_3, COLUMNS}; enum Columns { REMOVE, NAME, DESCRIPTION, NUM_DIVES, COORDS, NOTES, LATITUDE, LONGITUDE, DIVESITE, TAXONOMY, COLUMNS};
enum Roles { DIVESITE_ROLE = Qt::UserRole + 1 }; enum Roles { DIVESITE_ROLE = Qt::UserRole + 1 };
static QVariant getDiveSiteData(const struct dive_site *ds, int column, int role); static QVariant getDiveSiteData(const struct dive_site *ds, int column, int role);