QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsrendererwidget.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrendererwidget.h
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  ***************************************************************************/
15 #ifndef QGSRENDERERWIDGET_H
16 #define QGSRENDERERWIDGET_H
17 
18 #include <QWidget>
19 #include <QMenu>
20 #include <QStackedWidget>
21 #include "qgssymbol.h"
22 #include "qgspanelwidget.h"
23 #include "qgssymbolwidgetcontext.h"
24 #include "qgssymbollayer.h"
25 
28 class QgsVectorLayer;
29 class QgsStyle;
30 class QgsFeatureRenderer;
31 class QgsMapCanvas;
32 
44 class GUI_EXPORT QgsRendererWidget : public QgsPanelWidget
45 {
46  Q_OBJECT
47  public:
48  QgsRendererWidget( QgsVectorLayer *layer, QgsStyle *style );
49 
51  virtual QgsFeatureRenderer *renderer() = 0;
52 
54  void showSymbolLevelsDialog( QgsFeatureRenderer *r );
55 
62  virtual void setContext( const QgsSymbolWidgetContext &context );
63 
69  QgsSymbolWidgetContext context() const;
70 
75  const QgsVectorLayer *vectorLayer() const { return mLayer; }
76 
80  void applyChanges();
81 
82  void setDockMode( bool dockMode ) override;
83 
84  signals:
85 
92 
97 
98  protected:
99  QgsVectorLayer *mLayer = nullptr;
100  QgsStyle *mStyle = nullptr;
101  QMenu *contextMenu = nullptr;
102  QAction *mCopyAction = nullptr;
103  QAction *mPasteAction = nullptr;
104 
109  QAction *mCopySymbolAction = nullptr;
110 
115  QAction *mPasteSymbolAction = nullptr;
116 
119 
124  virtual QList<QgsSymbol *> selectedSymbols() { return QList<QgsSymbol *>(); }
125  virtual void refreshSymbolView() {}
126 
132  QgsDataDefinedSizeLegendWidget *createDataDefinedSizeLegendWidget( const QgsMarkerSymbol *symbol, const QgsDataDefinedSizeLegend *ddsLegend ) SIP_FACTORY;
133 
134  protected slots:
135  void contextMenuViewCategories( QPoint p );
137  void changeSymbolColor();
139  void changeSymbolOpacity();
141  void changeSymbolUnit();
143  void changeSymbolWidth();
145  void changeSymbolSize();
147  void changeSymbolAngle();
148 
149 
150  virtual void copy() {}
151  virtual void paste() {}
152 
158  virtual void pasteSymbolToSelection();
159 
160  private slots:
161 
162  void copySymbol();
163 
164  private:
165 
170  virtual void apply() SIP_FORCE;
171 
172 
173 };
174 
175 
177 
178 #include <QObject>
179 
180 class QMenu;
181 class QgsField;
182 class QgsFields;
183 
184 #include "ui_widget_set_dd_value.h"
185 #include "qgis_gui.h"
186 
187 
192 class GUI_EXPORT QgsDataDefinedValueDialog : public QDialog, public Ui::QgsDataDefinedValueBaseDialog, private QgsExpressionContextGenerator
193 {
194 
195  Q_OBJECT
196 
197  public:
198 
205  QgsDataDefinedValueDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer, const QString &label );
206 
213  void setContext( const QgsSymbolWidgetContext &context );
214 
220  QgsSymbolWidgetContext context() const;
221 
226  const QgsVectorLayer *vectorLayer() const { return mLayer; }
227 
228  public slots:
229  void dataDefinedChanged();
230 
231  protected:
232 
238  void init( int propertyKey ); // needed in children ctor to call virtual
239 
240  private:
241  QgsProperty symbolDataDefined() const SIP_FORCE;
242 
243  virtual QgsProperty symbolDataDefined( const QgsSymbol * ) const = 0 SIP_FORCE;
244  virtual double value( const QgsSymbol * ) const = 0 SIP_FORCE;
245  virtual void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) = 0 SIP_FORCE;
246 
247  QList<QgsSymbol *> mSymbolList;
248  QgsVectorLayer *mLayer = nullptr;
249 
250  QgsSymbolWidgetContext mContext;
251 
252  QgsExpressionContext createExpressionContext() const override;
253 };
254 
260 {
261  Q_OBJECT
262  public:
263  QgsDataDefinedSizeDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
264  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Size" ) )
265  {
267  if ( !symbolList.isEmpty() && symbolList.at( 0 ) && vectorLayer() )
268  {
269  mAssistantSymbol.reset( static_cast<const QgsMarkerSymbol *>( symbolList.at( 0 ) )->clone() );
270  mDDBtn->setSymbol( mAssistantSymbol );
271  }
272  }
273 
274  protected:
275  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
276 
277  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsMarkerSymbol *>( symbol )->size(); }
278 
279  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
280 
281  private:
282 
283  std::shared_ptr< QgsMarkerSymbol > mAssistantSymbol;
284 };
285 
291 {
292  Q_OBJECT
293  public:
294  QgsDataDefinedRotationDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
295  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Rotation" ) )
296  {
298  }
299 
300  protected:
301  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
302 
303  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsMarkerSymbol *>( symbol )->angle(); }
304 
305  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
306 };
307 
313 {
314  Q_OBJECT
315  public:
316  QgsDataDefinedWidthDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
317  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Width" ) )
318  {
320  }
321 
322  protected:
323  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
324 
325  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsLineSymbol *>( symbol )->width(); }
326 
327  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
328 };
329 
330 
331 
332 #endif // QGSRENDERERWIDGET_H
QgsDataDefinedRotationDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
double value(const QgsSymbol *symbol) const override
double value(const QgsSymbol *symbol) const override
QgsDataDefinedSizeDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
Widget for configuration of appearance of legend for marker symbols with data-defined size.
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Utility classes for "en masse" size definition.
const QgsVectorLayer * vectorLayer() const
Returns the vector layer associated with the widget.
double value(const QgsSymbol *symbol) const override
QgsDataDefinedWidthDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
Abstract interface for generating an expression context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
Container of fields for a vector layer.
Definition: qgsfields.h:45
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgssymbol.h:1204
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:86
A marker symbol type, for rendering Point and MultiPoint geometries.
Definition: qgssymbol.h:1004
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
Definition: qgssymbol.cpp:2036
Base class for any widget that can be shown as a inline panel.
virtual void setDockMode(bool dockMode)
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
A store for object properties.
Definition: qgsproperty.h:232
Base class for renderer settings widgets.
void layerVariablesChanged()
Emitted when expression context variables on the associated vector layers have been changed.
virtual void paste()
virtual QList< QgsSymbol * > selectedSymbols()
Subclasses may provide the capability of changing multiple symbols at once by implementing the follow...
virtual QgsFeatureRenderer * renderer()=0
Returns pointer to the renderer (no transfer of ownership)
virtual void refreshSymbolView()
void symbolLevelsChanged()
Emitted when the symbol levels settings have been changed.
QgsSymbolWidgetContext mContext
Context in which widget is shown.
const QgsVectorLayer * vectorLayer() const
Returns the vector layer associated with the widget.
virtual void copy()
@ PropertyAngle
Symbol angle.
@ PropertySize
Symbol size.
@ PropertyStrokeWidth
Stroke width.
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:65
Represents a vector layer which manages a vector based data sets.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
#define SIP_FORCE
Definition: qgis_sip.h:131
#define SIP_FACTORY
Definition: qgis_sip.h:76