35#include "qgsvirtualpointcloudprovider.h"
39#include "moc_qgspointcloudrendererpropertieswidget.cpp"
41using namespace Qt::StringLiterals;
46 if ( !rendererAbstractMetadata )
49 if ( !rendererMetadata )
54 if ( !iconName.isEmpty() )
63void QgsPointCloudRendererPropertiesWidget::initRendererWidgetFunctions()
65 static bool sInitialized =
false;
69 initPointCloudRenderer( u
"extent"_s, QgsPointCloudExtentRendererWidget::create, u
"styleicons/pointcloudextent.svg"_s );
70 initPointCloudRenderer( u
"rgb"_s, QgsPointCloudRgbRendererWidget::create, u
"styleicons/multibandcolor.svg"_s );
71 initPointCloudRenderer( u
"ramp"_s, QgsPointCloudAttributeByRampRendererWidget::create, u
"styleicons/singlebandpseudocolor.svg"_s );
72 initPointCloudRenderer( u
"classified"_s, QgsPointCloudClassifiedRendererWidget::create, u
"styleicons/paletted.svg"_s );
84 layout()->setContentsMargins( 0, 0, 0, 0 );
87 initRendererWidgetFunctions();
91 for (
const QString &name : renderers )
94 cboRenderers->addItem( m->icon(), m->visibleName(), name );
97 cboRenderers->setCurrentIndex( -1 );
102 connect( cboRenderers,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::rendererChanged );
104 connect( mBlendModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
109 connect( mPointSizeSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
117 mMaxErrorSpinBox->setClearValue( 0.3 );
119 mHorizontalTriangleThresholdSpinBox->setClearValue( 5.0 );
122 connect( mMaxErrorSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
125 connect( mPointStyleComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
126 connect( mDrawOrderComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
128 connect( mTriangulateGroupBox, &QGroupBox::toggled,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
129 connect( mHorizontalTriangleCheckBox, &QCheckBox::clicked,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
130 connect( mHorizontalTriangleThresholdSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
134 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
136 mLabelOptions->setDialogTitle( tr(
"Customize label text" ) );
137 mLabelOptions->setText( tr(
"Label format" ) );
138 connect( mLabels, &QCheckBox::stateChanged,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
139 connect( mLabelOptions, &
QgsFontButton::changed,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
142 if (
const QgsVirtualPointCloudProvider *vpcProvider =
dynamic_cast<QgsVirtualPointCloudProvider *
>( mLayer->dataProvider() ) )
144 if ( vpcProvider->overview() )
149 for (
auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it )
151 mOverviewSwitchingScale->addItem( it.value(), it.key() );
153 setOverviewSwitchingScale( 1.0 );
158 mZoomOutOptions->setEnabled(
false );
159 mOverviewSwitchingScale->setEnabled(
false );
162 connect( mOverviewSwitchingScale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
164 connect( mZoomOutOptions, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this](
int ) {
168 mLabels->setEnabled(
false );
169 mLabelOptions->setEnabled(
false );
173 mLabels->setEnabled(
true );
174 mLabelOptions->setEnabled(
true );
181 mVpcGroupBox->setVisible(
false );
193 mActiveWidget->setContext( context );
199 mLayer = qobject_cast<QgsPointCloudLayer *>( layer );
201 mBlockChangedSignal =
true;
202 mOpacityWidget->setOpacity( mLayer->opacity() );
204 mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
206 if ( mLayer->renderer() )
209 const QString rendererName = mLayer->renderer()->type();
211 const int rendererIdx = cboRenderers->findData( rendererName );
212 if ( cboRenderers->currentIndex() != rendererIdx )
214 cboRenderers->setCurrentIndex( rendererIdx );
222 Q_ASSERT( rendererIdx != -1 &&
"there must be a renderer!" );
224 mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
225 mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
226 mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
228 mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( QVariant::fromValue( mLayer->renderer()->pointSymbol() ) ) );
229 mDrawOrderComboBox->setCurrentIndex( mDrawOrderComboBox->findData( QVariant::fromValue( mLayer->renderer()->drawOrder2d() ) ) );
231 mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() );
232 mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() );
233 setOverviewSwitchingScale( mLayer->renderer()->overviewSwitchingScale() );
235 mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() );
236 mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() );
237 mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() );
238 mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() );
240 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
242 mLabels->setChecked( mLayer->renderer()->showLabels() );
243 mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() );
244 mZoomOutOptions->setCurrentIndex( mZoomOutOptions->findData( QVariant::fromValue( mLayer->renderer()->zoomOutBehavior() ) ) );
245 switch ( mLayer->renderer()->zoomOutBehavior() )
248 mLabels->setEnabled(
false );
249 mLabelOptions->setEnabled(
false );
252 mLabels->setEnabled(
true );
253 mLabelOptions->setEnabled(
true );
258 mBlockChangedSignal =
false;
264 mActiveWidget->setDockMode(
dockMode );
270 mLayer->setOpacity( mOpacityWidget->opacity() );
271 mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
274 mLayer->setRenderer( mActiveWidget->renderer() );
275 else if ( !cboRenderers->currentData().toString().isEmpty() )
284 mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
285 mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
286 mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
290 mLayer->renderer()->setMaximumScreenError( mMaxErrorSpinBox->value() );
291 mLayer->renderer()->setMaximumScreenErrorUnit( mMaxErrorUnitWidget->unit() );
294 mLayer->renderer()->setRenderAsTriangles( mTriangulateGroupBox->isChecked() );
295 mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() );
296 mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() );
297 mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() );
299 mLayer->renderer()->setShowLabels( mLabels->isChecked() );
300 mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() );
303 mLayer->renderer()->setOverviewSwitchingScale( overviewSwitchingScale() );
306void QgsPointCloudRendererPropertiesWidget::rendererChanged()
308 if ( cboRenderers->currentIndex() == -1 )
310 QgsDebugError( u
"No current item -- this should never happen!"_s );
314 const QString rendererName = cboRenderers->currentData().toString();
317 std::unique_ptr<QgsPointCloudRenderer> oldRenderer;
318 std::unique_ptr<QgsPointCloudRenderer> newRenderer;
320 newRenderer.reset( mActiveWidget->renderer() );
324 oldRenderer = std::move( newRenderer );
328 oldRenderer.reset( mLayer->renderer()->clone() );
334 stackedWidget->removeWidget( mActiveWidget );
336 delete mActiveWidget;
337 mActiveWidget =
nullptr;
340 QgsPointCloudRendererWidget *widget =
nullptr;
342 if ( rendererMetadata )
349 mActiveWidget = widget;
350 stackedWidget->addWidget( mActiveWidget );
351 stackedWidget->setCurrentWidget( mActiveWidget );
353 if ( mMapCanvas || mMessageBar )
355 QgsSymbolWidgetContext context;
358 mActiveWidget->setContext( context );
368 stackedWidget->setCurrentWidget( pageNoWidget );
373void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged()
375 if ( !mBlockChangedSignal )
379void QgsPointCloudRendererPropertiesWidget::setOverviewSwitchingScale(
double scale )
381 mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) );
384double QgsPointCloudRendererPropertiesWidget::overviewSwitchingScale()
const
386 return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() );
PointCloudSymbol
Rendering symbols for point cloud points.
@ Circle
Renders points as circles.
@ Square
Renders points as squares.
PointCloudDrawOrder
Pointcloud rendering order for 2d views.
@ BottomToTop
Draw points with larger Z values last.
@ Default
Draw points in the order they are stored.
@ TopToBottom
Draw points with larger Z values first.
PointCloudZoomOutRenderBehavior
Point cloud zoom out options.
@ RenderOverviewAndExtents
Render point cloud extents over overview point cloud.
@ RenderExtents
Render only point cloud extents when zoomed out.
@ RenderOverview
Render overview point cloud when zoomed out.
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ MetersInMapUnits
Meters value as Map units.
static QgsPointCloudRendererRegistry * pointCloudRendererRegistry()
Returns the application's point cloud renderer registry, used for managing point cloud layer 2D rende...
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Base class for all map layer types.
Represents a map layer supporting display of point clouds.
Registry of 2D renderers for point clouds.
QgsPointCloudRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
QStringList renderersList() const
Returns a list of available renderers.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
A container for the context for various read/write operations on objects.
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,...
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
void setMessageBar(QgsMessageBar *bar)
Sets the message bar associated with the widget.
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QgsPointCloudRendererWidget *(* QgsPointCloudRendererWidgetFunc)(QgsPointCloudLayer *, QgsStyle *, QgsPointCloudRenderer *)