1 /***************************************************************************
2                              qgstreewidgetitem.cpp
3                              ---------------------
4     begin                : 06 Nov, 2005
5     copyright            : (C) 2005 by Brendan Morley
6     email                : morb at ozemail dot com dot au
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgstreewidgetitem.h"
19 #include "qgis.h"
20 
QgsTreeWidgetItem(QTreeWidget * parent,int type)21 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidget *parent, int type )
22   : QTreeWidgetItem( parent, type )
23 {}
24 
QgsTreeWidgetItem(int type)25 QgsTreeWidgetItem::QgsTreeWidgetItem( int type )
26   : QTreeWidgetItem( type )
27 {}
28 
QgsTreeWidgetItem(const QStringList & strings,int type)29 QgsTreeWidgetItem::QgsTreeWidgetItem( const QStringList &strings, int type )
30   : QTreeWidgetItem( strings, type )
31 {}
32 
QgsTreeWidgetItem(QTreeWidget * view,const QStringList & strings,int type)33 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidget *view, const QStringList &strings, int type )
34   : QTreeWidgetItem( view, strings, type )
35 {}
36 
QgsTreeWidgetItem(QTreeWidget * view,QTreeWidgetItem * after,int type)37 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidget *view, QTreeWidgetItem *after, int type )
38   : QTreeWidgetItem( view, after, type )
39 {}
40 
QgsTreeWidgetItem(QTreeWidgetItem * parent,int type)41 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidgetItem *parent, int type )
42   : QTreeWidgetItem( parent, type )
43 {}
44 
QgsTreeWidgetItem(QTreeWidgetItem * parent,const QStringList & strings,int type)45 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidgetItem *parent, const QStringList &strings, int type )
46   : QTreeWidgetItem( parent, strings, type )
47 {}
48 
QgsTreeWidgetItem(QTreeWidgetItem * parent,QTreeWidgetItem * after,int type)49 QgsTreeWidgetItem::QgsTreeWidgetItem( QTreeWidgetItem *parent, QTreeWidgetItem *after, int type )
50   : QTreeWidgetItem( parent, after, type )
51 {}
52 
setSortData(int column,const QVariant & value)53 void QgsTreeWidgetItem::setSortData( int column, const QVariant &value )
54 {
55   setData( column, CustomSortRole, value );
56 }
57 
sortData(int column) const58 QVariant QgsTreeWidgetItem::sortData( int column ) const
59 {
60   return data( column, CustomSortRole );
61 }
62 
setAlwaysOnTopPriority(int priority)63 void QgsTreeWidgetItem::setAlwaysOnTopPriority( int priority )
64 {
65   setData( 0, AlwaysOnTopPriorityRole, priority );
66 }
67 
alwaysOnTopPriority() const68 int QgsTreeWidgetItem::alwaysOnTopPriority() const
69 {
70   const QVariant val = data( 0, AlwaysOnTopPriorityRole );
71   return val.isValid() ? val.toInt() : -1;
72 }
73 
operator <(const QTreeWidgetItem & other) const74 bool QgsTreeWidgetItem::operator<( const QTreeWidgetItem &other ) const
75 {
76   const int column = treeWidget()->sortColumn();
77 
78   // check always on top priority - note - no way of determining sort order from tree widget, so
79   // these will sometimes be incorrectly placed at the bottom
80   const QVariant priority1 = data( 0, AlwaysOnTopPriorityRole );
81   const QVariant priority2 = other.data( 0, AlwaysOnTopPriorityRole );
82   if ( priority1.isValid() && priority2.isValid() )
83   {
84     const int i1 = priority1.toInt();
85     const int i2 = priority2.toInt();
86     if ( i1 != i2 )
87       return priority1.toInt() < priority2.toInt();
88   }
89   else if ( priority1.isValid() )
90   {
91     return true;
92   }
93   else if ( priority2.isValid() )
94   {
95     return false;
96   }
97 
98   // no always on top priorities, check data
99   bool ok1, ok2, val;
100 
101   // prefer the custom sort role, but fall back to display text
102   QVariant val1 = data( column, CustomSortRole );
103   if ( !val1.isValid() )
104     val1 = text( column );
105   QVariant val2 = other.data( column, CustomSortRole );
106   if ( !val2.isValid() )
107     val2 = other.text( column );
108 
109   if ( !val1.isNull() && !val2.isNull() )
110   {
111     val = val1.toDouble( &ok1 ) < val2.toDouble( &ok2 );
112     if ( ok1 && ok2 )
113     {
114       return val;
115     }
116     else if ( ok1 || ok2 )
117     {
118       // sort numbers before strings
119       return ok1;
120     }
121   }
122 
123   return qgsVariantLessThan( val1, val2 );
124 }
125 
126 //
127 // QgsTreeWidgetItemObject
128 //
129 
QgsTreeWidgetItemObject(int type)130 QgsTreeWidgetItemObject::QgsTreeWidgetItemObject( int type )
131   : QgsTreeWidgetItem( type )
132 {}
133 
QgsTreeWidgetItemObject(QTreeWidget * parent,int type)134 QgsTreeWidgetItemObject::QgsTreeWidgetItemObject( QTreeWidget *parent, int type )
135   : QgsTreeWidgetItem( parent, type )
136 {}
137 
138 // override setData to emit signal when edited. By default the itemChanged signal fires way too often
setData(int column,int role,const QVariant & value)139 void QgsTreeWidgetItemObject::setData( int column, int role, const QVariant &value )
140 {
141   QgsTreeWidgetItem::setData( column, role, value );
142   if ( role == Qt::EditRole )
143   {
144     emit itemEdited( this, column );
145   }
146 }
147