QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgsellipsesymbollayerwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsellipsesymbollayerwidget.cpp
3 ---------------------
4 begin : June 2011
5 copyright : (C) 2011 by Marco Hugentobler
6 email : marco dot hugentobler at sourcepole dot ch
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
16#include "moc_qgsellipsesymbollayerwidget.cpp"
18#include "qgsvectorlayer.h"
19#include "qgssymbollayerutils.h"
20#include <QColorDialog>
21
23 : QgsSymbolLayerWidget( parent, vl )
24
25{
26 setupUi( this );
27 connect( mShapeListWidget, &QListWidget::itemSelectionChanged, this, &QgsEllipseSymbolLayerWidget::mShapeListWidget_itemSelectionChanged );
28 connect( mWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mWidthSpinBox_valueChanged );
29 connect( mHeightSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mHeightSpinBox_valueChanged );
30 connect( mRotationSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mRotationSpinBox_valueChanged );
31 connect( mStrokeStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mStrokeStyleComboBox_currentIndexChanged );
32 connect( mStrokeWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mStrokeWidthSpinBox_valueChanged );
33 connect( btnChangeColorStroke, &QgsColorButton::colorChanged, this, &QgsEllipseSymbolLayerWidget::btnChangeColorStroke_colorChanged );
34 connect( btnChangeColorFill, &QgsColorButton::colorChanged, this, &QgsEllipseSymbolLayerWidget::btnChangeColorFill_colorChanged );
35 connect( mSymbolWidthUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mSymbolWidthUnitWidget_changed );
36 connect( mStrokeWidthUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mStrokeWidthUnitWidget_changed );
37 connect( mSymbolHeightUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mSymbolHeightUnitWidget_changed );
38 connect( mOffsetUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mOffsetUnitWidget_changed );
39 connect( mHorizontalAnchorComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mHorizontalAnchorComboBox_currentIndexChanged );
40 connect( mVerticalAnchorComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mVerticalAnchorComboBox_currentIndexChanged );
41
46
47 btnChangeColorFill->setAllowOpacity( true );
48 btnChangeColorFill->setColorDialogTitle( tr( "Select Fill Color" ) );
49 btnChangeColorFill->setContext( QStringLiteral( "symbology" ) );
50 btnChangeColorFill->setShowNoColor( true );
51 btnChangeColorFill->setNoColorString( tr( "Transparent Fill" ) );
52 btnChangeColorStroke->setAllowOpacity( true );
53 btnChangeColorStroke->setColorDialogTitle( tr( "Select Stroke Color" ) );
54 btnChangeColorStroke->setContext( QStringLiteral( "symbology" ) );
55 btnChangeColorStroke->setShowNoColor( true );
56 btnChangeColorStroke->setNoColorString( tr( "Transparent Stroke" ) );
57
58 mFillColorDDBtn->registerLinkedWidget( btnChangeColorFill );
59 mStrokeColorDDBtn->registerLinkedWidget( btnChangeColorStroke );
60
61 spinOffsetX->setClearValue( 0.0 );
62 spinOffsetY->setClearValue( 0.0 );
63 mRotationSpinBox->setClearValue( 0.0 );
64
65 int size = mShapeListWidget->iconSize().width();
66 size = std::max( 30, static_cast<int>( std::round( Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance( 'X' ) * 3 ) ) );
67 mShapeListWidget->setGridSize( QSize( size * 1.2, size * 1.2 ) );
68 mShapeListWidget->setIconSize( QSize( size, size ) );
69
70 const double markerSize = size * 0.8;
71 const auto shapes = QgsEllipseSymbolLayer::availableShapes();
72 for ( const QgsEllipseSymbolLayer::Shape shape : shapes )
73 {
77 lyr->setShape( shape );
78 lyr->setStrokeColor( QColor( 0, 0, 0 ) );
79 lyr->setFillColor( QColor( 200, 200, 200 ) );
80 lyr->setSymbolWidth( markerSize );
81 lyr->setSymbolHeight( markerSize * 0.75 );
83 QListWidgetItem *item = new QListWidgetItem( icon, QString(), mShapeListWidget );
84 item->setData( Qt::UserRole, static_cast<int>( shape ) );
85 item->setToolTip( QgsEllipseSymbolLayer::encodeShape( shape ) );
86 delete lyr;
87 }
88 // show at least 2 rows (only 1 row is required, but looks too cramped)
89 mShapeListWidget->setMinimumHeight( mShapeListWidget->gridSize().height() * 2.1 );
90
91 connect( spinOffsetX, static_cast<void ( QgsDoubleSpinBox::* )( double )>( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
92 connect( spinOffsetY, static_cast<void ( QgsDoubleSpinBox::* )( double )>( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
93 connect( cboJoinStyle, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::penJoinStyleChanged );
94 connect( cboCapStyle, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::penCapStyleChanged );
95}
96
98{
99 if ( !layer || layer->layerType() != QLatin1String( "EllipseMarker" ) )
100 {
101 return;
102 }
103
104 mLayer = static_cast<QgsEllipseSymbolLayer *>( layer );
105 mWidthSpinBox->setValue( mLayer->symbolWidth() );
106 mHeightSpinBox->setValue( mLayer->symbolHeight() );
107 mRotationSpinBox->setValue( mLayer->angle() );
108 mStrokeStyleComboBox->setPenStyle( mLayer->strokeStyle() );
109 mStrokeWidthSpinBox->setValue( mLayer->strokeWidth() );
110 btnChangeColorStroke->setColor( mLayer->strokeColor() );
111 btnChangeColorFill->setColor( mLayer->fillColor() );
112
114 for ( int i = 0; i < mShapeListWidget->count(); ++i )
115 {
116 if ( static_cast<QgsEllipseSymbolLayer::Shape>( mShapeListWidget->item( i )->data( Qt::UserRole ).toInt() ) == shape )
117 {
118 mShapeListWidget->setCurrentRow( i );
119 break;
120 }
121 }
122 btnChangeColorFill->setEnabled( QgsEllipseSymbolLayer::shapeIsFilled( mLayer->shape() ) );
123
124 //set combo entries to current values
125 blockComboSignals( true );
126 mSymbolWidthUnitWidget->setUnit( mLayer->symbolWidthUnit() );
127 mSymbolWidthUnitWidget->setMapUnitScale( mLayer->symbolWidthMapUnitScale() );
128 mStrokeWidthUnitWidget->setUnit( mLayer->strokeWidthUnit() );
129 mStrokeWidthUnitWidget->setMapUnitScale( mLayer->strokeWidthMapUnitScale() );
130 mSymbolHeightUnitWidget->setUnit( mLayer->symbolHeightUnit() );
131 mSymbolHeightUnitWidget->setMapUnitScale( mLayer->symbolHeightMapUnitScale() );
132 mOffsetUnitWidget->setUnit( mLayer->offsetUnit() );
133 mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() );
134 const QPointF offsetPt = mLayer->offset();
135 spinOffsetX->setValue( offsetPt.x() );
136 spinOffsetY->setValue( offsetPt.y() );
137 mHorizontalAnchorComboBox->setCurrentIndex( mLayer->horizontalAnchorPoint() );
138 mVerticalAnchorComboBox->setCurrentIndex( mLayer->verticalAnchorPoint() );
139 cboJoinStyle->setPenJoinStyle( mLayer->penJoinStyle() );
140 cboCapStyle->setPenCapStyle( mLayer->penCapStyle() );
141 blockComboSignals( false );
142
156}
157
162
163void QgsEllipseSymbolLayerWidget::mShapeListWidget_itemSelectionChanged()
164{
165 if ( mLayer )
166 {
167 mLayer->setShape( static_cast<QgsEllipseSymbolLayer::Shape>( mShapeListWidget->currentItem()->data( Qt::UserRole ).toInt() ) );
168 btnChangeColorFill->setEnabled( QgsEllipseSymbolLayer::shapeIsFilled( mLayer->shape() ) );
169 emit changed();
170 }
171}
172
173void QgsEllipseSymbolLayerWidget::mWidthSpinBox_valueChanged( double d )
174{
175 if ( mLayer )
176 {
178 emit changed();
179 }
180}
181
182void QgsEllipseSymbolLayerWidget::mHeightSpinBox_valueChanged( double d )
183{
184 if ( mLayer )
185 {
187 emit changed();
188 }
189}
190
191void QgsEllipseSymbolLayerWidget::mRotationSpinBox_valueChanged( double d )
192{
193 if ( mLayer )
194 {
195 mLayer->setAngle( d );
196 emit changed();
197 }
198}
199
200void QgsEllipseSymbolLayerWidget::mStrokeStyleComboBox_currentIndexChanged( int index )
201{
202 Q_UNUSED( index )
203
204 if ( mLayer )
205 {
206 mLayer->setStrokeStyle( mStrokeStyleComboBox->penStyle() );
207 emit changed();
208 }
209}
210
211void QgsEllipseSymbolLayerWidget::mStrokeWidthSpinBox_valueChanged( double d )
212{
213 if ( mLayer )
214 {
216 emit changed();
217 }
218}
219
220void QgsEllipseSymbolLayerWidget::btnChangeColorStroke_colorChanged( const QColor &newColor )
221{
222 if ( !mLayer )
223 {
224 return;
225 }
226
227 mLayer->setStrokeColor( newColor );
228 emit changed();
229}
230
231void QgsEllipseSymbolLayerWidget::btnChangeColorFill_colorChanged( const QColor &newColor )
232{
233 if ( !mLayer )
234 {
235 return;
236 }
237
238 mLayer->setFillColor( newColor );
239 emit changed();
240}
241
242void QgsEllipseSymbolLayerWidget::mSymbolWidthUnitWidget_changed()
243{
244 if ( mLayer )
245 {
246 mLayer->setSymbolWidthUnit( mSymbolWidthUnitWidget->unit() );
247 mLayer->setSymbolWidthMapUnitScale( mSymbolWidthUnitWidget->getMapUnitScale() );
248 emit changed();
249 }
250}
251
252void QgsEllipseSymbolLayerWidget::mStrokeWidthUnitWidget_changed()
253{
254 if ( mLayer )
255 {
256 mLayer->setStrokeWidthUnit( mStrokeWidthUnitWidget->unit() );
257 mLayer->setStrokeWidthMapUnitScale( mStrokeWidthUnitWidget->getMapUnitScale() );
258 emit changed();
259 }
260}
261
262void QgsEllipseSymbolLayerWidget::mSymbolHeightUnitWidget_changed()
263{
264 if ( mLayer )
265 {
266 mLayer->setSymbolHeightUnit( mSymbolHeightUnitWidget->unit() );
267 mLayer->setSymbolHeightMapUnitScale( mSymbolHeightUnitWidget->getMapUnitScale() );
268 emit changed();
269 }
270}
271
272void QgsEllipseSymbolLayerWidget::mOffsetUnitWidget_changed()
273{
274 if ( mLayer )
275 {
276 mLayer->setOffsetUnit( mOffsetUnitWidget->unit() );
277 mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() );
278 emit changed();
279 }
280}
281
282void QgsEllipseSymbolLayerWidget::penJoinStyleChanged()
283{
284 mLayer->setPenJoinStyle( cboJoinStyle->penJoinStyle() );
285 emit changed();
286}
287
288void QgsEllipseSymbolLayerWidget::penCapStyleChanged()
289{
290 mLayer->setPenCapStyle( cboCapStyle->penCapStyle() );
291 emit changed();
292}
293
294void QgsEllipseSymbolLayerWidget::blockComboSignals( bool block )
295{
296 mSymbolWidthUnitWidget->blockSignals( block );
297 mStrokeWidthUnitWidget->blockSignals( block );
298 mSymbolHeightUnitWidget->blockSignals( block );
299 mHorizontalAnchorComboBox->blockSignals( block );
300 mVerticalAnchorComboBox->blockSignals( block );
301 mSymbolWidthUnitWidget->blockSignals( block );
302 mStrokeWidthUnitWidget->blockSignals( block );
303 mSymbolHeightUnitWidget->blockSignals( block );
304 mOffsetUnitWidget->blockSignals( block );
305 cboJoinStyle->blockSignals( block );
306 cboCapStyle->blockSignals( block );
307}
308
309void QgsEllipseSymbolLayerWidget::mHorizontalAnchorComboBox_currentIndexChanged( int index )
310{
311 if ( mLayer )
312 {
314 emit changed();
315 }
316}
317
318void QgsEllipseSymbolLayerWidget::mVerticalAnchorComboBox_currentIndexChanged( int index )
319{
320 if ( mLayer )
321 {
323 emit changed();
324 }
325}
326
327void QgsEllipseSymbolLayerWidget::setOffset()
328{
329 mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
330 emit changed();
331}
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes)
@ MapUnits
Map units.
@ MetersInMapUnits
Meters value as Map units.
@ Hybrid
Hybrid symbol.
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition qgis.h:5775
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
QgsEllipseSymbolLayerWidget(QgsVectorLayer *vl, QWidget *parent=nullptr)
Constructor for QgsEllipseSymbolLayerWidget.
void setSymbolLayer(QgsSymbolLayer *layer) override
QgsSymbolLayer * symbolLayer() override
A symbol layer for rendering objects with major and minor axis (e.g.
void setPenCapStyle(Qt::PenCapStyle style)
Sets the marker's stroke cap style (e.g., flat, round, etc).
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
Qgis::RenderUnit symbolWidthUnit() const
Returns the units for the symbol's width.
const QgsMapUnitScale & strokeWidthMapUnitScale() const
Qgis::RenderUnit strokeWidthUnit() const
Returns the units for the symbol's stroke width.
void setStrokeColor(const QColor &c) override
Sets the stroke color for the symbol layer.
void setStrokeStyle(Qt::PenStyle strokeStyle)
void setStrokeWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's stroke width.
Shape
Marker symbol shapes.
QColor fillColor() const override
Returns the fill color for the symbol layer.
QgsEllipseSymbolLayer::Shape shape() const
Returns the shape for the rendered ellipse marker symbol.
void setFillColor(const QColor &c) override
Sets the fill color for the symbol layer.
void setShape(QgsEllipseSymbolLayer::Shape shape)
Sets the rendered ellipse marker shape.
static QList< QgsEllipseSymbolLayer::Shape > availableShapes()
Returns a list of all available shape types.
const QgsMapUnitScale & symbolHeightMapUnitScale() const
Qt::PenStyle strokeStyle() const
const QgsMapUnitScale & symbolWidthMapUnitScale() const
static QString encodeShape(QgsEllipseSymbolLayer::Shape shape)
Encodes a shape to its string representation.
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
void setSymbolHeightUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's height.
QColor strokeColor() const override
Returns the stroke color for the symbol layer.
void setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
static bool shapeIsFilled(const QgsEllipseSymbolLayer::Shape &shape)
Returns true if a shape has a fill.
void setSymbolWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's width.
Qgis::RenderUnit symbolHeightUnit() const
Returns the units for the symbol's height.
Qt::PenJoinStyle penJoinStyle() const
Gets stroke join style.
Qt::PenCapStyle penCapStyle() const
Returns the marker's stroke cap style (e.g., flat, round, etc).
Struct for storing maximum and minimum scales for measurements in map units.
QPointF offset() const
Returns the marker's offset, which is the horizontal and vertical displacement which the rendered mar...
HorizontalAnchorPoint
Symbol horizontal anchor points.
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's offset.
void setAngle(double angle)
Sets the rotation angle for the marker.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the symbol's offset.
Qgis::RenderUnit offsetUnit() const
Returns the units for the symbol's offset.
VerticalAnchorPoint verticalAnchorPoint() const
Returns the vertical anchor point for positioning the symbol.
HorizontalAnchorPoint horizontalAnchorPoint() const
Returns the horizontal anchor point for positioning the symbol.
VerticalAnchorPoint
Symbol vertical anchor points.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
Stores properties relating to a screen.
static QIcon symbolLayerPreviewIcon(const QgsSymbolLayer *layer, Qgis::RenderUnit u, QSize size, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::SymbolType parentSymbolType=Qgis::SymbolType::Hybrid, QgsMapLayer *mapLayer=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Draws a symbol layer preview to an icon.
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsSymbolLayer::Property key)
Registers a data defined override button.
void changed()
Should be emitted whenever configuration changes happened on this symbol layer configuration.
@ VerticalAnchor
Vertical anchor point.
@ HorizontalAnchor
Horizontal anchor point.
@ StrokeStyle
Stroke style (eg solid, dashed)
@ Name
Name, eg shape name for simple markers.
@ StrokeColor
Stroke color.
@ CapStyle
Line cap style.
@ JoinStyle
Line join style.
@ StrokeWidth
Stroke width.
@ Offset
Symbol offset.
@ Height
Symbol height.
virtual QString layerType() const =0
Returns a string that represents this layer type.
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
void changed()
Emitted when the selected unit is changed, or the definition of the map unit scale is changed.
Represents a vector layer which manages a vector based data sets.