diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-29 14:54:39 +0900 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-05-29 20:10:20 +0900 |
commit | bb77f5a44e4c5d7a85e500437e69beb4ed38f264 (patch) | |
tree | 5c48c2d50799220b7d8a9eb97a5d9110e70e26bf | |
parent | 8df20f414966db685e4709eb101e071b4783c09f (diff) | |
download | subsurface-bb77f5a44e4c5d7a85e500437e69beb4ed38f264.tar.gz |
Add a "sort role" for sorting the dive list
By default, sorting is done by the display role, but then we end up
sorting by the string we display, which is almost always the wrong thing.
So this adds a new "SORT_ROLE" that is used for sorting, and then the
data lookup can return the raw data we want to sort by.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | qt-ui/divelistview.cpp | 1 | ||||
-rw-r--r-- | qt-ui/models.cpp | 27 | ||||
-rw-r--r-- | qt-ui/models.h | 2 |
3 files changed, 29 insertions, 1 deletions
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 948bfa57a..0e3f62793 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -21,6 +21,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setUniformRowHeights(true); setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate()); QSortFilterProxyModel *model = new QSortFilterProxyModel(this); + model->setSortRole(TreeItemDT::SORT_ROLE); setModel(model); setSortingEnabled(false); header()->setContextMenuPolicy(Qt::ActionsContextMenu); diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 98a84d7f9..ff8cb5eaf 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -822,6 +822,9 @@ QVariant TripItem::data(int column, int role) const { QVariant ret; + if (role == SORT_ROLE) + return (qulonglong)trip->when; + if (role == Qt::DisplayRole) { switch (column) { case LOCATION: @@ -848,6 +851,13 @@ struct DiveItem : public TreeItemDT { int weight() const; }; +static int nitrox_sort_value(struct dive *dive) +{ + int o2, he, o2low; + get_dive_gas(dive, &o2, &he, &o2low); + return he*1000 + o2; +} + QVariant DiveItem::data(int column, int role) const { QVariant retVal; @@ -865,6 +875,23 @@ QVariant DiveItem::data(int column, int role) const break; } break; + case SORT_ROLE: + switch (column) { + case NR: return dive->number; + case DATE: return (qulonglong) dive->when; + case DEPTH: return dive->maxdepth.mm; + case DURATION: return dive->duration.seconds; + case TEMPERATURE: return dive->watertemp.mkelvin; + case TOTALWEIGHT: return total_weight(dive); + case SUIT: return QString(dive->suit); + case CYLINDER: return QString(dive->cylinder[0].type.description); + case NITROX: return nitrox_sort_value(dive); + case SAC: return dive->sac; + case OTU: return dive->otu; + case MAXCNS: return dive->maxcns; + case LOCATION: return QString(dive->location); + } + break; case Qt::DisplayRole: switch (column) { case NR: diff --git a/qt-ui/models.h b/qt-ui/models.h index b4eb8d953..99d028aca 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -124,7 +124,7 @@ public: enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT, SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS }; - enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE}; + enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, SORT_ROLE}; virtual ~TreeItemDT(); int columnCount() const { |