QGIS API Documentation 3.41.0-Master (45a0abf3bec)
Loading...
Searching...
No Matches
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
18#include "moc_qgslabelsettingswidgetbase.cpp"
23#include "qgsauxiliarystorage.h"
24#include "qgsgui.h"
25
26
28 : QgsPanelWidget( parent )
29 , mVectorLayer( vl )
30{
31}
32
34{
35 mContext = context;
36}
37
42
47
49{
50 if ( auto *lExpressionContext = mContext.expressionContext() )
51 return *lExpressionContext;
52
53 QgsExpressionContext expContext( mContext.globalProjectAtlasMapLayerScopes( mVectorLayer ) );
56 expContext << symbolScope;
57
58 // additional scopes
59 const auto constAdditionalExpressionContextScopes = mContext.additionalExpressionContextScopes();
60 for ( const QgsExpressionContextScope &scope : constAdditionalExpressionContextScopes )
61 {
62 expContext.appendScope( new QgsExpressionContextScope( scope ) );
63 }
64
65 //TODO - show actual value
66 expContext.setOriginalValueVariable( QVariant() );
67
69
70 return expContext;
71}
72
73void QgsLabelSettingsWidgetBase::createAuxiliaryField()
74{
75 // try to create an auxiliary layer if not yet created
76 if ( !mVectorLayer->auxiliaryLayer() )
77 {
78 QgsNewAuxiliaryLayerDialog dlg( mVectorLayer, this );
79 dlg.exec();
80 }
81
82 // return if still not exists
83 if ( !mVectorLayer->auxiliaryLayer() )
84 return;
85
86 QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
87 const QgsPalLayerSettings::Property key = static_cast< QgsPalLayerSettings::Property >( button->propertyKey() );
88 QgsPropertyDefinition def = QgsPalLayerSettings::propertyDefinitions()[static_cast< int >( key )];
89
90 // create property in auxiliary storage if necessary
91 if ( !mVectorLayer->auxiliaryLayer()->exists( def ) )
92 {
93 QgsNewAuxiliaryFieldDialog dlg( def, mVectorLayer, true, this );
94 if ( dlg.exec() == QDialog::Accepted )
95 def = dlg.propertyDefinition();
96 }
97
98 // return if still not exist
99 if ( !mVectorLayer->auxiliaryLayer()->exists( def ) )
100 return;
101
102 // update property with join field name from auxiliary storage
103 QgsProperty property = button->toProperty();
104 property.setField( QgsAuxiliaryLayer::nameFromProperty( def, true ) );
105 property.setActive( true );
106 button->updateFieldLists();
107 button->setToProperty( property );
108
110
112
113 emit changed();
114}
115
116void QgsLabelSettingsWidgetBase::updateDataDefinedProperty()
117{
118 QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
119 const QgsPalLayerSettings::Property key = static_cast< QgsPalLayerSettings::Property >( button->propertyKey() );
121 emit changed();
122}
123
128
130{
132
133 const auto overrideButtons = findChildren<QgsPropertyOverrideButton *>();
134 for ( QgsPropertyOverrideButton *button : overrideButtons )
135 {
136 const QgsPalLayerSettings::Property key = static_cast< QgsPalLayerSettings::Property >( button->propertyKey() );
138 }
139}
140
145
147{
148 button->init( static_cast< int >( key ), mDataDefinedProperties, QgsPalLayerSettings::propertyDefinitions(), mVectorLayer, true );
149 connect( button, &QgsPropertyOverrideButton::changed, this, &QgsLabelSettingsWidgetBase::updateDataDefinedProperty );
150 connect( button, &QgsPropertyOverrideButton::createAuxiliaryField, this, &QgsLabelSettingsWidgetBase::createAuxiliaryField );
151
153}
154
155
156//
157// QgsLabelSettingsWidgetDialog
158//
159
161 : QDialog( parent )
162{
163 setWindowTitle( widget->windowTitle() );
164 QVBoxLayout *vLayout = new QVBoxLayout();
165 vLayout->addWidget( widget );
166 mButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
167 connect( mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept );
168 connect( mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
169 vLayout->addWidget( mButtonBox );
170 setLayout( vLayout );
171
172 setObjectName( QStringLiteral( "QgsLabelSettingsWidgetDialog" ) );
174}
175
177{
178 return mButtonBox;
179}
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:337
static QString nameFromProperty(const QgsPropertyDefinition &def, bool joined=false)
Returns the name of the auxiliary field for a property definition.
bool exists(const QgsPropertyDefinition &definition) const
Returns true if the property is stored in the layer already, false otherwise.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
static const QString EXPR_SYMBOL_COLOR
Inbuilt variable name for symbol color variable.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
static const QString EXPR_ORIGINAL_VALUE
Inbuilt variable name for value original value variable.
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:209
Base class for widgets which allow customization of label engine properties, such as label placement ...
virtual void updateDataDefinedProperties(QgsPropertyCollection &properties)
Updates a data defined properties collection, correctly setting the values for any properties related...
void changed()
Emitted when any of the settings described by the widget are changed.
QgsSymbolWidgetContext context() const
Returns the context in which the symbol widget is shown, e.g., the associated map canvas and expressi...
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsPalLayerSettings::Property key)
Registers a data defined override button.
QgsLabelSettingsWidgetBase(QWidget *parent=nullptr, QgsVectorLayer *vl=nullptr)
Constructor for QgsLabelSettingsWidgetBase.
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the symbol widget is shown, e.g., the associated map canvas and expression ...
QgsPropertyCollection mDataDefinedProperties
Contains the data defined properties defined by the widget.
virtual void setGeometryType(Qgis::GeometryType type)
Sets the geometry type of the features to customize the widget accordingly.
void auxiliaryFieldCreated()
Emitted when an auxiliary field is created in the widget.
void setDataDefinedProperties(const QgsPropertyCollection &dataDefinedProperties)
Sets the current data defined properties to show in the widget.
QgsPropertyCollection dataDefinedProperties() const
Returns the current data defined properties state as specified in the widget.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsLabelSettingsWidgetDialog(QgsLabelSettingsWidgetBase *widget, QWidget *parent=nullptr)
Constructor for QgsLabelSettingsWidgetDialog.
QDialogButtonBox * buttonBox()
Returns the dialog's button box.
A dialog to create a new auxiliary field.
A dialog to create a new auxiliary layer.
Property
Data definable properties.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
Base class for any widget that can be shown as a inline panel.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
QgsProperty property(int key) const final
Returns a matching property from the collection, if one exists.
Definition for a property.
Definition qgsproperty.h:45
A button for controlling property overrides which may apply to a widget.
QgsProperty toProperty() const
Returns a QgsProperty object encapsulating the current state of the widget.
void updateFieldLists()
Updates list of fields.
void changed()
Emitted when property definition changes.
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).
void registerExpressionContextGenerator(QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
int propertyKey() const
Returns the property key linked to the button.
void setToProperty(const QgsProperty &property)
Sets the widget to reflect the current state of a QgsProperty.
void createAuxiliaryField()
Emitted when creating a new auxiliary field.
A store for object properties.
void setField(const QString &field)
Sets the field name the property references.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
QList< QgsExpressionContextScope > additionalExpressionContextScopes() const
Returns the list of additional expression context scopes to show as available within the layer.
QList< QgsExpressionContextScope * > globalProjectAtlasMapLayerScopes(const QgsMapLayer *layer) const
Returns list of scopes: global, project, atlas, map, layer.
QgsExpressionContext * expressionContext() const
Returns the expression context used for the widget, if set.
Represents a vector layer which manages a vector based data sets.
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
Single variable definition for use within a QgsExpressionContextScope.