QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsinvertedpolygonrendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsinvertedpolygonrendererwidget.cpp
3 ---------------------
4 begin : April 2014
5 copyright : (C) 2014 Hugo Mercier / Oslandia
6 email : hugo dot mercier at oslandia 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_qgsinvertedpolygonrendererwidget.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 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 inverted polygon renderer only applies to polygon and multipolygon layers. \n"
54 "'%1' is not a 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, &QgsInvertedPolygonRendererWidget::mRendererComboBox_currentIndexChanged );
65 connect( mMergePolygonsCheckBox, &QCheckBox::stateChanged, this, &QgsInvertedPolygonRendererWidget::mMergePolygonsCheckBox_stateChanged );
66
67 // try to recognize the previous renderer
68 // (null renderer means "no previous renderer")
69
70 if ( renderer )
71 {
73 }
74 if ( !mRenderer )
75 {
76 mRenderer = std::make_unique<QgsInvertedPolygonRenderer>();
77 if ( renderer )
78 renderer->copyRendererData( mRenderer.get() );
79 }
80 mMergePolygonsCheckBox->blockSignals( true );
81 mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
82 mMergePolygonsCheckBox->blockSignals( false );
83
84 int currentEmbeddedIdx = 0;
85 //insert possible renderer types
87 QStringList::const_iterator it = rendererList.constBegin();
88 int idx = 0;
89 mRendererComboBox->blockSignals( true );
90 for ( ; it != rendererList.constEnd(); ++it, ++idx )
91 {
92 if ( *it != "invertedPolygonRenderer"_L1 ) //< an inverted renderer cannot contain another inverted renderer
93 {
95 mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
96 const QgsFeatureRenderer *embeddedRenderer = mRenderer->embeddedRenderer();
97 if ( embeddedRenderer && embeddedRenderer->type() == m->name() )
98 {
99 // store the combo box index of the current renderer
100 currentEmbeddedIdx = idx;
101 }
102 }
103 }
104 mRendererComboBox->blockSignals( false );
105
106 const int oldIdx = mRendererComboBox->currentIndex();
107 mRendererComboBox->setCurrentIndex( currentEmbeddedIdx );
108 if ( oldIdx == currentEmbeddedIdx )
109 {
110 // force update
111 mRendererComboBox_currentIndexChanged( currentEmbeddedIdx );
112 }
113}
114
116
118{
120 {
121 QgsFeatureRenderer *embeddedRenderer = mEmbeddedRendererWidget->renderer();
122 if ( embeddedRenderer )
123 {
124 mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
125 }
126 }
127 return mRenderer.get();
128}
129
136
143
144void QgsInvertedPolygonRendererWidget::mRendererComboBox_currentIndexChanged( int index )
145{
146 const QString rendererId = mRendererComboBox->itemData( index ).toString();
148 if ( m )
149 {
150 const std::unique_ptr<QgsFeatureRenderer> oldRenderer( mRenderer->embeddedRenderer()->clone() );
151 mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, oldRenderer.get() ) );
153 mEmbeddedRendererWidget->setContext( mContext );
154 mEmbeddedRendererWidget->disableSymbolLevels();
155 mEmbeddedRendererWidget->setDockMode( this->dockMode() );
157
158 if ( layout()->count() > 2 )
159 {
160 // remove the current renderer widget
161 layout()->takeAt( 2 );
162 }
163 layout()->addWidget( mEmbeddedRendererWidget.get() );
164 }
165}
166
167void QgsInvertedPolygonRendererWidget::mMergePolygonsCheckBox_stateChanged( int state )
168{
169 mRenderer->setPreprocessingEnabled( state == Qt::Checked );
170 emit widgetChanged();
171}
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
@ Polygon
Polygon.
Definition qgis.h:298
@ CurvePolygon
CurvePolygon.
Definition qgis.h:306
static QgsRendererRegistry * rendererRegistry()
Returns the application's renderer registry, used for managing vector layer renderers.
Abstract base class for all 2D vector feature renderers.
QString type() const
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
std::unique_ptr< QgsRendererWidget > mEmbeddedRendererWidget
The widget used to represent the mask's embedded renderer.
void setContext(const QgsSymbolWidgetContext &context) override
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
QgsInvertedPolygonRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor.
std::unique_ptr< QgsInvertedPolygonRenderer > mRenderer
The mask renderer.
static QgsRendererWidget * create(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Static creation method.
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership).
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
QString name
Definition qgsmaplayer.h:87
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.
@ 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::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
Definition qgswkbtypes.h:53
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.