QGIS API Documentation  2.99.0-Master (e077efd)
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  ***************************************************************************/
17 #include "qgsrendererregistry.h"
18 
19 #include "qgssymbol.h"
20 
21 #include "qgslogger.h"
22 #include "qgsvectorlayer.h"
23 
25 {
26  return new QgsInvertedPolygonRendererWidget( layer, style, renderer );
27 }
28 
30  : QgsRendererWidget( layer, style )
31 {
32  if ( !layer )
33  {
34  return;
35  }
36 
38 
39  // the renderer only applies to polygon vector layers
40  if ( type != QgsWkbTypes::Polygon && type != QgsWkbTypes::CurvePolygon )
41  {
42  //setup blank dialog
43  mRenderer.reset( nullptr );
44  QGridLayout* layout = new QGridLayout( this );
45  QLabel* label = new QLabel( tr( "The inverted polygon renderer only applies to polygon and multipolygon layers. \n"
46  "'%1' is not a polygon layer and then cannot be displayed" )
47  .arg( layer->name() ), this );
48  this->setLayout( layout );
49  layout->addWidget( label );
50  return;
51  }
52  setupUi( this );
53 
54  // try to recognize the previous renderer
55  // (null renderer means "no previous renderer")
56 
57  if ( renderer )
58  {
60  }
61  if ( ! mRenderer )
62  {
64  }
65  mMergePolygonsCheckBox->blockSignals( true );
66  mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
67  mMergePolygonsCheckBox->blockSignals( false );
68 
69  int currentEmbeddedIdx = 0;
70  //insert possible renderer types
72  QStringList::const_iterator it = rendererList.constBegin();
73  int idx = 0;
74  mRendererComboBox->blockSignals( true );
75  for ( ; it != rendererList.constEnd(); ++it, ++idx )
76  {
77  if ( *it != QLatin1String( "invertedPolygonRenderer" ) ) //< an inverted renderer cannot contain another inverted renderer
78  {
80  mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
81  const QgsFeatureRenderer* embeddedRenderer = mRenderer->embeddedRenderer();
82  if ( embeddedRenderer && embeddedRenderer->type() == m->name() )
83  {
84  // store the combo box index of the current renderer
85  currentEmbeddedIdx = idx;
86  }
87  }
88  }
89  mRendererComboBox->blockSignals( false );
90 
91  int oldIdx = mRendererComboBox->currentIndex();
92  mRendererComboBox->setCurrentIndex( currentEmbeddedIdx );
93  if ( oldIdx == currentEmbeddedIdx )
94  {
95  // force update
96  on_mRendererComboBox_currentIndexChanged( currentEmbeddedIdx );
97  }
98 }
99 
101 {
103  {
104  QgsFeatureRenderer* embeddedRenderer = mEmbeddedRendererWidget->renderer();
105  if ( embeddedRenderer )
106  {
107  mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
108  }
109  }
110  return mRenderer.data();
111 }
112 
114 {
117  mEmbeddedRendererWidget->setContext( context );
118 }
119 
120 void QgsInvertedPolygonRendererWidget::on_mRendererComboBox_currentIndexChanged( int index )
121 {
122  QString rendererId = mRendererComboBox->itemData( index ).toString();
124  if ( m )
125  {
126  mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRenderer*>( mRenderer->embeddedRenderer() )->clone() ) );
127  connect( mEmbeddedRendererWidget.data(), SIGNAL( widgetChanged() ), this, SIGNAL( widgetChanged() ) );
128  mEmbeddedRendererWidget->setContext( mContext );
129 
130  if ( layout()->count() > 2 )
131  {
132  // remove the current renderer widget
133  layout()->takeAt( 2 );
134  }
135  layout()->addWidget( mEmbeddedRendererWidget.data() );
136  }
137 }
138 
139 void QgsInvertedPolygonRendererWidget::on_mMergePolygonsCheckBox_stateChanged( int state )
140 {
141  mRenderer->setPreprocessingEnabled( state == Qt::Checked );
142  emit widgetChanged();
143 }
static unsigned index
static Type singleType(Type type)
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:114
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the renderer widget is shown, eg the associated map canvas and expression c...
virtual QgsRendererWidget * createRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *oldRenderer)
Return new instance of settings widget for the renderer.
QgsSymbolWidgetContext context() const
Returns the context in which the renderer widget is shown, eg the associated map canvas and expressio...
Base class for renderer settings widgets.
QScopedPointer< QgsInvertedPolygonRenderer > mRenderer
The mask renderer.
QgsVectorLayer * mLayer
QStringList renderersList(QgsRendererAbstractMetadata::LayerTypes layerTypes=QgsRendererAbstractMetadata::All) const
Returns a list of available renderers.
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
QgsWkbTypes::Type wkbType() const
Returns the WKBType or WKBUnknown in case of error.
QString type() const
Definition: qgsrenderer.h:92
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted...
Contains settings which reflect the context in which a symbol (or renderer) widget is shown...
void setContext(const QgsSymbolWidgetContext &context) override
Sets the context in which the renderer widget is shown, eg the associated map canvas and expression c...
static QgsRendererRegistry * instance()
Returns a pointer to the QgsRendererRegistry singleton.
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
virtual QgsFeatureRenderer * renderer() override
void widgetChanged()
Emitted when the widget state changes.
static QgsRendererWidget * create(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Static creation method.
Compatible with polygon layers.
QgsSymbolWidgetContext mContext
Context in which widget is shown.
Stores metadata about one renderer class.
QScopedPointer< QgsRendererWidget > mEmbeddedRendererWidget
The widget used to represent the mask&#39;s embedded renderer.
QgsInvertedPolygonRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor.
QString name
Read property of QString layerName.
Definition: qgsmaplayer.h:53
Represents a vector layer which manages a vector based data sets.
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:366
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.