QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgssinglesymbolrendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssinglesymbolrendererwidget.cpp
3 ---------------------
4 begin : November 2009
5 copyright : (C) 2009 by Martin Dobias
6 email : wonder dot sk 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
19#include "qgslogger.h"
20#include "qgsmarkersymbol.h"
22#include "qgssymbol.h"
24#include "qgsvectorlayer.h"
25
26#include <QMenu>
27
28#include "moc_qgssinglesymbolrendererwidget.cpp"
29
34
36 : QgsRendererWidget( layer, style )
37{
38 // try to recognize the previous renderer
39 // (null renderer means "no previous renderer")
40
41 if ( renderer )
42 {
44 }
45 if ( !mRenderer )
46 {
47 QgsSymbol *symbol = QgsSymbol::defaultSymbol( mLayer->geometryType() );
48
49 if ( symbol )
50 mRenderer = std::make_unique<QgsSingleSymbolRenderer>( symbol );
51
52 if ( renderer )
53 renderer->copyRendererData( mRenderer.get() );
54 }
55
56 // load symbol from it
57 if ( mRenderer )
58 mSingleSymbol.reset( mRenderer->symbol()->clone() );
59
60 // setup ui
61 mSelector = new QgsSymbolSelectorWidget( mSingleSymbol.get(), mStyle, mLayer, nullptr );
62 connect( mSelector, &QgsSymbolSelectorWidget::symbolModified, this, &QgsSingleSymbolRendererWidget::changeSingleSymbol );
63 connect( mSelector, &QgsPanelWidget::showPanel, this, &QgsPanelWidget::openPanel );
64
65 QVBoxLayout *layout = new QVBoxLayout( this );
66 layout->setContentsMargins( 0, 0, 0, 0 );
67 layout->addWidget( mSelector );
68
69 // advanced actions - data defined rendering
70 QMenu *advMenu = mSelector->advancedMenu();
71
72 mActionLevels = advMenu->addAction( tr( "Symbol Levels…" ) );
73 connect( mActionLevels, &QAction::triggered, this, &QgsSingleSymbolRendererWidget::showSymbolLevels );
74 if ( mSingleSymbol && mSingleSymbol->type() == Qgis::SymbolType::Marker )
75 {
76 QAction *actionDdsLegend = advMenu->addAction( tr( "Data-defined Size Legend…" ) );
77 connect( actionDdsLegend, &QAction::triggered, this, &QgsSingleSymbolRendererWidget::dataDefinedSizeLegend );
78 }
79}
80
82{
83 mSingleSymbol.reset();
84 mRenderer.reset();
85
86 delete mSelector;
87}
88
90{
91 return mRenderer.get();
92}
93
95{
97 if ( mSelector )
98 mSelector->setContext( context );
99}
100
102{
104 if ( mSelector )
105 mSelector->setDockMode( dockMode );
106}
107
109{
110 delete mActionLevels;
111 mActionLevels = nullptr;
112}
113
114void QgsSingleSymbolRendererWidget::setSymbolLevels( const QList<QgsLegendSymbolItem> &levels, bool enabled )
115{
116 mSingleSymbol.reset( levels.at( 0 ).symbol()->clone() );
117 if ( !enabled )
118 {
119 // remove the renderer symbol levels flag (if present), as we don't symbol levels automatically re-enabling when other changes
120 // are made to the symbol
121 mSingleSymbol->setFlags( mSingleSymbol->flags() & ~Qgis::SymbolFlags( Qgis::SymbolFlag::RendererShouldUseSymbolLevels ) );
122 }
123 mRenderer->setSymbol( mSingleSymbol->clone() );
124 mRenderer->setUsingSymbolLevels( enabled );
125 mSelector->loadSymbol( mSingleSymbol.get() );
126 emit widgetChanged();
127}
128
129void QgsSingleSymbolRendererWidget::changeSingleSymbol()
130{
131 // update symbol from the GUI
132 mRenderer->setSymbol( mSingleSymbol->clone() );
133
134 if ( mSingleSymbol->flags() & Qgis::SymbolFlag::RendererShouldUseSymbolLevels )
135 mRenderer->setUsingSymbolLevels( true );
136
137 emit widgetChanged();
138}
139
140void QgsSingleSymbolRendererWidget::showSymbolLevels()
141{
142 showSymbolLevelsDialog( mRenderer.get() );
143}
144
145void QgsSingleSymbolRendererWidget::dataDefinedSizeLegend()
146{
147 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( mSingleSymbol.get() ); // this should be only enabled for marker symbols
148 QgsDataDefinedSizeLegendWidget *panel = createDataDefinedSizeLegendWidget( s, mRenderer->dataDefinedSizeLegend() );
149 if ( panel )
150 {
151 connect( panel, &QgsPanelWidget::widgetChanged, this, [this, panel] {
152 mRenderer->setDataDefinedSizeLegend( panel->dataDefinedSizeLegend() );
153 emit widgetChanged();
154 } );
155 openPanel( panel ); // takes ownership of the panel
156 }
157}
QFlags< SymbolFlag > SymbolFlags
Symbol flags.
Definition qgis.h:853
@ Marker
Marker symbol.
Definition qgis.h:611
@ RendererShouldUseSymbolLevels
If present, indicates that a QgsFeatureRenderer using the symbol should use symbol levels for best re...
Definition qgis.h:848
QgsDataDefinedSizeLegend * dataDefinedSizeLegend() const
Returns configuration as set up in the dialog (may be nullptr). Ownership is passed to the caller.
Abstract base class for all 2D vector feature renderers.
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.
QgsRendererWidget(QgsVectorLayer *layer, QgsStyle *style)
void showSymbolLevelsDialog(QgsFeatureRenderer *r)
Show a dialog with renderer's symbol level settings.
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the renderer widget is shown, e.g., the associated map canvas and expressio...
QgsDataDefinedSizeLegendWidget * createDataDefinedSizeLegendWidget(const QgsMarkerSymbol *symbol, const QgsDataDefinedSizeLegend *ddsLegend)
Creates widget to setup data-defined size legend.
QgsSymbolWidgetContext context() const
Returns the context in which the renderer widget is shown, e.g., the associated map canvas and expres...
QgsVectorLayer * mLayer
void disableSymbolLevels() override
Disables symbol level modification on the widget.
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership).
QgsSingleSymbolRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
void setSymbolLevels(const QList< QgsLegendSymbolItem > &levels, bool enabled) override
Sets the symbol levels for the renderer defined in the widget.
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)
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
static QgsSingleSymbolRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a new single symbol renderer from an existing renderer.
A database of saved style entities, including symbols, color ramps, text formats and others.
Definition qgsstyle.h:88
Symbol selector widget that can be used to select and build a symbol.
void symbolModified()
Emitted when a symbol is modified in the widget.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Represents a vector layer which manages a vector based dataset.