aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-10-21 23:10:08 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-10-25 13:59:04 -0700
commitc6188bbe47469d72bcb9afba69eb27fb39646cc1 (patch)
tree6d33cfcefedda699f396fe42f903321ec7a7ddab
parent4467477389cf0d6de8e3797b1941c07162896907 (diff)
downloadsubsurface-c6188bbe47469d72bcb9afba69eb27fb39646cc1.tar.gz
devices: connect DiveComputerModel to undo-command
Instead of modifying the device table directly, call the undo commands. Moreover, don't keep our own copy in the mode - show the original version. Connect to the appropriate signals. This means that the calls from the DiveComputerManagement dialog have to be removed, since this mode of editing is not supported. The whole dialog will be removed in a future commit. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--CHANGELOG.md1
-rw-r--r--desktop-widgets/divecomputermanagementdialog.cpp12
-rw-r--r--qt-models/divecomputermodel.cpp55
-rw-r--r--qt-models/divecomputermodel.h9
4 files changed, 36 insertions, 41 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 71ce9f2d4..a26e93c1c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+- desktop: make device management undoable
- desktop: fix crash on drag&drop into tag widgets [#3030]
- macOS: fix issue with HID dive computers like Suunto Eon Core/Steel [#2999]
- windows: add missing modern Vista theme
diff --git a/desktop-widgets/divecomputermanagementdialog.cpp b/desktop-widgets/divecomputermanagementdialog.cpp
index bfeddf24f..92f7c2096 100644
--- a/desktop-widgets/divecomputermanagementdialog.cpp
+++ b/desktop-widgets/divecomputermanagementdialog.cpp
@@ -36,22 +36,10 @@ DiveComputerManagementDialog *DiveComputerManagementDialog::instance()
void DiveComputerManagementDialog::tryRemove(const QModelIndex &index)
{
- if (index.column() != DiveComputerModel::REMOVE)
- return;
-
- QMessageBox::StandardButton response = QMessageBox::question(
- this, TITLE_OR_TEXT(
- tr("Remove the selected dive computer?"),
- tr("Are you sure that you want to \n remove the selected dive computer?")),
- QMessageBox::Ok | QMessageBox::Cancel);
-
- if (response == QMessageBox::Ok)
- model->remove(index);
}
void DiveComputerManagementDialog::accept()
{
- model->keepWorkingList();
hide();
close();
}
diff --git a/qt-models/divecomputermodel.cpp b/qt-models/divecomputermodel.cpp
index c51e19279..8cc87a2a7 100644
--- a/qt-models/divecomputermodel.cpp
+++ b/qt-models/divecomputermodel.cpp
@@ -1,13 +1,16 @@
// SPDX-License-Identifier: GPL-2.0
#include "qt-models/divecomputermodel.h"
+#include "commands/command.h"
#include "core/dive.h"
#include "core/divelist.h"
#include "core/subsurface-qt/divelistnotifier.h"
-DiveComputerModel::DiveComputerModel(QObject *parent) : CleanerTableModel(parent),
- dcs(device_table.devices)
+DiveComputerModel::DiveComputerModel(QObject *parent) : CleanerTableModel(parent)
{
connect(&diveListNotifier, &DiveListNotifier::dataReset, this, &DiveComputerModel::update);
+ connect(&diveListNotifier, &DiveListNotifier::deviceAdded, this, &DiveComputerModel::deviceAdded);
+ connect(&diveListNotifier, &DiveListNotifier::deviceDeleted, this, &DiveComputerModel::deviceDeleted);
+ connect(&diveListNotifier, &DiveListNotifier::deviceEdited, this, &DiveComputerModel::deviceEdited);
setHeaderDataStrings(QStringList() << "" << tr("Model") << tr("Device ID") << tr("Nickname"));
update();
}
@@ -15,15 +18,15 @@ DiveComputerModel::DiveComputerModel(QObject *parent) : CleanerTableModel(parent
void DiveComputerModel::update()
{
beginResetModel();
- dcs = device_table.devices;
endResetModel();
}
QVariant DiveComputerModel::data(const QModelIndex &index, int role) const
{
- if (index.row() < 0 || index.row() >= (int)dcs.size())
+ const device *dev = get_device(&device_table, index.row());
+ if (dev == nullptr)
return QVariant();
- const device &node = dcs[index.row()];
+ const device &node = *dev;
if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch (index.column()) {
@@ -51,7 +54,24 @@ QVariant DiveComputerModel::data(const QModelIndex &index, int role) const
int DiveComputerModel::rowCount(const QModelIndex&) const
{
- return dcs.size();
+ return (int)device_table.devices.size();
+}
+
+void DiveComputerModel::deviceAdded(int idx)
+{
+ beginInsertRows(QModelIndex(), idx, idx);
+ endInsertRows();
+}
+
+void DiveComputerModel::deviceDeleted(int idx)
+{
+ beginRemoveRows(QModelIndex(), idx, idx);
+ endRemoveRows();
+}
+
+void DiveComputerModel::deviceEdited(int idx)
+{
+ dataChanged(index(idx, REMOVE), index(idx, NICKNAME));
}
Qt::ItemFlags DiveComputerModel::flags(const QModelIndex &index) const
@@ -65,29 +85,16 @@ Qt::ItemFlags DiveComputerModel::flags(const QModelIndex &index) const
bool DiveComputerModel::setData(const QModelIndex &index, const QVariant &value, int)
{
// We should test if the role == Qt::EditRole
- if (index.row() < 0 || index.row() >= (int)dcs.size())
- return false;
-
- device &node = dcs[index.row()];
- node.nickName = value.toString().toStdString();
- emit dataChanged(index, index);
+ Command::editDeviceNickname(index.row(), value.toString());
return true;
}
void DiveComputerModel::remove(const QModelIndex &index)
{
- if (index.row() < 0 || index.row() >= (int)dcs.size())
+ int row = index.row();
+ if (row < 0 || row >= (int)device_table.devices.size())
return;
- beginRemoveRows(QModelIndex(), index.row(), index.row());
- dcs.erase(dcs.begin() + index.row());
- endRemoveRows();
-}
-
-void DiveComputerModel::keepWorkingList()
-{
- if (device_table.devices != dcs)
- mark_divelist_changed(true);
- device_table.devices = dcs;
+ Command::removeDevice(index.row());
}
// Convenience function to access alternative columns
@@ -129,5 +136,5 @@ void DiveComputerSortedModel::remove(const QModelIndex &index)
int row = mapToSource(index).row();
if (row < 0 || row >= (int)device_table.devices.size())
return;
- device_table.devices.erase(device_table.devices.begin() + row);
+ Command::removeDevice(row);
}
diff --git a/qt-models/divecomputermodel.h b/qt-models/divecomputermodel.h
index 17f145f78..a68542ff1 100644
--- a/qt-models/divecomputermodel.h
+++ b/qt-models/divecomputermodel.h
@@ -20,15 +20,14 @@ public:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
- void keepWorkingList();
-public
+private
slots:
void remove(const QModelIndex &index);
void update();
-
-private:
- std::vector<device> dcs;
+ void deviceAdded(int idx);
+ void deviceDeleted(int idx);
+ void deviceEdited(int idx);
};
class DiveComputerSortedModel : public QSortFilterProxyModel {