QGIS API Documentation  3.12.1-București (121cc00ff0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgslabelsettingswidgetbase.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslabelsettingswidgetbase.h
3  ----------------------
4  begin : December 2019
5  copyright : (C) 2019 by Nyall Dawson
6  email : nyall dot dawson 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 
16 
22 #include "qgsauxiliarystorage.h"
23 #include "qgsgui.h"
24 
25 
27  : QgsPanelWidget( parent )
28  , mVectorLayer( vl )
29 {
30 }
31 
33 {
34  mContext = context;
35 }
36 
38 {
39  return mContext;
40 }
41 
43 {
44 
45 }
46 
48 {
49  if ( mContext.expressionContext() )
50  return *mContext.expressionContext();
51 
52  QgsExpressionContext expContext( mContext.globalProjectAtlasMapLayerScopes( mVectorLayer ) );
54  symbolScope->addVariable( QgsExpressionContextScope::StaticVariable( QgsExpressionContext::EXPR_SYMBOL_COLOR, QColor(), true ) );
55  expContext << symbolScope;
56 
57  // additional scopes
58  const auto constAdditionalExpressionContextScopes = mContext.additionalExpressionContextScopes();
59  for ( const QgsExpressionContextScope &scope : constAdditionalExpressionContextScopes )
60  {
61  expContext.appendScope( new QgsExpressionContextScope( scope ) );
62  }
63 
64  //TODO - show actual value
65  expContext.setOriginalValueVariable( QVariant() );
66 
67  expContext.setHighlightedVariables( QStringList() << QgsExpressionContext::EXPR_ORIGINAL_VALUE << QgsExpressionContext::EXPR_SYMBOL_COLOR );
68 
69  return expContext;
70 }
71 
72 void QgsLabelSettingsWidgetBase::createAuxiliaryField()
73 {
74  // try to create an auxiliary layer if not yet created
75  if ( !mVectorLayer->auxiliaryLayer() )
76  {
77  QgsNewAuxiliaryLayerDialog dlg( mVectorLayer, this );
78  dlg.exec();
79  }
80 
81  // return if still not exists
82  if ( !mVectorLayer->auxiliaryLayer() )
83  return;
84 
85  QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
88 
89  // create property in auxiliary storage if necessary
90  if ( !mVectorLayer->auxiliaryLayer()->exists( def ) )
91  {
92  QgsNewAuxiliaryFieldDialog dlg( def, mVectorLayer, true, this );
93  if ( dlg.exec() == QDialog::Accepted )
94  def = dlg.propertyDefinition();
95  }
96 
97  // return if still not exist
98  if ( !mVectorLayer->auxiliaryLayer()->exists( def ) )
99  return;
100 
101  // update property with join field name from auxiliary storage
102  QgsProperty property = button->toProperty();
103  property.setField( QgsAuxiliaryLayer::nameFromProperty( def, true ) );
104  property.setActive( true );
105  button->updateFieldLists();
106  button->setToProperty( property );
107 
109 
110  emit auxiliaryFieldCreated();
111 
112  emit changed();
113 }
114 
115 void QgsLabelSettingsWidgetBase::updateDataDefinedProperty()
116 {
117  QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
120  emit changed();
121 }
122 
124 {
125  return mDataDefinedProperties;
126 }
127 
129 {
131 
132  const auto overrideButtons = findChildren<QgsPropertyOverrideButton *>();
133  for ( QgsPropertyOverrideButton *button : overrideButtons )
134  {
135  QgsPalLayerSettings::Property key = static_cast< QgsPalLayerSettings::Property >( button->propertyKey() );
136  button->setToProperty( mDataDefinedProperties.property( key ) );
137  }
138 }
139 
141 {
142 
143 }
144 
146 {
147  button->init( key, mDataDefinedProperties, QgsPalLayerSettings::propertyDefinitions(), mVectorLayer, true );
148  connect( button, &QgsPropertyOverrideButton::changed, this, &QgsLabelSettingsWidgetBase::updateDataDefinedProperty );
149  connect( button, &QgsPropertyOverrideButton::createAuxiliaryField, this, &QgsLabelSettingsWidgetBase::createAuxiliaryField );
150 
151  button->registerExpressionContextGenerator( this );
152 }
153 
154 
155 //
156 // QgsLabelSettingsWidgetDialog
157 //
158 
160  : QDialog( parent )
161 {
162  setWindowTitle( widget->windowTitle() );
163  QVBoxLayout *vLayout = new QVBoxLayout();
164  vLayout->addWidget( widget );
165  QDialogButtonBox *bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
166  connect( bbox, &QDialogButtonBox::accepted, this, &QDialog::accept );
167  connect( bbox, &QDialogButtonBox::rejected, this, &QDialog::reject );
168  vLayout->addWidget( bbox );
169  setLayout( vLayout );
170 
171  setObjectName( QStringLiteral( "QgsLabelSettingsWidgetDialog" ) );
173 }
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
static const QString EXPR_ORIGINAL_VALUE
Inbuilt variable name for value original value variable.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
Single variable definition for use within a QgsExpressionContextScope.
QList< QgsExpressionContextScope * > globalProjectAtlasMapLayerScopes(const QgsMapLayer *layer) const
Returns list of scopes: global, project, atlas, map, layer.
bool exists(const QgsPropertyDefinition &definition) const
Returns true if the property is stored in the layer already, false otherwise.
Base class for widgets which allow customization of label engine properties, such as label placement ...
Base class for any widget that can be shown as a inline panel.
static QgsGui * instance()
Returns a pointer to the singleton instance.
Definition: qgsgui.cpp:62
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsSymbolWidgetContext context() const
Returns the context in which the symbol widget is shown, e.g., the associated map canvas and expressi...
void auxiliaryFieldCreated()
Emitted when an auxiliary field is created in the widget.
void createAuxiliaryField()
Emitted when creating a new auxiliary field.
virtual void updateDataDefinedProperties(QgsPropertyCollection &properties)
Updates a data defined properties collection, correctly setting the values for any properties related...
A dialog to create a new auxiliary layer.
void setField(const QString &field)
Sets the field name the property references.
Property
Data definable properties.
A button for controlling property overrides which may apply to a widget.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown...
void setToProperty(const QgsProperty &property)
Sets the widget to reflect the current state of a QgsProperty.
QgsProperty toProperty() const
Returns a QgsProperty object encapsulating the current state of the widget.
void registerExpressionContextGenerator(QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the symbol widget is shown, e.g., the associated map canvas and expression ...
static const QString EXPR_SYMBOL_COLOR
Inbuilt variable name for symbol color variable.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setDataDefinedProperties(const QgsPropertyCollection &dataDefinedProperties)
Sets the current data defined properties to show in the widget.
A store for object properties.
Definition: qgsproperty.h:229
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsPalLayerSettings::Property key)
Registers a data defined override button.
QgsPropertyCollection dataDefinedProperties() const
Returns the current data defined properties state as specified in the widget.
QgsPropertyCollection mDataDefinedProperties
Contains the data defined properties defined by the widget.
Definition for a property.
Definition: qgsproperty.h:46
virtual void setGeometryType(QgsWkbTypes::GeometryType type)
Sets the geometry type of the features to customize the widget accordingly.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
Definition: qgswkbtypes.h:139
void changed()
Emitted when property definition changes.
QgsExpressionContext * expressionContext() const
Returns the expression context used for the widget, if set.
static QString nameFromProperty(const QgsPropertyDefinition &def, bool joined=false)
Returns the name of the auxiliary field for a property definition.
int propertyKey() const
Returns the property key linked to the button.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition: qgsgui.cpp:133
QgsLabelSettingsWidgetBase(QWidget *parent=nullptr, QgsVectorLayer *vl=nullptr)
Constructor for QgsLabelSettingsWidgetBase.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
void changed()
Emitted when any of the settings described by the widget are changed.
Represents a vector layer which manages a vector based data sets.
void updateFieldLists()
Updates list of fields.
void init(int propertyKey, const QgsProperty &property, const QgsPropertiesDefinition &definitions, const QgsVectorLayer *layer=nullptr, bool auxiliaryStorageEnabled=false)
Initialize a newly constructed property button (useful if button was included in a UI layout)...
QgsPropertyDefinition propertyDefinition() const
Returns the underlying property definition.
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
A dialog to create a new auxiliary field.
QList< QgsExpressionContextScope > additionalExpressionContextScopes() const
Returns the list of additional expression context scopes to show as available within the layer...
QgsLabelSettingsWidgetDialog(QgsLabelSettingsWidgetBase *widget, QWidget *parent=nullptr)
Constructor for QgsLabelSettingsWidgetDialog.