aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 {