summaryrefslogtreecommitdiffstats
path: root/qt-models
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-03-12 23:51:39 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-04-12 18:19:07 +0300
commit0e1b0cf1da697851b0db4f8b860da8ac3a509d17 (patch)
treeeea365971c6f509121efcd0277f352c6c88a1f31 /qt-models
parent8e1f736d2b608784e1ea942ec8579d2361691c43 (diff)
downloadsubsurface-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.cpp32
-rw-r--r--qt-models/divelocationmodel.h5
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;