diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-03-12 23:51:39 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-04-12 18:19:07 +0300 |
commit | 0e1b0cf1da697851b0db4f8b860da8ac3a509d17 (patch) | |
tree | eea365971c6f509121efcd0277f352c6c88a1f31 /qt-models | |
parent | 8e1f736d2b608784e1ea942ec8579d2361691c43 (diff) | |
download | subsurface-0e1b0cf1da697851b0db4f8b860da8ac3a509d17.tar.gz |
Undo: Implement undo of dive site name editing
Implement an undo command that edits the name of a dive site.
Connect it to the dive site table, so that names can be edited
directly in the table.
Send signals on undo / redo so that the dive site table and
the dive site edit widget can be updated.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/divelocationmodel.cpp | 32 | ||||
-rw-r--r-- | qt-models/divelocationmodel.h | 5 |
2 files changed, 35 insertions, 2 deletions
diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp index ebdffc185..c64d1990a 100644 --- a/qt-models/divelocationmodel.cpp +++ b/qt-models/divelocationmodel.cpp @@ -26,6 +26,7 @@ LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTabl connect(&diveListNotifier, &DiveListNotifier::diveSiteDiveCountChanged, this, &LocationInformationModel::diveSiteDiveCountChanged); connect(&diveListNotifier, &DiveListNotifier::diveSiteAdded, this, &LocationInformationModel::diveSiteAdded); connect(&diveListNotifier, &DiveListNotifier::diveSiteDeleted, this, &LocationInformationModel::diveSiteDeleted); + connect(&diveListNotifier, &DiveListNotifier::diveSiteChanged, this, &LocationInformationModel::diveSiteChanged); } int LocationInformationModel::columnCount(const QModelIndex &) const @@ -173,6 +174,14 @@ void LocationInformationModel::diveSiteDeleted(struct dive_site *, int idx) endRemoveRows(); } +void LocationInformationModel::diveSiteChanged(struct dive_site *ds, int field) +{ + int idx = get_divesite_idx(ds, &dive_site_table); + if (idx < 0) + return; + dataChanged(createIndex(idx, field), createIndex(idx, field)); +} + bool DiveSiteSortedModel::filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const { // TODO: filtering @@ -223,14 +232,33 @@ QStringList DiveSiteSortedModel::allSiteNames() const return locationNames; } +struct dive_site *DiveSiteSortedModel::getDiveSite(const QModelIndex &idx) +{ + return get_dive_site(mapToSource(idx).row(), &dive_site_table); +} + #ifndef SUBSURFACE_MOBILE +bool DiveSiteSortedModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + struct dive_site *ds = getDiveSite(index); + if (!ds || value.isNull()) + return false; + switch (index.column()) { + case LocationInformationModel::NAME: + Command::editDiveSiteName(ds, value.toString()); + return true; + default: + return false; + } +} + // TODO: Remove from model. It doesn't make sense to call the model here, which calls the undo command, // which in turn calls the model. void DiveSiteSortedModel::remove(const QModelIndex &index) { if (index.column() != LocationInformationModel::REMOVE) return; - struct dive_site *ds = get_dive_site(mapToSource(index).row(), &dive_site_table); + struct dive_site *ds = getDiveSite(index); if (!ds) return; if (ds->dives.nr > 0 && @@ -240,7 +268,7 @@ void DiveSiteSortedModel::remove(const QModelIndex &index) return; Command::deleteDiveSites(QVector<dive_site *>{ds}); } -#endif +#endif // SUBSURFACE_MOBILE GeoReferencingOptionsModel *GeoReferencingOptionsModel::instance() { diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h index 34ac34c04..4fd7b3d36 100644 --- a/qt-models/divelocationmodel.h +++ b/qt-models/divelocationmodel.h @@ -35,15 +35,20 @@ public slots: void diveSiteDiveCountChanged(struct dive_site *ds); void diveSiteAdded(struct dive_site *ds, int idx); void diveSiteDeleted(struct dive_site *ds, int idx); + void diveSiteChanged(struct dive_site *ds, int field); }; class DiveSiteSortedModel : public QSortFilterProxyModel { Q_OBJECT private: + struct dive_site *getDiveSite(const QModelIndex &idx); bool filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const override; bool lessThan(const QModelIndex &i1, const QModelIndex &i2) const override; +#ifndef SUBSURFACE_MOBILE + bool setData(const QModelIndex &index, const QVariant &value, int role) override; public slots: void remove(const QModelIndex &index); +#endif // SUBSURFACE_MOBILE public: DiveSiteSortedModel(); QStringList allSiteNames() const; |