Skip to content

Commit a80c349

Browse files
committed
Add size assistant to simple and svg marker data defined sizes
1 parent de3377b commit a80c349

File tree

5 files changed

+120
-23
lines changed

5 files changed

+120
-23
lines changed

python/gui/symbology-ng/qgssizescalewidget.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,9 @@ class QgsSizeScaleWidget : QgsDataDefinedAssistant
77
QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsMarkerSymbolV2 * symbol );
88

99
QgsDataDefined dataDefined() const;
10+
11+
protected:
12+
13+
virtual void showEvent( QShowEvent * );
1014
};
1115

src/gui/symbology-ng/qgssizescalewidget.cpp

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,36 @@ class ItemDelegate : public QItemDelegate
4747

4848
};
4949

50+
void QgsSizeScaleWidget::setFromSymbol()
51+
{
52+
if ( !mSymbol )
53+
{
54+
return;
55+
}
56+
57+
QgsDataDefined ddSize = mSymbol->dataDefinedSize();
58+
QgsScaleExpression expr( ddSize.expressionString() );
59+
if ( expr )
60+
{
61+
for ( int i = 0; i < scaleMethodComboBox->count(); i++ )
62+
{
63+
if ( scaleMethodComboBox->itemData( i ).toInt() == int( expr.type() ) )
64+
{
65+
scaleMethodComboBox->setCurrentIndex( i );
66+
break;
67+
}
68+
}
69+
70+
mExpressionWidget->setField( expr.baseExpression() );
71+
72+
minValueSpinBox->setValue( expr.minValue() );
73+
maxValueSpinBox->setValue( expr.maxValue() );
74+
minSizeSpinBox->setValue( expr.minSize() );
75+
maxSizeSpinBox->setValue( expr.maxSize() );
76+
}
77+
updatePreview();
78+
}
79+
5080
QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsMarkerSymbolV2 * symbol )
5181
: mSymbol( symbol )
5282
// we just use the minimumValue and maximumValue from the layer, unfortunately they are
@@ -85,27 +115,7 @@ QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsM
85115
maxValueSpinBox->setShowClearButton( false );
86116

87117
// setup ui from expression if any
88-
QgsDataDefined ddSize = mSymbol->dataDefinedSize();
89-
QgsScaleExpression expr( ddSize.expressionString() );
90-
if ( expr )
91-
{
92-
for ( int i = 0; i < scaleMethodComboBox->count(); i++ )
93-
{
94-
if ( scaleMethodComboBox->itemData( i ).toInt() == int( expr.type() ) )
95-
{
96-
scaleMethodComboBox->setCurrentIndex( i );
97-
break;
98-
}
99-
}
100-
101-
mExpressionWidget->setField( expr.baseExpression() );
102-
103-
minValueSpinBox->setValue( expr.minValue() );
104-
maxValueSpinBox->setValue( expr.maxValue() );
105-
minSizeSpinBox->setValue( expr.minSize() );
106-
maxSizeSpinBox->setValue( expr.maxSize() );
107-
updatePreview();
108-
}
118+
setFromSymbol();
109119

110120
connect( minSizeSpinBox, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) );
111121
connect( maxSizeSpinBox, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) );
@@ -122,6 +132,11 @@ QgsDataDefined QgsSizeScaleWidget::dataDefined() const
122132
return QgsDataDefined( exp.data() );
123133
}
124134

135+
void QgsSizeScaleWidget::showEvent( QShowEvent* )
136+
{
137+
setFromSymbol();
138+
}
139+
125140
QgsScaleExpression *QgsSizeScaleWidget::createExpression() const
126141
{
127142
return new QgsScaleExpression( QgsScaleExpression::Type( scaleMethodComboBox->itemData( scaleMethodComboBox->currentIndex() ).toInt() ),
@@ -134,6 +149,9 @@ QgsScaleExpression *QgsSizeScaleWidget::createExpression() const
134149

135150
void QgsSizeScaleWidget::updatePreview()
136151
{
152+
if ( !mSymbol )
153+
return;
154+
137155
QScopedPointer<QgsScaleExpression> expr( createExpression() );
138156
QList<double> breaks = QgsSymbolLayerV2Utils::prettyBreaks( expr->minValue(), expr->maxValue(), 4 );
139157

src/gui/symbology-ng/qgssizescalewidget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui
3838

3939
QgsDataDefined dataDefined() const override;
4040

41+
protected:
42+
43+
virtual void showEvent( QShowEvent * ) override;
44+
4145
private slots:
4246
void computeFromLayerTriggered();
4347
void updatePreview();
@@ -51,6 +55,8 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui
5155
QStandardItemModel mPreviewList;
5256

5357
QgsScaleExpression* createExpression() const;
58+
void setFromSymbol();
59+
5460
};
5561

5662
#endif //QGSSIZESCALEWIDGET_H

src/gui/symbology-ng/qgssymbollayerv2widget.cpp

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "qgsapplication.h"
3535

3636
#include "qgslogger.h"
37+
#include "qgssizescalewidget.h"
3738

3839
#include <QAbstractButton>
3940
#include <QColorDialog>
@@ -334,6 +335,11 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const Qg
334335
spinOffsetX->setClearValue( 0.0 );
335336
spinOffsetY->setClearValue( 0.0 );
336337

338+
//make a temporary symbol for the size assistant preview
339+
mAssistantPreviewSymbol = new QgsMarkerSymbolV2();
340+
341+
mSizeDDBtn->setAssistant( new QgsSizeScaleWidget( mVectorLayer, mAssistantPreviewSymbol ) );
342+
337343
QSize size = lstNames->iconSize();
338344
QStringList names;
339345
names << "circle" << "rectangle" << "diamond" << "pentagon" << "cross" << "cross2" << "triangle"
@@ -355,6 +361,12 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const Qg
355361
connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) );
356362
connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
357363
connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
364+
connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) );
365+
}
366+
367+
QgsSimpleMarkerSymbolLayerV2Widget::~QgsSimpleMarkerSymbolLayerV2Widget()
368+
{
369+
delete mAssistantPreviewSymbol;
358370
}
359371

360372
void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
@@ -437,6 +449,8 @@ void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer
437449
registerDataDefinedButton( mOffsetDDBtn, "offset", QgsDataDefinedButton::String, QgsDataDefinedButton::doubleXYDesc() );
438450
registerDataDefinedButton( mHorizontalAnchorDDBtn, "horizontal_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::horizontalAnchorDesc() );
439451
registerDataDefinedButton( mVerticalAnchorDDBtn, "vertical_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::verticalAnchorDesc() );
452+
453+
updateAssistantSymbol();
440454
}
441455

442456
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2Widget::symbolLayer()
@@ -548,6 +562,18 @@ void QgsSimpleMarkerSymbolLayerV2Widget::on_mVerticalAnchorComboBox_currentIndex
548562
}
549563
}
550564

565+
void QgsSimpleMarkerSymbolLayerV2Widget::updateAssistantSymbol()
566+
{
567+
for ( int i = mAssistantPreviewSymbol->symbolLayerCount() - 1 ; i >= 0; --i )
568+
{
569+
mAssistantPreviewSymbol->deleteSymbolLayer( i );
570+
}
571+
mAssistantPreviewSymbol->appendSymbolLayer( mLayer->clone() );
572+
QgsDataDefined* ddSize = mLayer->getDataDefinedProperty( "size" );
573+
if ( ddSize )
574+
mAssistantPreviewSymbol->setDataDefinedSize( *ddSize );
575+
}
576+
551577

552578
///////////
553579

@@ -1508,6 +1534,16 @@ QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget( const QgsVecto
15081534
connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) );
15091535
connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
15101536
connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
1537+
connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) );
1538+
1539+
//make a temporary symbol for the size assistant preview
1540+
mAssistantPreviewSymbol = new QgsMarkerSymbolV2();
1541+
mSizeDDBtn->setAssistant( new QgsSizeScaleWidget( mVectorLayer, mAssistantPreviewSymbol ) );
1542+
}
1543+
1544+
QgsSvgMarkerSymbolLayerV2Widget::~QgsSvgMarkerSymbolLayerV2Widget()
1545+
{
1546+
delete mAssistantPreviewSymbol;
15111547
}
15121548

15131549
#include <QTime>
@@ -1698,6 +1734,18 @@ void QgsSvgMarkerSymbolLayerV2Widget::setGuiForSvg( const QgsSvgMarkerSymbolLaye
16981734
mBorderWidthSpinBox->blockSignals( false );
16991735
}
17001736

1737+
void QgsSvgMarkerSymbolLayerV2Widget::updateAssistantSymbol()
1738+
{
1739+
for ( int i = mAssistantPreviewSymbol->symbolLayerCount() - 1 ; i >= 0; --i )
1740+
{
1741+
mAssistantPreviewSymbol->deleteSymbolLayer( i );
1742+
}
1743+
mAssistantPreviewSymbol->appendSymbolLayer( mLayer->clone() );
1744+
QgsDataDefined* ddSize = mLayer->getDataDefinedProperty( "size" );
1745+
if ( ddSize )
1746+
mAssistantPreviewSymbol->setDataDefinedSize( *ddSize );
1747+
}
1748+
17011749

17021750
void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
17031751
{
@@ -1775,6 +1823,8 @@ void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
17751823
registerDataDefinedButton( mBorderColorDDBtn, "outline", QgsDataDefinedButton::String, QgsDataDefinedButton::colorNoAlphaDesc() );
17761824
registerDataDefinedButton( mHorizontalAnchorDDBtn, "horizontal_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::horizontalAnchorDesc() );
17771825
registerDataDefinedButton( mVerticalAnchorDDBtn, "vertical_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::verticalAnchorDesc() );
1826+
1827+
updateAssistantSymbol();
17781828
}
17791829

17801830
QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2Widget::symbolLayer()
@@ -2460,7 +2510,6 @@ QgsFontMarkerSymbolLayerV2Widget::QgsFontMarkerSymbolLayerV2Widget( const QgsVec
24602510
connect( widgetChar, SIGNAL( characterSelected( const QChar & ) ), this, SLOT( setCharacter( const QChar & ) ) );
24612511
}
24622512

2463-
24642513
void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
24652514
{
24662515
if ( layer->layerType() != "FontMarker" )
@@ -2591,7 +2640,6 @@ void QgsFontMarkerSymbolLayerV2Widget::on_mVerticalAnchorComboBox_currentIndexCh
25912640
}
25922641
}
25932642

2594-
25952643
///////////////
25962644

25972645

src/gui/symbology-ng/qgssymbollayerv2widget.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class GUI_EXPORT QgsSimpleLineSymbolLayerV2Widget : public QgsSymbolLayerV2Widge
9090

9191
//creates a new icon for the 'change pattern' button
9292
void updatePatternIcon();
93+
9394
};
9495

9596
///////////
@@ -104,6 +105,7 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Wid
104105

105106
public:
106107
QgsSimpleMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent = NULL );
108+
~QgsSimpleMarkerSymbolLayerV2Widget();
107109

108110
static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsSimpleMarkerSymbolLayerV2Widget( vl ); }
109111

@@ -128,6 +130,14 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Wid
128130

129131
protected:
130132
QgsSimpleMarkerSymbolLayerV2* mLayer;
133+
134+
private slots:
135+
136+
void updateAssistantSymbol();
137+
138+
private:
139+
140+
QgsMarkerSymbolV2* mAssistantPreviewSymbol;
131141
};
132142

133143
///////////
@@ -286,6 +296,7 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget
286296

287297
public:
288298
QgsSvgMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent = NULL );
299+
~QgsSvgMarkerSymbolLayerV2Widget();
289300

290301
static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsSvgMarkerSymbolLayerV2Widget( vl ); }
291302

@@ -319,6 +330,15 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget
319330
void setGuiForSvg( const QgsSvgMarkerSymbolLayerV2* layer );
320331

321332
QgsSvgMarkerSymbolLayerV2* mLayer;
333+
334+
private slots:
335+
336+
void updateAssistantSymbol();
337+
338+
private:
339+
340+
QgsMarkerSymbolV2* mAssistantPreviewSymbol;
341+
322342
};
323343

324344
///////////
@@ -497,6 +517,7 @@ class GUI_EXPORT QgsFontMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widge
497517
protected:
498518
QgsFontMarkerSymbolLayerV2* mLayer;
499519
CharacterWidget* widgetChar;
520+
500521
};
501522

502523
//////////

0 commit comments

Comments
 (0)