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