QGIS API Documentation  3.9.0-Master (224899f119)
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  const auto constNames = names;
77  for ( const QString &name : constNames )
78  {
82  lyr->setSymbolName( name );
83  lyr->setStrokeColor( QColor( 0, 0, 0 ) );
84  lyr->setFillColor( QColor( 200, 200, 200 ) );
85  lyr->setSymbolWidth( markerSize );
86  lyr->setSymbolHeight( markerSize * 0.75 );
87  QIcon icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( lyr, QgsUnitTypes::RenderPixels, QSize( size, size ) );
88  QListWidgetItem *item = new QListWidgetItem( icon, QString(), mShapeListWidget );
89  item->setToolTip( name );
90  item->setData( Qt::UserRole, name );
91  delete lyr;
92  }
93  // show at least 2 rows (only 1 row is required, but looks too cramped)
94  mShapeListWidget->setMinimumHeight( mShapeListWidget->gridSize().height() * 2.1 );
95 
96  connect( spinOffsetX, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
97  connect( spinOffsetY, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsEllipseSymbolLayerWidget::setOffset );
98  connect( cboJoinStyle, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEllipseSymbolLayerWidget::penJoinStyleChanged );
99 }
100 
102 {
103  if ( !layer || layer->layerType() != QLatin1String( "EllipseMarker" ) )
104  {
105  return;
106  }
107 
108  mLayer = static_cast<QgsEllipseSymbolLayer *>( layer );
109  mWidthSpinBox->setValue( mLayer->symbolWidth() );
110  mHeightSpinBox->setValue( mLayer->symbolHeight() );
111  mRotationSpinBox->setValue( mLayer->angle() );
112  mStrokeStyleComboBox->setPenStyle( mLayer->strokeStyle() );
113  mStrokeWidthSpinBox->setValue( mLayer->strokeWidth() );
114  btnChangeColorStroke->setColor( mLayer->strokeColor() );
115  btnChangeColorFill->setColor( mLayer->fillColor() );
116 
117  QList<QListWidgetItem *> symbolItemList = mShapeListWidget->findItems( mLayer->symbolName(), Qt::MatchExactly );
118  if ( !symbolItemList.isEmpty() )
119  {
120  mShapeListWidget->setCurrentItem( symbolItemList.at( 0 ) );
121  }
122 
123  //set combo entries to current values
124  blockComboSignals( true );
125  mSymbolWidthUnitWidget->setUnit( mLayer->symbolWidthUnit() );
126  mSymbolWidthUnitWidget->setMapUnitScale( mLayer->symbolWidthMapUnitScale() );
127  mStrokeWidthUnitWidget->setUnit( mLayer->strokeWidthUnit() );
128  mStrokeWidthUnitWidget->setMapUnitScale( mLayer->strokeWidthMapUnitScale() );
129  mSymbolHeightUnitWidget->setUnit( mLayer->symbolHeightUnit() );
130  mSymbolHeightUnitWidget->setMapUnitScale( mLayer->symbolHeightMapUnitScale() );
131  mOffsetUnitWidget->setUnit( mLayer->offsetUnit() );
132  mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() );
133  QPointF offsetPt = mLayer->offset();
134  spinOffsetX->setValue( offsetPt.x() );
135  spinOffsetY->setValue( offsetPt.y() );
136  mHorizontalAnchorComboBox->setCurrentIndex( mLayer->horizontalAnchorPoint() );
137  mVerticalAnchorComboBox->setCurrentIndex( mLayer->verticalAnchorPoint() );
138  cboJoinStyle->setPenJoinStyle( mLayer->penJoinStyle() );
139  blockComboSignals( false );
140 
153 
154 }
155 
157 {
158  return mLayer;
159 }
160 
161 void QgsEllipseSymbolLayerWidget::mShapeListWidget_itemSelectionChanged()
162 {
163  if ( mLayer )
164  {
165  QListWidgetItem *item = mShapeListWidget->currentItem();
166  if ( item )
167  {
168  mLayer->setSymbolName( item->data( Qt::UserRole ).toString() );
169  emit changed();
170  }
171  }
172 }
173 
174 void QgsEllipseSymbolLayerWidget::mWidthSpinBox_valueChanged( double d )
175 {
176  if ( mLayer )
177  {
178  mLayer->setSymbolWidth( d );
179  emit changed();
180  }
181 }
182 
183 void QgsEllipseSymbolLayerWidget::mHeightSpinBox_valueChanged( double d )
184 {
185  if ( mLayer )
186  {
187  mLayer->setSymbolHeight( d );
188  emit changed();
189  }
190 }
191 
192 void QgsEllipseSymbolLayerWidget::mRotationSpinBox_valueChanged( double d )
193 {
194  if ( mLayer )
195  {
196  mLayer->setAngle( d );
197  emit changed();
198  }
199 }
200 
201 void QgsEllipseSymbolLayerWidget::mStrokeStyleComboBox_currentIndexChanged( int index )
202 {
203  Q_UNUSED( index )
204 
205  if ( mLayer )
206  {
207  mLayer->setStrokeStyle( mStrokeStyleComboBox->penStyle() );
208  emit changed();
209  }
210 }
211 
212 void QgsEllipseSymbolLayerWidget::mStrokeWidthSpinBox_valueChanged( double d )
213 {
214  if ( mLayer )
215  {
216  mLayer->setStrokeWidth( d );
217  emit changed();
218  }
219 }
220 
221 void QgsEllipseSymbolLayerWidget::btnChangeColorStroke_colorChanged( const QColor &newColor )
222 {
223  if ( !mLayer )
224  {
225  return;
226  }
227 
228  mLayer->setStrokeColor( newColor );
229  emit changed();
230 }
231 
232 void QgsEllipseSymbolLayerWidget::btnChangeColorFill_colorChanged( const QColor &newColor )
233 {
234  if ( !mLayer )
235  {
236  return;
237  }
238 
239  mLayer->setFillColor( newColor );
240  emit changed();
241 }
242 
243 void QgsEllipseSymbolLayerWidget::mSymbolWidthUnitWidget_changed()
244 {
245  if ( mLayer )
246  {
247  mLayer->setSymbolWidthUnit( mSymbolWidthUnitWidget->unit() );
248  mLayer->setSymbolWidthMapUnitScale( mSymbolWidthUnitWidget->getMapUnitScale() );
249  emit changed();
250  }
251 }
252 
253 void QgsEllipseSymbolLayerWidget::mStrokeWidthUnitWidget_changed()
254 {
255  if ( mLayer )
256  {
257  mLayer->setStrokeWidthUnit( mStrokeWidthUnitWidget->unit() );
258  mLayer->setStrokeWidthMapUnitScale( mStrokeWidthUnitWidget->getMapUnitScale() );
259  emit changed();
260  }
261 }
262 
263 void QgsEllipseSymbolLayerWidget::mSymbolHeightUnitWidget_changed()
264 {
265  if ( mLayer )
266  {
267  mLayer->setSymbolHeightUnit( mSymbolHeightUnitWidget->unit() );
268  mLayer->setSymbolHeightMapUnitScale( mSymbolHeightUnitWidget->getMapUnitScale() );
269  emit changed();
270  }
271 }
272 
273 void QgsEllipseSymbolLayerWidget::mOffsetUnitWidget_changed()
274 {
275  if ( mLayer )
276  {
277  mLayer->setOffsetUnit( mOffsetUnitWidget->unit() );
278  mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() );
279  emit changed();
280  }
281 }
282 
283 void QgsEllipseSymbolLayerWidget::penJoinStyleChanged()
284 {
285  mLayer->setPenJoinStyle( cboJoinStyle->penJoinStyle() );
286  emit changed();
287 }
288 
289 void QgsEllipseSymbolLayerWidget::blockComboSignals( bool block )
290 {
291  mSymbolWidthUnitWidget->blockSignals( block );
292  mStrokeWidthUnitWidget->blockSignals( block );
293  mSymbolHeightUnitWidget->blockSignals( block );
294  mHorizontalAnchorComboBox->blockSignals( block );
295  mVerticalAnchorComboBox->blockSignals( block );
296  mSymbolWidthUnitWidget->blockSignals( block );
297  mStrokeWidthUnitWidget->blockSignals( block );
298  mSymbolHeightUnitWidget->blockSignals( block );
299  mOffsetUnitWidget->blockSignals( block );
300  cboJoinStyle->blockSignals( block );
301 }
302 
303 void QgsEllipseSymbolLayerWidget::mHorizontalAnchorComboBox_currentIndexChanged( int index )
304 {
305  if ( mLayer )
306  {
308  emit changed();
309  }
310 }
311 
312 void QgsEllipseSymbolLayerWidget::mVerticalAnchorComboBox_currentIndexChanged( int index )
313 {
314  if ( mLayer )
315  {
317  emit changed();
318  }
319 }
320 
321 void QgsEllipseSymbolLayerWidget::setOffset()
322 {
323  mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
324  emit changed();
325 }
326 
327 
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:122
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:186
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.
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)
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.
Points (e.g., for font sizes)
Definition: qgsunittypes.h:119
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.