30#include "moc_qgspointclusterrendererwidget.cpp"
32using namespace Qt::StringLiterals;
53 setupBlankUi( layer->name() );
57 connect( mRendererComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointClusterRendererWidget::mRendererComboBox_currentIndexChanged );
58 connect( mDistanceSpinBox,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, &QgsPointClusterRendererWidget::mDistanceSpinBox_valueChanged );
60 connect( mRendererSettingsButton, &QPushButton::clicked,
this, &QgsPointClusterRendererWidget::mRendererSettingsButton_clicked );
61 this->layout()->setContentsMargins( 0, 0, 0, 0 );
63 mDistanceUnitWidget->setUnits(
75 mRenderer = std::make_unique<QgsPointClusterRenderer>();
77 renderer->copyRendererData( mRenderer.get() );
80 blockAllSignals(
true );
84 QStringList::const_iterator it = rendererList.constBegin();
85 for ( ; it != rendererList.constEnd(); ++it )
87 if ( *it !=
"pointDisplacement"_L1 && *it !=
"pointCluster"_L1 && *it !=
"heatmapRenderer"_L1 )
94 mDistanceSpinBox->setValue( mRenderer->tolerance() );
95 mDistanceUnitWidget->setUnit( mRenderer->toleranceUnit() );
96 mDistanceUnitWidget->setMapUnitScale( mRenderer->toleranceMapUnitScale() );
97 mCenterSymbolToolButton->setSymbol( mRenderer->clusterSymbol()->clone() );
99 blockAllSignals(
false );
102 if ( mRenderer->embeddedRenderer() )
104 const QString rendererName = mRenderer->embeddedRenderer()->type();
105 const int rendererIndex = mRendererComboBox->findData( rendererName );
106 if ( rendererIndex != -1 )
108 mRendererComboBox->setCurrentIndex( rendererIndex );
109 mRendererComboBox_currentIndexChanged( rendererIndex );
113 connect( mCenterSymbolToolButton, &
QgsSymbolButton::changed,
this, &QgsPointClusterRendererWidget::centerSymbolChanged );
114 mCenterSymbolToolButton->setDialogTitle( tr(
"Cluster symbol" ) );
115 mCenterSymbolToolButton->setLayer(
mLayer );
116 mCenterSymbolToolButton->registerExpressionContextGenerator(
this );
123 return mRenderer.get();
129 if ( mDistanceUnitWidget )
130 mDistanceUnitWidget->setMapCanvas(
context.mapCanvas() );
131 if ( mCenterSymbolToolButton )
133 mCenterSymbolToolButton->setMapCanvas(
context.mapCanvas() );
134 mCenterSymbolToolButton->setMessageBar(
context.messageBar() );
138void QgsPointClusterRendererWidget::mRendererComboBox_currentIndexChanged(
int index )
140 const QString rendererId = mRendererComboBox->itemData( index ).toString();
145 const std::unique_ptr<QgsFeatureRenderer> oldRenderer( mRenderer->embeddedRenderer()->clone() );
147 mRenderer->setEmbeddedRenderer( tempRenderWidget->
renderer()->
clone() );
148 delete tempRenderWidget;
153void QgsPointClusterRendererWidget::mRendererSettingsButton_clicked()
164 QgsExpressionContextScope scope;
167 QList<QgsExpressionContextScope> scopes =
mContext.additionalExpressionContextScopes();
170 context.setAdditionalExpressionContextScopes( scopes );
179void QgsPointClusterRendererWidget::mDistanceSpinBox_valueChanged(
double d )
183 mRenderer->setTolerance( d );
188void QgsPointClusterRendererWidget::mDistanceUnitWidget_changed()
192 mRenderer->setToleranceUnit( mDistanceUnitWidget->unit() );
193 mRenderer->setToleranceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() );
198void QgsPointClusterRendererWidget::blockAllSignals(
bool block )
200 mRendererComboBox->blockSignals( block );
201 mCenterSymbolToolButton->blockSignals( block );
202 mDistanceSpinBox->blockSignals( block );
203 mDistanceUnitWidget->blockSignals( block );
209 if (
auto *lExpressionContext =
mContext.expressionContext() )
216 QList<QgsExpressionContextScope> scopes =
mContext.additionalExpressionContextScopes();
218 const auto constScopes = scopes;
227void QgsPointClusterRendererWidget::centerSymbolChanged()
229 mRenderer->setClusterSymbol( mCenterSymbolToolButton->clonedSymbol<
QgsMarkerSymbol>() );
233void QgsPointClusterRendererWidget::updateRendererFromWidget()
243void QgsPointClusterRendererWidget::setupBlankUi(
const QString &layerName )
245 QGridLayout *layout =
new QGridLayout(
this );
247 =
new QLabel( tr(
"The point cluster renderer only applies to (single) point layers. \n'%1' is not a (single) point layer and cannot be displayed by the point cluster renderer." ).arg( layerName ),
this );
248 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.
A marker symbol type, for rendering Point and MultiPoint geometries.
static QgsPointClusterRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsPointClusterRenderer from an existing renderer.
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.