QGIS API Documentation  3.6.0-Noosa (5873452)
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 "qgsellipsesymbollayer.h"
17 #include "qgsvectorlayer.h"
18 #include <QColorDialog>
19 
21  : QgsSymbolLayerWidget( parent, vl )
22 
23 {
24  setupUi( this );
25  connect( mShapeListWidget, &QListWidget::itemSelectionChanged, this, &QgsEllipseSymbolLayerWidget::mShapeListWidget_itemSelectionChanged );
26  connect( mWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mWidthSpinBox_valueChanged );
27  connect( mHeightSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mHeightSpinBox_valueChanged );
28  connect( mRotationSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mRotationSpinBox_valueChanged );
29  connect( mStrokeStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mStrokeStyleComboBox_currentIndexChanged );
30  connect( mStrokeWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::mStrokeWidthSpinBox_valueChanged );
31  connect( btnChangeColorStroke, &QgsColorButton::colorChanged, this, &QgsEllipseSymbolLayerWidget::btnChangeColorStroke_colorChanged );
32  connect( btnChangeColorFill, &QgsColorButton::colorChanged, this, &QgsEllipseSymbolLayerWidget::btnChangeColorFill_colorChanged );
33  connect( mSymbolWidthUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mSymbolWidthUnitWidget_changed );
34  connect( mStrokeWidthUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mStrokeWidthUnitWidget_changed );
35  connect( mSymbolHeightUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mSymbolHeightUnitWidget_changed );
36  connect( mOffsetUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsEllipseSymbolLayerWidget::mOffsetUnitWidget_changed );
37  connect( mHorizontalAnchorComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mHorizontalAnchorComboBox_currentIndexChanged );
38  connect( mVerticalAnchorComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::mVerticalAnchorComboBox_currentIndexChanged );
39 
48 
49  btnChangeColorFill->setAllowOpacity( true );
50  btnChangeColorFill->setColorDialogTitle( tr( "Select Fill Color" ) );
51  btnChangeColorFill->setContext( QStringLiteral( "symbology" ) );
52  btnChangeColorFill->setShowNoColor( true );
53  btnChangeColorFill->setNoColorString( tr( "Transparent Fill" ) );
54  btnChangeColorStroke->setAllowOpacity( true );
55  btnChangeColorStroke->setColorDialogTitle( tr( "Select Stroke Color" ) );
56  btnChangeColorStroke->setContext( QStringLiteral( "symbology" ) );
57  btnChangeColorStroke->setShowNoColor( true );
58  btnChangeColorStroke->setNoColorString( tr( "Transparent Stroke" ) );
59 
60  mFillColorDDBtn->registerLinkedWidget( btnChangeColorFill );
61  mStrokeColorDDBtn->registerLinkedWidget( btnChangeColorStroke );
62 
63  spinOffsetX->setClearValue( 0.0 );
64  spinOffsetY->setClearValue( 0.0 );
65  mRotationSpinBox->setClearValue( 0.0 );
66 
67  QStringList names;
68  names << QStringLiteral( "circle" ) << QStringLiteral( "rectangle" ) << QStringLiteral( "diamond" ) << QStringLiteral( "cross" ) << QStringLiteral( "triangle" ) << QStringLiteral( "right_half_triangle" ) << QStringLiteral( "left_half_triangle" ) << QStringLiteral( "semi_circle" );
69 
70  int size = mShapeListWidget->iconSize().width();
71  size = std::max( 30, static_cast< int >( std::round( Qgis::UI_SCALE_FACTOR * fontMetrics().width( QStringLiteral( "XXX" ) ) ) ) );
72  mShapeListWidget->setGridSize( QSize( size * 1.2, size * 1.2 ) );
73  mShapeListWidget->setIconSize( QSize( size, size ) );
74 
75  double markerSize = size * 0.8;
76  Q_FOREACH ( const QString &name, names )
77  {
81  lyr->setSymbolName( name );
82  lyr->setStrokeColor( QColor( 0, 0, 0 ) );
83  lyr->setFillColor( QColor( 200, 200, 200 ) );
84  lyr->setSymbolWidth( markerSize );
85  lyr->setSymbolHeight( markerSize * 0.75 );
86  QIcon icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( lyr, QgsUnitTypes::RenderPixels, QSize( size, size ) );
87  QListWidgetItem *item = new QListWidgetItem( icon, QString(), mShapeListWidget );
88  item->setToolTip( name );
89  item->setData( Qt::UserRole, name );
90  delete lyr;
91  }
92  // show at least 2 rows (only 1 row is required, but looks too cramped)
93  mShapeListWidget->setMinimumHeight( mShapeListWidget->gridSize().height() * 2.1 );
94 
95  connect( spinOffsetX, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
96  connect( spinOffsetY, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
97  connect( cboJoinStyle, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::penJoinStyleChanged );
98 }
99 
101 {
102  if ( !layer || layer->layerType() != QLatin1String( "EllipseMarker" ) )
103  {
104  return;
105  }
106 
107  mLayer = static_cast<QgsEllipseSymbolLayer *>( layer );
108  mWidthSpinBox->setValue( mLayer->symbolWidth() );
109  mHeightSpinBox->setValue( mLayer->symbolHeight() );
110  mRotationSpinBox->setValue( mLayer->angle() );
111  mStrokeStyleComboBox->setPenStyle( mLayer->strokeStyle() );
112  mStrokeWidthSpinBox->setValue( mLayer->strokeWidth() );
113  btnChangeColorStroke->setColor( mLayer->strokeColor() );
114  btnChangeColorFill->setColor( mLayer->fillColor() );
115 
116  QList<QListWidgetItem *> symbolItemList = mShapeListWidget->findItems( mLayer->symbolName(), Qt::MatchExactly );
117  if ( !symbolItemList.isEmpty() )
118  {
119  mShapeListWidget->setCurrentItem( symbolItemList.at( 0 ) );
120  }
121 
122  //set combo entries to current values
123  blockComboSignals( true );
124  mSymbolWidthUnitWidget->setUnit( mLayer->symbolWidthUnit() );
125  mSymbolWidthUnitWidget->setMapUnitScale( mLayer->symbolWidthMapUnitScale() );
126  mStrokeWidthUnitWidget->setUnit( mLayer->strokeWidthUnit() );
127  mStrokeWidthUnitWidget->setMapUnitScale( mLayer->strokeWidthMapUnitScale() );
128  mSymbolHeightUnitWidget->setUnit( mLayer->symbolHeightUnit() );
129  mSymbolHeightUnitWidget->setMapUnitScale( mLayer->symbolHeightMapUnitScale() );
130  mOffsetUnitWidget->setUnit( mLayer->offsetUnit() );
131  mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() );
132  QPointF offsetPt = mLayer->offset();
133  spinOffsetX->setValue( offsetPt.x() );
134  spinOffsetY->setValue( offsetPt.y() );
135  mHorizontalAnchorComboBox->setCurrentIndex( mLayer->horizontalAnchorPoint() );
136  mVerticalAnchorComboBox->setCurrentIndex( mLayer->verticalAnchorPoint() );
137  cboJoinStyle->setPenJoinStyle( mLayer->penJoinStyle() );
138  blockComboSignals( false );
139 
152 
153 }
154 
156 {
157  return mLayer;
158 }
159 
160 void QgsEllipseSymbolLayerWidget::mShapeListWidget_itemSelectionChanged()
161 {
162  if ( mLayer )
163  {
164  QListWidgetItem *item = mShapeListWidget->currentItem();
165  if ( item )
166  {
167  mLayer->setSymbolName( item->data( Qt::UserRole ).toString() );
168  emit changed();
169  }
170  }
171 }
172 
173 void QgsEllipseSymbolLayerWidget::mWidthSpinBox_valueChanged( double d )
174 {
175  if ( mLayer )
176  {
177  mLayer->setSymbolWidth( d );
178  emit changed();
179  }
180 }
181 
182 void QgsEllipseSymbolLayerWidget::mHeightSpinBox_valueChanged( double d )
183 {
184  if ( mLayer )
185  {
186  mLayer->setSymbolHeight( d );
187  emit changed();
188  }
189 }
190 
191 void QgsEllipseSymbolLayerWidget::mRotationSpinBox_valueChanged( double d )
192 {
193  if ( mLayer )
194  {
195  mLayer->setAngle( d );
196  emit changed();
197  }
198 }
199 
200 void 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 
211 void QgsEllipseSymbolLayerWidget::mStrokeWidthSpinBox_valueChanged( double d )
212 {
213  if ( mLayer )
214  {
215  mLayer->setStrokeWidth( d );
216  emit changed();
217  }
218 }
219 
220 void QgsEllipseSymbolLayerWidget::btnChangeColorStroke_colorChanged( const QColor &newColor )
221 {
222  if ( !mLayer )
223  {
224  return;
225  }
226 
227  mLayer->setStrokeColor( newColor );
228  emit changed();
229 }
230 
231 void QgsEllipseSymbolLayerWidget::btnChangeColorFill_colorChanged( const QColor &newColor )
232 {
233  if ( !mLayer )
234  {
235  return;
236  }
237 
238  mLayer->setFillColor( newColor );
239  emit changed();
240 }
241 
242 void QgsEllipseSymbolLayerWidget::mSymbolWidthUnitWidget_changed()
243 {
244  if ( mLayer )
245  {
246  mLayer->setSymbolWidthUnit( mSymbolWidthUnitWidget->unit() );
247  mLayer->setSymbolWidthMapUnitScale( mSymbolWidthUnitWidget->getMapUnitScale() );
248  emit changed();
249  }
250 }
251 
252 void QgsEllipseSymbolLayerWidget::mStrokeWidthUnitWidget_changed()
253 {
254  if ( mLayer )
255  {
256  mLayer->setStrokeWidthUnit( mStrokeWidthUnitWidget->unit() );
257  mLayer->setStrokeWidthMapUnitScale( mStrokeWidthUnitWidget->getMapUnitScale() );
258  emit changed();
259  }
260 }
261 
262 void QgsEllipseSymbolLayerWidget::mSymbolHeightUnitWidget_changed()
263 {
264  if ( mLayer )
265  {
266  mLayer->setSymbolHeightUnit( mSymbolHeightUnitWidget->unit() );
267  mLayer->setSymbolHeightMapUnitScale( mSymbolHeightUnitWidget->getMapUnitScale() );
268  emit changed();
269  }
270 }
271 
272 void QgsEllipseSymbolLayerWidget::mOffsetUnitWidget_changed()
273 {
274  if ( mLayer )
275  {
276  mLayer->setOffsetUnit( mOffsetUnitWidget->unit() );
277  mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() );
278  emit changed();
279  }
280 }
281 
282 void QgsEllipseSymbolLayerWidget::penJoinStyleChanged()
283 {
284  mLayer->setPenJoinStyle( cboJoinStyle->penJoinStyle() );
285  emit changed();
286 }
287 
288 void QgsEllipseSymbolLayerWidget::blockComboSignals( bool block )
289 {
290  mSymbolWidthUnitWidget->blockSignals( block );
291  mStrokeWidthUnitWidget->blockSignals( block );
292  mSymbolHeightUnitWidget->blockSignals( block );
293  mHorizontalAnchorComboBox->blockSignals( block );
294  mVerticalAnchorComboBox->blockSignals( block );
295  mSymbolWidthUnitWidget->blockSignals( block );
296  mStrokeWidthUnitWidget->blockSignals( block );
297  mSymbolHeightUnitWidget->blockSignals( block );
298  mOffsetUnitWidget->blockSignals( block );
299  cboJoinStyle->blockSignals( block );
300 }
301 
302 void QgsEllipseSymbolLayerWidget::mHorizontalAnchorComboBox_currentIndexChanged( int index )
303 {
304  if ( mLayer )
305  {
307  emit changed();
308  }
309 }
310 
311 void QgsEllipseSymbolLayerWidget::mVerticalAnchorComboBox_currentIndexChanged( int index )
312 {
313  if ( mLayer )
314  {
316  emit changed();
317  }
318 }
319 
320 void QgsEllipseSymbolLayerWidget::setOffset()
321 {
322  mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
323  emit changed();
324 }
325 
326 
void setOffset(QPointF offset)
Sets the marker&#39;s offset, which is the horizontal and vertical displacement which the rendered marker...
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value...
Meters value as Map units.
Definition: qgsunittypes.h:120
static QIcon symbolLayerPreviewIcon(const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale=QgsMapUnitScale())
Draws a symbol layer preview to an icon.
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol&#39;s offset.
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
const QgsMapUnitScale & strokeWidthMapUnitScale() const
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition: qgis.h:139
QgsEllipseSymbolLayerWidget(QgsVectorLayer *vl, QWidget *parent=nullptr)
Constructor for QgsEllipseSymbolLayerWidget.
void setFillColor(const QColor &c) override
Set fill color.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol&#39;s offset.
VerticalAnchorPoint verticalAnchorPoint() const
Returns the vertical anchor point for positioning the symbol.
void setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
QgsUnitTypes::RenderUnit offsetUnit() const
Returns the units for the symbol&#39;s offset.
void setSymbolWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol&#39;s width.
void setSymbolLayer(QgsSymbolLayer *layer) override
QColor strokeColor() const override
Gets stroke color.
QList< QgsUnitTypes::RenderUnit > RenderUnitList
List of render units.
Definition: qgsunittypes.h:184
Name, eg shape name for simple markers.
const QgsMapUnitScale & symbolHeightMapUnitScale() const
virtual void setColor(const QColor &color)
The fill color.
QgsUnitTypes::RenderUnit symbolHeightUnit() const
Returns the units for the symbol&#39;s height.
HorizontalAnchorPoint horizontalAnchorPoint() const
Returns the horizontal anchor point for positioning the symbol.
Qt::PenJoinStyle penJoinStyle() const
Gets stroke join style.
void changed()
Should be emitted whenever configuration changes happened on this symbol layer configuration.
Qt::PenStyle strokeStyle() const
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
A symbol layer for rendering objects with major and minor axis (e.g.
void setSymbolName(const QString &name)
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol&#39;s stroke width.
points (e.g., for font sizes)
Definition: qgsunittypes.h:118
QgsSymbolLayer * symbolLayer() override
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
HorizontalAnchorPoint
Symbol horizontal anchor points.
VerticalAnchorPoint
Symbol vertical anchor points.
void setSymbolHeightUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol&#39;s height.
void colorChanged(const QColor &color)
Is emitted whenever a new color is set for the button.
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsSymbolLayer::Property key)
Registers a data defined override button.
Stroke style (eg solid, dashed)
void setStrokeStyle(Qt::PenStyle strokeStyle)
void setStrokeColor(const QColor &c) override
Set stroke color.
const QgsMapUnitScale & symbolWidthMapUnitScale() const
void setAngle(double angle)
Sets the rotation angle for the marker.
QColor fillColor() const override
Gets fill color.
QPointF offset() const
Returns the marker&#39;s offset, which is the horizontal and vertical displacement which the rendered mar...
Represents a vector layer which manages a vector based data sets.
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the symbol&#39;s offset.
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
QgsUnitTypes::RenderUnit symbolWidthUnit() const
Returns the units for the symbol&#39;s width.
QgsUnitTypes::RenderUnit strokeWidthUnit() const
Returns the units for the symbol&#39;s stroke width.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
virtual QString layerType() const =0
Returns a string that represents this layer type.