QGIS API Documentation  3.8.0-Zanzibar (11aff65)
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 #include "qgsapplication.h"
24 
26 {
27  return new QgsInvertedPolygonRendererWidget( layer, style, renderer );
28 }
29 
31  : QgsRendererWidget( layer, style )
32 {
33  if ( !layer )
34  {
35  return;
36  }
37 
39 
40  // the renderer only applies to polygon vector layers
41  if ( type != QgsWkbTypes::Polygon && type != QgsWkbTypes::CurvePolygon )
42  {
43  //setup blank dialog
44  mRenderer.reset( nullptr );
45  QGridLayout *layout = new QGridLayout( this );
46  QLabel *label = new QLabel( tr( "The inverted polygon renderer only applies to polygon and multipolygon layers. \n"
47  "'%1' is not a polygon layer and then cannot be displayed" )
48  .arg( layer->name() ), this );
49  this->setLayout( layout );
50  layout->addWidget( label );
51  return;
52  }
53  setupUi( this );
54  connect( mRendererComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsInvertedPolygonRendererWidget::mRendererComboBox_currentIndexChanged );
55  connect( mMergePolygonsCheckBox, &QCheckBox::stateChanged, this, &QgsInvertedPolygonRendererWidget::mMergePolygonsCheckBox_stateChanged );
56 
57  // try to recognize the previous renderer
58  // (null renderer means "no previous renderer")
59 
60  if ( renderer )
61  {
63  }
64  if ( ! mRenderer )
65  {
67  }
68  mMergePolygonsCheckBox->blockSignals( true );
69  mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
70  mMergePolygonsCheckBox->blockSignals( false );
71 
72  int currentEmbeddedIdx = 0;
73  //insert possible renderer types
75  QStringList::const_iterator it = rendererList.constBegin();
76  int idx = 0;
77  mRendererComboBox->blockSignals( true );
78  for ( ; it != rendererList.constEnd(); ++it, ++idx )
79  {
80  if ( *it != QLatin1String( "invertedPolygonRenderer" ) ) //< an inverted renderer cannot contain another inverted renderer
81  {
83  mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
84  const QgsFeatureRenderer *embeddedRenderer = mRenderer->embeddedRenderer();
85  if ( embeddedRenderer && embeddedRenderer->type() == m->name() )
86  {
87  // store the combo box index of the current renderer
88  currentEmbeddedIdx = idx;
89  }
90  }
91  }
92  mRendererComboBox->blockSignals( false );
93 
94  int oldIdx = mRendererComboBox->currentIndex();
95  mRendererComboBox->setCurrentIndex( currentEmbeddedIdx );
96  if ( oldIdx == currentEmbeddedIdx )
97  {
98  // force update
99  mRendererComboBox_currentIndexChanged( currentEmbeddedIdx );
100  }
101 }
102 
104 {
106  {
107  QgsFeatureRenderer *embeddedRenderer = mEmbeddedRendererWidget->renderer();
108  if ( embeddedRenderer )
109  {
110  mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
111  }
112  }
113  return mRenderer.get();
114 }
115 
117 {
120  mEmbeddedRendererWidget->setContext( context );
121 }
122 
124 {
125  QgsRendererWidget::setDockMode( dockMode );
127  mEmbeddedRendererWidget->setDockMode( dockMode );
128 }
129 
130 void QgsInvertedPolygonRendererWidget::mRendererComboBox_currentIndexChanged( int index )
131 {
132  QString rendererId = mRendererComboBox->itemData( index ).toString();
134  if ( m )
135  {
136  mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRenderer *>( mRenderer->embeddedRenderer() )->clone() ) );
138  mEmbeddedRendererWidget->setContext( mContext );
139  mEmbeddedRendererWidget->setDockMode( this->dockMode() );
141 
142  if ( layout()->count() > 2 )
143  {
144  // remove the current renderer widget
145  layout()->takeAt( 2 );
146  }
147  layout()->addWidget( mEmbeddedRendererWidget.get() );
148  }
149 }
150 
151 void QgsInvertedPolygonRendererWidget::mMergePolygonsCheckBox_stateChanged( int state )
152 {
153  mRenderer->setPreprocessingEnabled( state == Qt::Checked );
154  emit widgetChanged();
155 }
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
static Type singleType(Type type)
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:155
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
bool dockMode()
Returns the dock mode state.
std::unique_ptr< QgsInvertedPolygonRenderer > mRenderer
The mask renderer.
virtual QgsRendererWidget * createRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *oldRenderer)
Returns new instance of settings widget for the renderer.
std::unique_ptr< QgsRendererWidget > mEmbeddedRendererWidget
The widget used to represent the mask&#39;s embedded renderer.
QgsSymbolWidgetContext context() const
Returns the context in which the renderer widget is shown, e.g., the associated map canvas and expres...
QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
Base class for renderer settings widgets.
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.
virtual void setDockMode(bool dockMode)
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs...
void showPanel(QgsPanelWidget *panel)
Emit when you require a panel to be show in the interface.
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
QString type() const
Definition: qgsrenderer.h:129
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, e.g., the associated map canvas and expressio...
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership)
void widgetChanged()
Emitted when the widget state changes.
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...
Compatible with polygon layers.
QgsSymbolWidgetContext mContext
Context in which widget is shown.
Stores metadata about one renderer class.
QgsInvertedPolygonRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor.
QString name
Definition: qgsmaplayer.h:82
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:430
static QgsRendererRegistry * rendererRegistry()
Returns the application&#39;s renderer registry, used for managing vector layer renderers.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.