QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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 QGSRENDERERV2WIDGET_H
16 #define QGSRENDERERV2WIDGET_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  signals:
83 
89  void layerVariablesChanged();
90 
94  void symbolLevelsChanged();
95 
96  protected:
97  QgsVectorLayer *mLayer = nullptr;
98  QgsStyle *mStyle = nullptr;
99  QMenu *contextMenu = nullptr;
100  QAction *mCopyAction = nullptr;
101  QAction *mPasteAction = nullptr;
102 
105 
109  virtual QList<QgsSymbol *> selectedSymbols() { return QList<QgsSymbol *>(); }
110  virtual void refreshSymbolView() {}
111 
117  QgsDataDefinedSizeLegendWidget *createDataDefinedSizeLegendWidget( const QgsMarkerSymbol *symbol, const QgsDataDefinedSizeLegend *ddsLegend ) SIP_FACTORY;
118 
119  protected slots:
120  void contextMenuViewCategories( QPoint p );
122  void changeSymbolColor();
124  void changeSymbolOpacity();
126  void changeSymbolUnit();
128  void changeSymbolWidth();
130  void changeSymbolSize();
132  void changeSymbolAngle();
133 
134  virtual void copy() {}
135  virtual void paste() {}
136 
137  private:
138 
143  virtual void apply() SIP_FORCE;
144 
145 
146 };
147 
148 
150 
151 #include <QObject>
152 
153 class QMenu;
154 class QgsField;
155 class QgsFields;
156 
157 #include "ui_widget_set_dd_value.h"
158 #include "qgis_gui.h"
159 
160 
165 class GUI_EXPORT QgsDataDefinedValueDialog : public QDialog, public Ui::QgsDataDefinedValueBaseDialog, private QgsExpressionContextGenerator
166 {
167 
168  Q_OBJECT
169 
170  public:
171 
178  QgsDataDefinedValueDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer, const QString &label );
179 
186  void setContext( const QgsSymbolWidgetContext &context );
187 
193  QgsSymbolWidgetContext context() const;
194 
199  const QgsVectorLayer *vectorLayer() const { return mLayer; }
200 
201  public slots:
202  void dataDefinedChanged();
203 
204  protected:
205 
211  void init( int propertyKey ); // needed in children ctor to call virtual
212 
213  private:
214  QgsProperty symbolDataDefined() const SIP_FORCE;
215 
216  virtual QgsProperty symbolDataDefined( const QgsSymbol * ) const = 0 SIP_FORCE;
217  virtual double value( const QgsSymbol * ) const = 0 SIP_FORCE;
218  virtual void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) = 0 SIP_FORCE;
219 
220  QList<QgsSymbol *> mSymbolList;
221  QgsVectorLayer *mLayer = nullptr;
222 
223  QgsSymbolWidgetContext mContext;
224 
226 };
227 
233 {
234  Q_OBJECT
235  public:
236  QgsDataDefinedSizeDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
237  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Size" ) )
238  {
240  if ( !symbolList.isEmpty() && symbolList.at( 0 ) && vectorLayer() )
241  {
242  mAssistantSymbol.reset( static_cast<const QgsMarkerSymbol *>( symbolList.at( 0 ) )->clone() );
243  mDDBtn->setSymbol( mAssistantSymbol );
244  }
245  }
246 
247  protected:
248  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
249 
250  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsMarkerSymbol *>( symbol )->size(); }
251 
252  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
253 
254  private:
255 
256  std::shared_ptr< QgsMarkerSymbol > mAssistantSymbol;
257 };
258 
264 {
265  Q_OBJECT
266  public:
267  QgsDataDefinedRotationDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
268  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Rotation" ) )
269  {
271  }
272 
273  protected:
274  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
275 
276  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsMarkerSymbol *>( symbol )->angle(); }
277 
278  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
279 };
280 
286 {
287  Q_OBJECT
288  public:
289  QgsDataDefinedWidthDialog( const QList<QgsSymbol *> &symbolList, QgsVectorLayer *layer )
290  : QgsDataDefinedValueDialog( symbolList, layer, tr( "Width" ) )
291  {
293  }
294 
295  protected:
296  QgsProperty symbolDataDefined( const QgsSymbol *symbol ) const override;
297 
298  double value( const QgsSymbol *symbol ) const override { return static_cast<const QgsLineSymbol *>( symbol )->width(); }
299 
300  void setDataDefined( QgsSymbol *symbol, const QgsProperty &dd ) override;
301 };
302 
303 
304 
305 #endif // QGSRENDERERV2WIDGET_H
const QgsVectorLayer * vectorLayer() const
Returns the vector layer associated with the widget.
double value(const QgsSymbol *symbol) const override
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:61
virtual void refreshSymbolView()
Base class for renderer settings widgets.
double value(const QgsSymbol *symbol) const override
QgsDataDefinedRotationDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
Container of fields for a vector layer.
Definition: qgsfields.h:42
Base class for any widget that can be shown as a inline panel.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:74
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
A marker symbol type, for rendering Point and MultiPoint geometries.
Definition: qgssymbol.h:732
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgssymbol.h:920
Utility classes for "en masse" size definition.
virtual QgsExpressionContext createExpressionContext() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsDataDefinedSizeDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
QgsDataDefinedWidthDialog(const QList< QgsSymbol * > &symbolList, QgsVectorLayer *layer)
Contains settings which reflect the context in which a symbol (or renderer) widget is shown...
Widget for configuration of appearance of legend for marker symbols with data-defined size...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
#define SIP_FORCE
Definition: qgis_sip.h:124
#define SIP_FACTORY
Definition: qgis_sip.h:69
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:48
A store for object properties.
Definition: qgsproperty.h:229
virtual void paste()
virtual void copy()
Abstract interface for generating an expression context.
double value(const QgsSymbol *symbol) const override
const QgsVectorLayer * vectorLayer() const
Returns the vector layer associated with the widget.
QgsSymbolWidgetContext mContext
Context in which widget is shown.
virtual QList< QgsSymbol * > selectedSymbols()
Subclasses may provide the capability of changing multiple symbols at once by implementing the follow...
void init(int propertyKey)
Should be called in the constructor of child classes.
Represents a vector layer which manages a vector based data sets.
Object that keeps configuration of appearance of marker symbol&#39;s data-defined size in legend...