Skip to content

Commit a1a1fb7

Browse files
committed
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

+2-5
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

+75
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

+10
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

+28
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

+10
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

0 commit comments

Comments
 (0)