[PATCH] Add a "sort role" for sorting the dive list

Dirk Hohndel dirk at hohndel.org
Wed May 29 03:55:58 PDT 2013


I am just now pulling Tomaz' latest changes - I'll see how they stack up
with your work and then figure out what to do :-)

/D

On Wed, 2013-05-29 at 19:53 +0900, Linus Torvalds wrote:
> From: Linus Torvalds <torvalds at linux-foundation.org>
> Date: Wed, 29 May 2013 14:54:39 +0900
> Subject: [PATCH] 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 at linux-foundation.org>
> ---
> 
> This gets the sorting *within* a trip right. However, it doesn't discard 
> the trip data when sorting by non-date, so it's not all that useful, but 
> even just sorting the trips themselves by date helps a lot.
> 
>   qt-ui/divelistview.cpp |  1 +
>   qt-ui/models.cpp       | 27 +++++++++++++++++++++++++++
>   qt-ui/models.h         |  2 +-
>   3 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp
> index 4957e33745b2..4bee0195632c 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);
>   	header()->setContextMenuPolicy(Qt::ActionsContextMenu);
>   }
> diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
> index 38ef8938cbfd..0dfb504c43a4 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 f51566c1b044..f6022c4348ef 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 {




More information about the subsurface mailing list