diff options
-rw-r--r-- | desktop-widgets/divecomputermanagementdialog.cpp | 4 | ||||
-rw-r--r-- | desktop-widgets/divecomputermanagementdialog.h | 7 | ||||
-rw-r--r-- | qt-models/divecomputermodel.cpp | 34 | ||||
-rw-r--r-- | qt-models/divecomputermodel.h | 8 |
4 files changed, 50 insertions, 3 deletions
diff --git a/desktop-widgets/divecomputermanagementdialog.cpp b/desktop-widgets/divecomputermanagementdialog.cpp index f060e3715..bfeddf24f 100644 --- a/desktop-widgets/divecomputermanagementdialog.cpp +++ b/desktop-widgets/divecomputermanagementdialog.cpp @@ -20,7 +20,9 @@ DiveComputerManagementDialog::DiveComputerManagementDialog(QWidget *parent, Qt:: void DiveComputerManagementDialog::init() { model.reset(new DiveComputerModel); - ui.tableView->setModel(model.data()); + proxyModel.setSourceModel(model.get()); + ui.tableView->setModel(&proxyModel); + ui.tableView->setSortingEnabled(true); ui.tableView->resizeColumnsToContents(); ui.tableView->setColumnWidth(DiveComputerModel::REMOVE, 22); layout()->activate(); diff --git a/desktop-widgets/divecomputermanagementdialog.h b/desktop-widgets/divecomputermanagementdialog.h index 806ec8073..d80f8f9d3 100644 --- a/desktop-widgets/divecomputermanagementdialog.h +++ b/desktop-widgets/divecomputermanagementdialog.h @@ -1,9 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #ifndef DIVECOMPUTERMANAGEMENTDIALOG_H #define DIVECOMPUTERMANAGEMENTDIALOG_H -#include <QDialog> + #include "ui_divecomputermanagementdialog.h" #include "qt-models/divecomputermodel.h" +#include <QDialog> +#include <memory> class QModelIndex; @@ -23,7 +25,8 @@ slots: private: explicit DiveComputerManagementDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); Ui::DiveComputerManagementDialog ui; - QScopedPointer<DiveComputerModel> model; + std::unique_ptr<DiveComputerModel> model; + DiveComputerSortedModel proxyModel; }; #endif // DIVECOMPUTERMANAGEMENTDIALOG_H diff --git a/qt-models/divecomputermodel.cpp b/qt-models/divecomputermodel.cpp index 7c562c35c..dcac0a0dc 100644 --- a/qt-models/divecomputermodel.cpp +++ b/qt-models/divecomputermodel.cpp @@ -79,3 +79,37 @@ void DiveComputerModel::keepWorkingList() mark_divelist_changed(true); device_table.devices = dcs; } + +// Convenience function to access alternative columns +static QString getData(const QModelIndex &idx, int col) +{ + const QAbstractItemModel *model = idx.model(); + QModelIndex idx2 = model->index(idx.row(), col, idx.parent()); + return model->data(idx2).toString(); +} + +// Helper function: sort data pointed to by the given indexes. +// For equal data, sort by two alternative rows. +// All sorting is by case-insensitive string comparison. +static bool sortHelper(const QModelIndex &i1, const QModelIndex &i2, int altRow1, int altRow2) +{ + if(int cmp = i1.data().toString().compare(i2.data().toString())) + return cmp < 0; + if(int cmp = getData(i1, altRow1).compare(getData(i2, altRow1))) + return cmp < 0; + return getData(i1, altRow2).compare(getData(i2, altRow2)) < 0; +} + +bool DiveComputerSortedModel::lessThan(const QModelIndex &i1, const QModelIndex &i2) const +{ + // We assume that i1.column() == i2.column() + switch (i1.column()) { + case DiveComputerModel::ID: + return sortHelper(i1, i2, DiveComputerModel::MODEL, DiveComputerModel::NICKNAME); + case DiveComputerModel::MODEL: + default: + return sortHelper(i1, i2, DiveComputerModel::ID, DiveComputerModel::NICKNAME); + case DiveComputerModel::NICKNAME: + return sortHelper(i1, i2, DiveComputerModel::MODEL, DiveComputerModel::ID); + } +} diff --git a/qt-models/divecomputermodel.h b/qt-models/divecomputermodel.h index ab352513c..d50e1cd96 100644 --- a/qt-models/divecomputermodel.h +++ b/qt-models/divecomputermodel.h @@ -4,6 +4,7 @@ #include "qt-models/cleanertablemodel.h" #include "core/device.h" +#include <QSortFilterProxyModel> class DiveComputerModel : public CleanerTableModel { Q_OBJECT @@ -29,4 +30,11 @@ private: QVector<device> dcs; }; +class DiveComputerSortedModel : public QSortFilterProxyModel { +public: + using QSortFilterProxyModel::QSortFilterProxyModel; +private: + bool lessThan(const QModelIndex &i1, const QModelIndex &i2) const; +}; + #endif |