31#include "moc_qgspointdisplacementrendererwidget.cpp"
33using namespace Qt::StringLiterals;
54 setupBlankUi( layer->name() );
58 connect( mLabelFieldComboBox, &QComboBox::currentTextChanged,
this, &QgsPointDisplacementRendererWidget::mLabelFieldComboBox_currentIndexChanged );
59 connect( mRendererComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointDisplacementRendererWidget::mRendererComboBox_currentIndexChanged );
60 connect( mPlacementComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointDisplacementRendererWidget::mPlacementComboBox_currentIndexChanged );
61 connect( mCircleWidthSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsPointDisplacementRendererWidget::mCircleWidthSpinBox_valueChanged );
62 connect( mCircleColorButton, &
QgsColorButton::colorChanged,
this, &QgsPointDisplacementRendererWidget::mCircleColorButton_colorChanged );
63 connect( mDistanceSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsPointDisplacementRendererWidget::mDistanceSpinBox_valueChanged );
66 connect( mCircleModificationSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsPointDisplacementRendererWidget::mCircleModificationSpinBox_valueChanged );
67 connect( mLabelDistanceFactorSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsPointDisplacementRendererWidget::mLabelDistanceFactorSpinBox_valueChanged );
68 connect( mScaleDependentLabelsCheckBox, &QCheckBox::stateChanged,
this, &QgsPointDisplacementRendererWidget::mScaleDependentLabelsCheckBox_stateChanged );
69 connect( mRendererSettingsButton, &QPushButton::clicked,
this, &QgsPointDisplacementRendererWidget::mRendererSettingsButton_clicked );
70 this->layout()->setContentsMargins( 0, 0, 0, 0 );
73 mDistanceUnitWidget->setUnits(
84 mRenderer = std::make_unique<QgsPointDisplacementRenderer>();
86 renderer->copyRendererData( mRenderer.get() );
89 blockAllSignals(
true );
99 for (
const QgsField &f : layerFields )
101 mLabelFieldComboBox->addItem( f.name() );
103 mLabelFieldComboBox->addItem( tr(
"None" ) );
105 const QString currentLabelAttribute = mRenderer->labelAttributeName();
106 if ( !currentLabelAttribute.isEmpty() )
108 mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) );
112 mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr(
"None" ) ) );
118 QStringList::const_iterator it = rendererList.constBegin();
119 for ( ; it != rendererList.constEnd(); ++it )
121 if ( *it !=
"pointDisplacement"_L1 && *it !=
"pointCluster"_L1 && *it !=
"heatmapRenderer"_L1 )
128 mCircleColorButton->setColorDialogTitle( tr(
"Select Color" ) );
129 mCircleColorButton->setContext( u
"symbology"_s );
130 mCircleColorButton->setAllowOpacity(
true );
131 mCircleColorButton->setShowNoColor(
true );
132 mCircleColorButton->setNoColorString( tr(
"Transparent Stroke" ) );
133 mCircleColorButton->setOpaqueColorString( tr(
"Opaque Stroke" ) );
134 mLabelColorButton->setContext( u
"symbology"_s );
135 mLabelColorButton->setColorDialogTitle( tr(
"Select Color" ) );
136 mLabelColorButton->setAllowOpacity(
true );
138 mCircleWidthSpinBox->setValue( mRenderer->circleWidth() );
139 mCircleColorButton->setColor( mRenderer->circleColor() );
140 mLabelColorButton->setColor( mRenderer->labelColor() );
141 mLabelFontButton->setCurrentFont( mRenderer->labelFont() );
142 mCircleModificationSpinBox->setClearValue( 0.0 );
143 mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() );
144 mLabelDistanceFactorSpinBox->setClearValue( 0.5 );
145 mLabelDistanceFactorSpinBox->setValue( mRenderer->labelDistanceFactor() );
146 mDistanceSpinBox->setValue( mRenderer->tolerance() );
147 mDistanceUnitWidget->setUnit( mRenderer->toleranceUnit() );
148 mDistanceUnitWidget->setMapUnitScale( mRenderer->toleranceMapUnitScale() );
149 mCenterSymbolToolButton->setSymbol( mRenderer->centerSymbol()->clone() );
151 mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( mRenderer->placement() ) );
154 mMinLabelScaleWidget->setScale( std::max( mRenderer->minimumLabelScale(), 0.0 ) );
155 if ( mRenderer->minimumLabelScale() > 0 )
157 mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked );
161 mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked );
162 mMinLabelScaleWidget->setEnabled(
false );
166 blockAllSignals(
false );
169 if ( mRenderer->embeddedRenderer() )
171 const QString rendererName = mRenderer->embeddedRenderer()->type();
172 const int rendererIndex = mRendererComboBox->findData( rendererName );
173 if ( rendererIndex != -1 )
175 mRendererComboBox->setCurrentIndex( rendererIndex );
176 mRendererComboBox_currentIndexChanged( rendererIndex );
181 connect( mLabelFontButton, &
QgsFontButton::changed,
this, &QgsPointDisplacementRendererWidget::labelFontChanged );
182 connect( mCenterSymbolToolButton, &
QgsSymbolButton::changed,
this, &QgsPointDisplacementRendererWidget::centerSymbolChanged );
183 mCenterSymbolToolButton->setDialogTitle( tr(
"Center symbol" ) );
184 mCenterSymbolToolButton->setLayer(
mLayer );
185 mCenterSymbolToolButton->registerExpressionContextGenerator(
this );
192 return mRenderer.get();
198 if ( mDistanceUnitWidget )
199 mDistanceUnitWidget->setMapCanvas(
context.mapCanvas() );
200 if ( mMinLabelScaleWidget )
202 mMinLabelScaleWidget->setMapCanvas(
context.mapCanvas() );
203 mMinLabelScaleWidget->setShowCurrentScaleButton(
true );
205 if ( mCenterSymbolToolButton )
207 mCenterSymbolToolButton->setMapCanvas(
context.mapCanvas() );
208 mCenterSymbolToolButton->setMessageBar(
context.messageBar() );
215 if (
auto *lExpressionContext =
mContext.expressionContext() )
222 QList<QgsExpressionContextScope> scopes =
mContext.additionalExpressionContextScopes();
231void QgsPointDisplacementRendererWidget::mLabelFieldComboBox_currentIndexChanged(
const QString &text )
235 if ( text == tr(
"None" ) )
237 mRenderer->setLabelAttributeName( QString() );
241 mRenderer->setLabelAttributeName( text );
247void QgsPointDisplacementRendererWidget::mRendererComboBox_currentIndexChanged(
int index )
249 const QString rendererId = mRendererComboBox->itemData( index ).toString();
254 const std::unique_ptr<QgsFeatureRenderer> oldRenderer( mRenderer->embeddedRenderer()->clone() );
256 mRenderer->setEmbeddedRenderer( tempRenderWidget->
renderer()->
clone() );
257 delete tempRenderWidget;
262void QgsPointDisplacementRendererWidget::mPlacementComboBox_currentIndexChanged(
int index )
271void QgsPointDisplacementRendererWidget::mRendererSettingsButton_clicked()
284 QgsExpressionContextScope scope;
287 QList<QgsExpressionContextScope> scopes =
context.additionalExpressionContextScopes();
289 context.setAdditionalExpressionContextScopes( scopes );
298void QgsPointDisplacementRendererWidget::labelFontChanged()
305 mRenderer->setLabelFont( mLabelFontButton->currentFont() );
309void QgsPointDisplacementRendererWidget::mCircleWidthSpinBox_valueChanged(
double d )
313 mRenderer->setCircleWidth( d );
318void QgsPointDisplacementRendererWidget::mCircleColorButton_colorChanged(
const QColor &newColor )
325 mRenderer->setCircleColor( newColor );
329void QgsPointDisplacementRendererWidget::mLabelColorButton_colorChanged(
const QColor &newColor )
336 mRenderer->setLabelColor( newColor );
340void QgsPointDisplacementRendererWidget::mCircleModificationSpinBox_valueChanged(
double d )
347 mRenderer->setCircleRadiusAddition( d );
351void QgsPointDisplacementRendererWidget::mLabelDistanceFactorSpinBox_valueChanged(
double d )
358 mRenderer->setLabelDistanceFactor( d );
362void QgsPointDisplacementRendererWidget::mDistanceSpinBox_valueChanged(
double d )
366 mRenderer->setTolerance( d );
371void QgsPointDisplacementRendererWidget::mDistanceUnitWidget_changed()
375 mRenderer->setToleranceUnit( mDistanceUnitWidget->unit() );
376 mRenderer->setToleranceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() );
381void QgsPointDisplacementRendererWidget::mScaleDependentLabelsCheckBox_stateChanged(
int state )
383 if ( state == Qt::Unchecked )
385 mMinLabelScaleWidget->setScale( 0 );
386 mMinLabelScaleWidget->setEnabled(
false );
390 mMinLabelScaleWidget->setEnabled(
true );
394void QgsPointDisplacementRendererWidget::minLabelScaleChanged(
double scale )
401 mRenderer->setMinimumLabelScale( scale );
405void QgsPointDisplacementRendererWidget::blockAllSignals(
bool block )
407 mLabelFieldComboBox->blockSignals( block );
408 mLabelFontButton->blockSignals( block );
409 mCircleWidthSpinBox->blockSignals( block );
410 mCircleColorButton->blockSignals( block );
411 mRendererComboBox->blockSignals( block );
412 mLabelColorButton->blockSignals( block );
413 mCircleModificationSpinBox->blockSignals( block );
414 mLabelDistanceFactorSpinBox->blockSignals( block );
415 mScaleDependentLabelsCheckBox->blockSignals( block );
416 mMinLabelScaleWidget->blockSignals( block );
417 mCenterSymbolToolButton->blockSignals( block );
418 mDistanceSpinBox->blockSignals( block );
419 mDistanceUnitWidget->blockSignals( block );
420 mPlacementComboBox->blockSignals( block );
423void QgsPointDisplacementRendererWidget::centerSymbolChanged()
425 mRenderer->setCenterSymbol( mCenterSymbolToolButton->clonedSymbol<QgsMarkerSymbol>() );
429void QgsPointDisplacementRendererWidget::updateRendererFromWidget()
439void QgsPointDisplacementRendererWidget::setupBlankUi(
const QString &layerName )
442 =
new QLabel( tr(
"The point displacement renderer only applies to (single) point layers. \n'%1' is not a (single) point layer and cannot be displayed by the point displacement renderer." ).arg( layerName ),
this );
443 QVBoxLayout *layout =
new QVBoxLayout(
this );
444 layout->setContentsMargins( 0, 0, 0, 0 );
445 layout->addWidget( label );
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ MetersInMapUnits
Meters value as Map units.
static QgsRendererRegistry * rendererRegistry()
Returns the application's renderer registry, used for managing vector layer renderers.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static const QString EXPR_CLUSTER_SIZE
Inbuilt variable name for cluster size variable.
static const QString EXPR_CLUSTER_COLOR
Inbuilt variable name for cluster color variable.
Abstract base class for all 2D vector feature renderers.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
static std::unique_ptr< QgsPointDisplacementRenderer > convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsPointDisplacementRenderer from an existing renderer.
Placement
Placement methods for dispersing points.
@ ConcentricRings
Place points in concentric rings around group.
@ Ring
Place points in a single ring around group.
@ Grid
Place points in a grid around group.
QStringList renderersList(QgsRendererAbstractMetadata::LayerTypes layerTypes=QgsRendererAbstractMetadata::All) const
Returns a list of available renderers.
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
A database of saved style entities, including symbols, color ramps, text formats and others.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
Represents a vector layer which manages a vector based dataset.
Q_INVOKABLE Qgis::WkbType wkbType() const final
Returns the WKBType or WKBUnknown in case of error.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
Single variable definition for use within a QgsExpressionContextScope.