QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsmergedfeaturerendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmergedfeaturerendererwidget.cpp
3 ---------------------
4 begin : December 2020
5 copyright : (C) 2020 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
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
17#include <memory>
18
19#include "qgsapplication.h"
21#include "qgsrendererregistry.h"
22#include "qgsvectorlayer.h"
23
24#include <QString>
25
26#include "moc_qgsmergedfeaturerendererwidget.cpp"
27
28using namespace Qt::StringLiterals;
29
34
36 : QgsRendererWidget( layer, style )
37{
38 if ( !layer )
39 {
40 return;
41 }
42
44
45 // the renderer only applies to line or polygon vector layers
47 {
48 //setup blank dialog
49 mRenderer.reset( nullptr );
50 QGridLayout *layout = new QGridLayout( this );
51 QLabel *label = new QLabel(
52 tr(
53 "The merged feature renderer only applies to line and polygon layers. \n"
54 "'%1' is not a line or polygon layer and then cannot be displayed"
55 )
56 .arg( layer->name() ),
57 this
58 );
59 this->setLayout( layout );
60 layout->addWidget( label );
61 return;
62 }
63 setupUi( this );
64 connect( mRendererComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsMergedFeatureRendererWidget::mRendererComboBox_currentIndexChanged );
65
66 // try to recognize the previous renderer
67 // (null renderer means "no previous renderer")
68 if ( renderer )
69 {
71 }
72 if ( !mRenderer )
73 {
74 // use default embedded renderer
75 mRenderer = std::make_unique<QgsMergedFeatureRenderer>( QgsFeatureRenderer::defaultRenderer( type ) );
76 if ( renderer )
77 renderer->copyRendererData( mRenderer.get() );
78 }
79
80 int currentEmbeddedIdx = 0;
81 //insert possible renderer types
82 const QStringList rendererList = QgsApplication::rendererRegistry()->renderersList(
84 );
85 QStringList::const_iterator it = rendererList.constBegin();
86 int idx = 0;
87 mRendererComboBox->blockSignals( true );
88 for ( ; it != rendererList.constEnd(); ++it, ++idx )
89 {
90 if ( *it != "mergedFeatureRenderer"_L1 && *it != "invertedPolygonRenderer"_L1 ) //< an merged renderer cannot contain another merged or inverted renderer
91 {
93 mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
94 const QgsFeatureRenderer *embeddedRenderer = mRenderer->embeddedRenderer();
95 if ( embeddedRenderer && embeddedRenderer->type() == m->name() )
96 {
97 // store the combo box index of the current renderer
98 currentEmbeddedIdx = idx;
99 }
100 }
101 }
102 mRendererComboBox->blockSignals( false );
103
104 const int oldIdx = mRendererComboBox->currentIndex();
105 mRendererComboBox->setCurrentIndex( currentEmbeddedIdx );
106 if ( oldIdx == currentEmbeddedIdx )
107 {
108 // force update
109 mRendererComboBox_currentIndexChanged( currentEmbeddedIdx );
110 }
111}
112
114
116{
117 if ( mRenderer && mEmbeddedRendererWidget )
118 {
119 QgsFeatureRenderer *embeddedRenderer = mEmbeddedRendererWidget->renderer();
120 if ( embeddedRenderer )
121 {
122 mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
123 }
124 }
125 return mRenderer.get();
126}
127
129{
131 if ( mEmbeddedRendererWidget )
132 mEmbeddedRendererWidget->setContext( context );
133}
134
136{
138 if ( mEmbeddedRendererWidget )
139 mEmbeddedRendererWidget->setDockMode( dockMode );
140}
141
142void QgsMergedFeatureRendererWidget::mRendererComboBox_currentIndexChanged( int index )
143{
144 const QString rendererId = mRendererComboBox->itemData( index ).toString();
146 if ( m )
147 {
148 const std::unique_ptr<QgsFeatureRenderer> oldRenderer( mRenderer->embeddedRenderer()->clone() );
149 mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, oldRenderer.get() ) );
150 connect( mEmbeddedRendererWidget.get(), &QgsRendererWidget::widgetChanged, this, &QgsMergedFeatureRendererWidget::widgetChanged );
151 mEmbeddedRendererWidget->setContext( mContext );
152 mEmbeddedRendererWidget->disableSymbolLevels();
153 mEmbeddedRendererWidget->setDockMode( this->dockMode() );
154 connect( mEmbeddedRendererWidget.get(), &QgsPanelWidget::showPanel, this, &QgsPanelWidget::openPanel );
155
156 if ( layout()->count() > 2 )
157 {
158 // remove the current renderer widget
159 layout()->takeAt( 2 );
160 }
161 layout()->addWidget( mEmbeddedRendererWidget.get() );
162 }
163}
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:379
@ Line
Lines.
Definition qgis.h:381
@ Polygon
Polygons.
Definition qgis.h:382
static QgsRendererRegistry * rendererRegistry()
Returns the application's renderer registry, used for managing vector layer renderers.
Abstract base class for all 2D vector feature renderers.
static QgsFeatureRenderer * defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
QString type() const
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
QString name
Definition qgsmaplayer.h:87
~QgsMergedFeatureRendererWidget() override
QgsMergedFeatureRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor.
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership).
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
void setContext(const QgsSymbolWidgetContext &context) override
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
static QgsRendererWidget * create(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Static creation method.
static QgsMergedFeatureRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsMergedFeatureRenderer by a conversion from an existing renderer.
void showPanel(QgsPanelWidget *panel)
Emit when you require a panel to be show in the interface.
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.
Stores metadata about one renderer class.
@ LineLayer
Compatible with line layers.
@ PolygonLayer
Compatible with polygon 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.
QString name() const
Returns the unique name of 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.
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...
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
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...