Skip to content

Commit a1a1fb7

Browse files
committedNov 18, 2012
graduated renderer GUI DnD and sort; categorized symbol GUI better drop indicator
1 parent ba0cd0c commit a1a1fb7

8 files changed

+513
-74
lines changed
 

‎python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class QgsGraduatedSymbolRendererV2Widget : QgsRendererV2Widget
2222

2323
/**Adds a class manually to the classification*/
2424
void addClass();
25-
/**Removes a class from the classification*/
26-
void deleteCurrentClass();
25+
/**Removes selected classes*/
26+
void deleteClasses();
2727

2828
void rotationFieldChanged( QString fldName );
2929
void sizeScaleFieldChanged( QString fldName );
@@ -39,9 +39,6 @@ class QgsGraduatedSymbolRendererV2Widget : QgsRendererV2Widget
3939
//! populate column combos in categorized and graduated page
4040
void populateColumns();
4141

42-
//! populate ranges of graduated symbol renderer
43-
void populateRanges();
44-
4542
void changeRangeSymbol( int rangeIdx );
4643
void changeRange( int rangeIdx );
4744

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
#include <cmath> // for pretty classification
3131
#include <ctime>
3232

33+
QgsRendererRangeV2::QgsRendererRangeV2()
34+
: mLowerValue( 0 ), mUpperValue( 0 ), mSymbol( 0 ), mLabel()
35+
{
36+
}
37+
3338
QgsRendererRangeV2::QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label )
3439
: mLowerValue( lowerValue )
3540
, mUpperValue( upperValue )
@@ -51,6 +56,19 @@ QgsRendererRangeV2::~QgsRendererRangeV2()
5156
delete mSymbol;
5257
}
5358

59+
QgsRendererRangeV2& QgsRendererRangeV2::operator=( const QgsRendererRangeV2 & range )
60+
{
61+
mLowerValue = range.mLowerValue;
62+
mUpperValue = range.mUpperValue;
63+
mLabel = range.mLabel;
64+
mSymbol = 0;
65+
if ( range.mSymbol )
66+
{
67+
mSymbol = range.mSymbol->clone();
68+
}
69+
return *this;
70+
}
71+
5472
double QgsRendererRangeV2::lowerValue() const
5573
{
5674
return mLowerValue;
@@ -1117,3 +1135,60 @@ void QgsGraduatedSymbolRendererV2::deleteClass( int idx )
11171135
{
11181136
mRanges.removeAt( idx );
11191137
}
1138+
1139+
void QgsGraduatedSymbolRendererV2::deleteAllClasses()
1140+
{
1141+
mRanges.clear();
1142+
}
1143+
1144+
void QgsGraduatedSymbolRendererV2::moveClass( int from, int to )
1145+
{
1146+
if ( from < 0 || from >= mRanges.size() || to < 0 || to >= mRanges.size() ) return;
1147+
mRanges.move( from, to );
1148+
}
1149+
1150+
bool valueLessThan( const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2 )
1151+
{
1152+
return r1.lowerValue() < r2.lowerValue();
1153+
}
1154+
1155+
bool valueGreaterThan( const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2 )
1156+
{
1157+
return !valueLessThan( r1, r2 );
1158+
}
1159+
1160+
void QgsGraduatedSymbolRendererV2::sortByValue( Qt::SortOrder order )
1161+
{
1162+
QgsDebugMsg( "Entered" );
1163+
if ( order == Qt::AscendingOrder )
1164+
{
1165+
qSort( mRanges.begin(), mRanges.end(), valueLessThan );
1166+
}
1167+
else
1168+
{
1169+
qSort( mRanges.begin(), mRanges.end(), valueGreaterThan );
1170+
}
1171+
}
1172+
1173+
bool labelLessThan( const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2 )
1174+
{
1175+
return QString::localeAwareCompare( r1.label(), r2.label() ) < 0;
1176+
}
1177+
1178+
bool labelGreaterThan( const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2 )
1179+
{
1180+
return !labelLessThan( r1, r2 );
1181+
}
1182+
1183+
void QgsGraduatedSymbolRendererV2::sortByLabel( Qt::SortOrder order )
1184+
{
1185+
if ( order == Qt::AscendingOrder )
1186+
{
1187+
qSort( mRanges.begin(), mRanges.end(), labelLessThan );
1188+
}
1189+
else
1190+
{
1191+
qSort( mRanges.begin(), mRanges.end(), labelGreaterThan );
1192+
}
1193+
}
1194+

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@
2121
class CORE_EXPORT QgsRendererRangeV2
2222
{
2323
public:
24+
QgsRendererRangeV2();
2425
QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label );
2526
QgsRendererRangeV2( const QgsRendererRangeV2& range );
2627

2728
~QgsRendererRangeV2();
2829

30+
QgsRendererRangeV2& operator=( const QgsRendererRangeV2& range );
31+
2932
double lowerValue() const;
3033
double upperValue() const;
3134

@@ -92,6 +95,13 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
9295

9396
void addClass( QgsSymbolV2* symbol );
9497
void deleteClass( int idx );
98+
void deleteAllClasses();
99+
100+
//! Moves the category at index position from to index position to.
101+
void moveClass( int from, int to );
102+
103+
void sortByValue( Qt::SortOrder order = Qt::AscendingOrder );
104+
void sortByLabel( Qt::SortOrder order = Qt::AscendingOrder );
95105

96106
enum Mode
97107
{

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#include <QMessageBox>
3333
#include <QStandardItemModel>
3434
#include <QStandardItem>
35+
#include <QPen>
36+
#include <QPainter>
3537

3638
QgsCategorizedSymbolRendererV2Model::QgsCategorizedSymbolRendererV2Model( QObject * parent ) : QAbstractItemModel( parent )
3739
, mRenderer( 0 )
@@ -236,6 +238,9 @@ bool QgsCategorizedSymbolRendererV2Model::dropMimeData( const QMimeData *data, Q
236238
}
237239

238240
int to = parent.row();
241+
// to is -1 if dragged outside items, i.e. below any item,
242+
// then move to the last position
243+
if ( to == -1 ) to = mRenderer->categories().size(); // out of rang ok, will be decreased
239244
for ( int i = rows.size() - 1; i >= 0; i-- )
240245
{
241246
QgsDebugMsg( QString( "move %1 to %2" ).arg( rows[i] ).arg( to ) );
@@ -292,6 +297,27 @@ void QgsCategorizedSymbolRendererV2Model::sort( int column, Qt::SortOrder order
292297
QgsDebugMsg( "Done" );
293298
}
294299

300+
// ------------------------------ View style --------------------------------
301+
QgsCategorizedSymbolRendererV2ViewStyle::QgsCategorizedSymbolRendererV2ViewStyle( QStyle* style )
302+
: QProxyStyle( style )
303+
{}
304+
305+
void QgsCategorizedSymbolRendererV2ViewStyle::drawPrimitive( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget ) const
306+
{
307+
if ( element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull() )
308+
{
309+
QStyleOption opt( *option );
310+
opt.rect.setLeft( 0 );
311+
// draw always as line above, because we move item to that index
312+
opt.rect.setHeight( 0 );
313+
if ( widget ) opt.rect.setRight( widget->width() );
314+
QProxyStyle::drawPrimitive( element, &opt, painter, widget );
315+
return;
316+
}
317+
QProxyStyle::drawPrimitive( element, option, painter, widget );
318+
}
319+
320+
// ------------------------------ Widget ------------------------------------
295321
QgsRendererV2Widget* QgsCategorizedSymbolRendererV2Widget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
296322
{
297323
return new QgsCategorizedSymbolRendererV2Widget( layer, style, renderer );
@@ -343,6 +369,8 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV
343369
viewCategories->resizeColumnToContents( 1 );
344370
viewCategories->resizeColumnToContents( 2 );
345371

372+
viewCategories->setStyle( new QgsCategorizedSymbolRendererV2ViewStyle( viewCategories->style() ) );
373+
346374
mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() );
347375

348376
connect( mModel, SIGNAL( rowsMoved() ), this, SLOT( rowsMoved() ) );

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgscategorizedsymbolrendererv2.h"
1919
#include "qgsrendererv2widget.h"
2020
#include <QStandardItem>
21+
#include <QProxyStyle>
2122

2223
class QgsCategorizedSymbolRendererV2;
2324
class QgsRendererCategoryV2;
@@ -57,6 +58,15 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Model : public QAbstractItemModel
5758
QString mMimeFormat;
5859
};
5960

61+
// View style which shows drop indicator line between items
62+
class QgsCategorizedSymbolRendererV2ViewStyle: public QProxyStyle
63+
{
64+
public:
65+
QgsCategorizedSymbolRendererV2ViewStyle( QStyle* style = 0 );
66+
67+
void drawPrimitive( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
68+
};
69+
6070
class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widget, private Ui::QgsCategorizedSymbolRendererV2Widget
6171
{
6272
Q_OBJECT

‎src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp

Lines changed: 320 additions & 63 deletions
Large diffs are not rendered by default.

‎src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,52 @@
1919
#include "qgsgraduatedsymbolrendererv2.h"
2020
#include "qgsrendererv2widget.h"
2121
#include <QStandardItem>
22+
#include <QProxyStyle>
2223

2324
#include "ui_qgsgraduatedsymbolrendererv2widget.h"
2425

26+
class GUI_EXPORT QgsGraduatedSymbolRendererV2Model : public QAbstractItemModel
27+
{
28+
Q_OBJECT
29+
public:
30+
QgsGraduatedSymbolRendererV2Model( QObject * parent = 0 );
31+
Qt::ItemFlags flags( const QModelIndex & index ) const;
32+
Qt::DropActions supportedDropActions() const;
33+
QVariant data( const QModelIndex &index, int role ) const;
34+
bool setData( const QModelIndex & index, const QVariant & value, int role );
35+
QVariant headerData( int section, Qt::Orientation orientation, int role ) const;
36+
int rowCount( const QModelIndex &parent = QModelIndex() ) const;
37+
int columnCount( const QModelIndex & = QModelIndex() ) const;
38+
QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const;
39+
QModelIndex parent( const QModelIndex &index ) const;
40+
QStringList mimeTypes() const;
41+
QMimeData *mimeData( const QModelIndexList &indexes ) const;
42+
bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent );
43+
44+
void setRenderer( QgsGraduatedSymbolRendererV2* renderer );
45+
46+
void addClass( QgsSymbolV2* symbol );
47+
void removeRows( QList<int> rows );
48+
void removeAllRows( );
49+
void sort( int column, Qt::SortOrder order = Qt::AscendingOrder );
50+
51+
signals:
52+
void rowsMoved();
53+
54+
private:
55+
QgsGraduatedSymbolRendererV2* mRenderer;
56+
QString mMimeFormat;
57+
};
58+
59+
// View style which shows drop indicator line between items
60+
class QgsGraduatedSymbolRendererV2ViewStyle: public QProxyStyle
61+
{
62+
public:
63+
QgsGraduatedSymbolRendererV2ViewStyle( QStyle* style = 0 );
64+
65+
void drawPrimitive( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
66+
};
67+
2568
class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget, private Ui::QgsGraduatedSymbolRendererV2Widget
2669
{
2770
Q_OBJECT
@@ -45,26 +88,30 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
4588

4689
/**Adds a class manually to the classification*/
4790
void addClass();
48-
/**Removes a class from the classification*/
49-
void deleteCurrentClass();
91+
/**Removes currently selected classes */
92+
void deleteClasses();
93+
/**Removes all classes from the classification*/
94+
void deleteAllClasses();
5095

5196
void rotationFieldChanged( QString fldName );
5297
void sizeScaleFieldChanged( QString fldName );
5398
void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod );
5499

55100
void showSymbolLevels();
56101

102+
void rowsMoved();
103+
57104
protected:
58105
void updateUiFromRenderer();
59106

60107
void updateGraduatedSymbolIcon();
61108

109+
//! return a list of indexes for the classes under selection
110+
QList<int> selectedClasses();
111+
62112
//! populate column combos in categorized and graduated page
63113
void populateColumns();
64114

65-
//! populate ranges of graduated symbol renderer
66-
void populateRanges();
67-
68115
void changeRangeSymbol( int rangeIdx );
69116
void changeRange( int rangeIdx );
70117

@@ -84,6 +131,8 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
84131

85132
QgsRendererV2DataDefinedMenus* mDataDefinedMenus;
86133

134+
QgsGraduatedSymbolRendererV2Model* mModel;
135+
87136
};
88137

89138

‎src/ui/qgsgraduatedsymbolrendererv2widget.ui

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@
156156
<property name="contextMenuPolicy">
157157
<enum>Qt::CustomContextMenu</enum>
158158
</property>
159+
<property name="showDropIndicator" stdset="0">
160+
<bool>true</bool>
161+
</property>
162+
<property name="dragDropMode">
163+
<enum>QAbstractItemView::InternalMove</enum>
164+
</property>
159165
<property name="selectionMode">
160166
<enum>QAbstractItemView::ExtendedSelection</enum>
161167
</property>
@@ -186,7 +192,14 @@
186192
<item>
187193
<widget class="QPushButton" name="btnGraduatedDelete">
188194
<property name="text">
189-
<string>Delete class</string>
195+
<string>Delete</string>
196+
</property>
197+
</widget>
198+
</item>
199+
<item>
200+
<widget class="QPushButton" name="btnDeleteAllClasses">
201+
<property name="text">
202+
<string>Delete all</string>
190203
</property>
191204
</widget>
192205
</item>

0 commit comments

Comments
 (0)
Please sign in to comment.