QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgspointclusterrendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspointclusterrendererwidget.cpp
3 ---------------------------------
4 begin : February 2016
5 copyright : (C) 2016 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsapplication.h"
21#include "qgsmarkersymbol.h"
23#include "qgsrendererregistry.h"
24#include "qgsstyle.h"
26#include "qgsvectorlayer.h"
27
28#include <QString>
29
30#include "moc_qgspointclusterrendererwidget.cpp"
31
32using namespace Qt::StringLiterals;
33
38
40 : QgsRendererWidget( layer, style )
41
42{
43 if ( !layer )
44 {
45 return;
46 }
47
48 //the renderer only applies to point vector layers
50 {
51 //setup blank dialog
52 mRenderer = nullptr;
53 setupBlankUi( layer->name() );
54 return;
55 }
56 setupUi( this );
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 );
59 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointClusterRendererWidget::mDistanceUnitWidget_changed );
60 connect( mRendererSettingsButton, &QPushButton::clicked, this, &QgsPointClusterRendererWidget::mRendererSettingsButton_clicked );
61 this->layout()->setContentsMargins( 0, 0, 0, 0 );
62
64
65 mCenterSymbolToolButton->setSymbolType( Qgis::SymbolType::Marker );
66
67 if ( renderer )
68 {
70 }
71 if ( !mRenderer )
72 {
73 mRenderer = std::make_unique<QgsPointClusterRenderer>();
74 if ( renderer )
75 renderer->copyRendererData( mRenderer.get() );
76 }
77
78 blockAllSignals( true );
79
80 //insert possible renderer types
82 QStringList::const_iterator it = rendererList.constBegin();
83 for ( ; it != rendererList.constEnd(); ++it )
84 {
85 if ( *it != "pointDisplacement"_L1 && *it != "pointCluster"_L1 && *it != "heatmapRenderer"_L1 )
86 {
88 mRendererComboBox->addItem( m->icon(), m->visibleName(), *it );
89 }
90 }
91
92 mDistanceSpinBox->setValue( mRenderer->tolerance() );
93 mDistanceUnitWidget->setUnit( mRenderer->toleranceUnit() );
94 mDistanceUnitWidget->setMapUnitScale( mRenderer->toleranceMapUnitScale() );
95 mCenterSymbolToolButton->setSymbol( mRenderer->clusterSymbol()->clone() );
96
97 blockAllSignals( false );
98
99 //set the appropriate renderer dialog
100 if ( mRenderer->embeddedRenderer() )
101 {
102 const QString rendererName = mRenderer->embeddedRenderer()->type();
103 const int rendererIndex = mRendererComboBox->findData( rendererName );
104 if ( rendererIndex != -1 )
105 {
106 mRendererComboBox->setCurrentIndex( rendererIndex );
107 mRendererComboBox_currentIndexChanged( rendererIndex );
108 }
109 }
110
111 connect( mCenterSymbolToolButton, &QgsSymbolButton::changed, this, &QgsPointClusterRendererWidget::centerSymbolChanged );
112 mCenterSymbolToolButton->setDialogTitle( tr( "Cluster symbol" ) );
113 mCenterSymbolToolButton->setLayer( mLayer );
114 mCenterSymbolToolButton->registerExpressionContextGenerator( this );
115}
116
118
120{
121 return mRenderer.get();
122}
123
125{
127 if ( mDistanceUnitWidget )
128 mDistanceUnitWidget->setMapCanvas( context.mapCanvas() );
129 if ( mCenterSymbolToolButton )
130 {
131 mCenterSymbolToolButton->setMapCanvas( context.mapCanvas() );
132 mCenterSymbolToolButton->setMessageBar( context.messageBar() );
133 }
134}
135
136void QgsPointClusterRendererWidget::mRendererComboBox_currentIndexChanged( int index )
137{
138 const QString rendererId = mRendererComboBox->itemData( index ).toString();
140 if ( m )
141 {
142 // unfortunately renderer conversion is only available through the creation of a widget...
143 const std::unique_ptr<QgsFeatureRenderer> oldRenderer( mRenderer->embeddedRenderer()->clone() );
144 QgsRendererWidget *tempRenderWidget = m->createRendererWidget( mLayer, mStyle, oldRenderer.get() );
145 mRenderer->setEmbeddedRenderer( tempRenderWidget->renderer()->clone() );
146 delete tempRenderWidget;
147 }
148 emit widgetChanged();
149}
150
151void QgsPointClusterRendererWidget::mRendererSettingsButton_clicked()
152{
153 if ( !mRenderer )
154 return;
155
156 QgsRendererAbstractMetadata *m = QgsApplication::rendererRegistry()->rendererMetadata( mRenderer->embeddedRenderer()->type() );
157 if ( m )
158 {
159 QgsRendererWidget *w = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() );
160 w->setPanelTitle( tr( "Renderer Settings" ) );
161
162 QgsExpressionContextScope scope;
163 scope.addVariable( QgsExpressionContextScope::StaticVariable( QgsExpressionContext::EXPR_CLUSTER_COLOR, "", true ) );
164 scope.addVariable( QgsExpressionContextScope::StaticVariable( QgsExpressionContext::EXPR_CLUSTER_SIZE, 0, true ) );
165 QList<QgsExpressionContextScope> scopes = mContext.additionalExpressionContextScopes();
166 scopes << scope;
167 QgsSymbolWidgetContext context = mContext;
168 context.setAdditionalExpressionContextScopes( scopes );
169 w->setContext( context );
171 connect( w, &QgsPanelWidget::widgetChanged, this, &QgsPointClusterRendererWidget::updateRendererFromWidget );
172 w->setDockMode( this->dockMode() );
173 openPanel( w );
174 }
175}
176
177void QgsPointClusterRendererWidget::mDistanceSpinBox_valueChanged( double d )
178{
179 if ( mRenderer )
180 {
181 mRenderer->setTolerance( d );
182 }
183 emit widgetChanged();
184}
185
186void QgsPointClusterRendererWidget::mDistanceUnitWidget_changed()
187{
188 if ( mRenderer )
189 {
190 mRenderer->setToleranceUnit( mDistanceUnitWidget->unit() );
191 mRenderer->setToleranceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() );
192 }
193 emit widgetChanged();
194}
195
196void QgsPointClusterRendererWidget::blockAllSignals( bool block )
197{
198 mRendererComboBox->blockSignals( block );
199 mCenterSymbolToolButton->blockSignals( block );
200 mDistanceSpinBox->blockSignals( block );
201 mDistanceUnitWidget->blockSignals( block );
202}
203
205{
207 if ( auto *lExpressionContext = mContext.expressionContext() )
208 context = *lExpressionContext;
209 else
210 context.appendScopes( mContext.globalProjectAtlasMapLayerScopes( mLayer ) );
214 QList<QgsExpressionContextScope> scopes = mContext.additionalExpressionContextScopes();
215 scopes << scope;
216 const auto constScopes = scopes;
217 for ( const QgsExpressionContextScope &s : constScopes )
218 {
220 }
222 return context;
223}
224
225void QgsPointClusterRendererWidget::centerSymbolChanged()
226{
227 mRenderer->setClusterSymbol( mCenterSymbolToolButton->clonedSymbol<QgsMarkerSymbol>() );
228 emit widgetChanged();
229}
230
231void QgsPointClusterRendererWidget::updateRendererFromWidget()
232{
233 QgsRendererWidget *w = qobject_cast<QgsRendererWidget *>( sender() );
234 if ( !w )
235 return;
236
237 mRenderer->setEmbeddedRenderer( w->renderer()->clone() );
238 emit widgetChanged();
239}
240
241void QgsPointClusterRendererWidget::setupBlankUi( const QString &layerName )
242{
243 QGridLayout *layout = new QGridLayout( this );
244 QLabel *label = 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 );
245 layout->addWidget( label );
246}
@ Point
Points.
Definition qgis.h:366
@ Millimeters
Millimeters.
Definition qgis.h:5256
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5260
@ MapUnits
Map units.
Definition qgis.h:5257
@ Pixels
Pixels.
Definition qgis.h:5258
@ Inches
Inches.
Definition qgis.h:5261
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5263
@ Marker
Marker symbol.
Definition qgis.h:630
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.
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
bool dockMode() const
Returns the dock mode state.
void widgetChanged()
Emitted when the widget state changes.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
QgsPointClusterRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor for QgsPointClusterRendererWidget.
~QgsPointClusterRendererWidget() override
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void setContext(const QgsSymbolWidgetContext &context) override
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership).
static QgsRendererWidget * create(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Returns a new QgsPointClusterRendererWidget.
static QgsPointClusterRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsPointClusterRenderer from an existing renderer.
Stores metadata about one renderer class.
@ PointLayer
Compatible with point layers.
QIcon icon() const
Returns an icon representing the renderer.
QString visibleName() const
Returns a friendly display name of the renderer.
virtual QgsRendererWidget * createRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *oldRenderer)
Returns new instance of settings widget for the 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.
Base class for renderer settings widgets.
QgsRendererWidget(QgsVectorLayer *layer, QgsStyle *style)
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
QgsSymbolWidgetContext mContext
Context in which widget is shown.
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
virtual QgsFeatureRenderer * renderer()=0
Returns pointer to the renderer (no transfer of ownership).
virtual void disableSymbolLevels()
Disables symbol level modification on the widget.
QgsSymbolWidgetContext context() const
Returns the context in which the renderer widget is shown, e.g., the associated map canvas and expres...
QgsVectorLayer * mLayer
A database of saved style entities, including symbols, color ramps, text formats and others.
Definition qgsstyle.h:89
void changed()
Emitted when the symbol's settings are changed.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
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 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.