summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2013-05-29 14:54:39 +0900
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-05-29 20:10:20 +0900
commitbb77f5a44e4c5d7a85e500437e69beb4ed38f264 (patch)
tree5c48c2d50799220b7d8a9eb97a5d9110e70e26bf
parent8df20f414966db685e4709eb101e071b4783c09f (diff)
downloadsubsurface-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.cpp1
-rw-r--r--qt-ui/models.cpp27
-rw-r--r--qt-ui/models.h2
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 {