QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgsvaluerelationconfigdlg.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvaluerelationconfigdlg.cpp
3 --------------------------------------
4 Date : 5.1.2014
5 Copyright : (C) 2014 Matthias Kuhn
6 Email : matthias at opengis dot ch
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
17#include "moc_qgsvaluerelationconfigdlg.cpp"
18#include "qgsproject.h"
19#include "qgsvectorlayer.h"
23
25 : QgsEditorConfigWidget( vl, fieldIdx, parent )
26{
27 setupUi( this );
28 mLayerName->setFilters( Qgis::LayerFilter::VectorLayer );
29 mKeyColumn->setLayer( mLayerName->currentLayer() );
30 mValueColumn->setLayer( mLayerName->currentLayer() );
31 mGroupColumn->setLayer( mLayerName->currentLayer() );
32 mGroupColumn->setAllowEmptyFieldName( true );
33 mDescriptionExpression->setLayer( mLayerName->currentLayer() );
34 mOrderByFieldName->setLayer( mLayerName->currentLayer() );
35 mOrderByFieldName->setAllowEmptyFieldName( false );
36 connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mKeyColumn, &QgsFieldComboBox::setLayer );
37 connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mValueColumn, &QgsFieldComboBox::setLayer );
38 connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mGroupColumn, &QgsFieldComboBox::setLayer );
39 connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mDescriptionExpression, &QgsFieldExpressionWidget::setLayer );
40 connect( mLayerName, &QgsMapLayerComboBox::layerChanged, this, &QgsValueRelationConfigDlg::layerChanged );
41 connect( mEditExpression, &QAbstractButton::clicked, this, &QgsValueRelationConfigDlg::editExpression );
42 connect( mOrderByField, &QAbstractButton::toggled, mOrderByFieldName, [=]( bool enabled ) {
43 mOrderByFieldName->setEnabled( enabled );
44 } );
45
46 mOrderByGroupBox->setCollapsed( true );
47
48 mNofColumns->setMinimum( 1 );
49 mNofColumns->setMaximum( 10 );
50 mNofColumns->setValue( 1 );
51
53 connect( mKeyColumn, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEditorConfigWidget::changed );
54 connect( mValueColumn, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEditorConfigWidget::changed );
55 connect( mGroupColumn, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [=]( int index ) {
56 mDisplayGroupName->setEnabled( index != 0 );
57 emit changed();
58 } );
59 connect( mDescriptionExpression, static_cast<void ( QgsFieldExpressionWidget::* )( const QString & )>( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsEditorConfigWidget::changed );
60 connect( mAllowMulti, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
61 connect( mAllowNull, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
62 connect( mOrderByValue, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
63 connect( mFilterExpression, &QTextEdit::textChanged, this, &QgsEditorConfigWidget::changed );
64 connect( mUseCompleter, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
65 connect( mAllowMulti, &QAbstractButton::toggled, this, [=]( bool checked ) {
66 label_nofColumns->setEnabled( checked );
67 mNofColumns->setEnabled( checked );
68 } );
69
70 connect( mUseCompleter, &QCheckBox::stateChanged, this, [=]( int state ) {
71 mCompleterMatchFromStart->setEnabled( static_cast<Qt::CheckState>( state ) == Qt::CheckState::Checked );
72 } );
73
74 mCompleterMatchFromStart->setEnabled( mUseCompleter->isChecked() );
75
76 connect( mNofColumns, static_cast<void ( QSpinBox::* )( int )>( &QSpinBox::valueChanged ), this, &QgsEditorConfigWidget::changed );
77
78 layerChanged();
79}
80
82{
83 QVariantMap cfg;
84
85 cfg.insert( QStringLiteral( "Layer" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->id() : QString() );
86 cfg.insert( QStringLiteral( "LayerName" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->name() : QString() );
87 cfg.insert( QStringLiteral( "LayerSource" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->publicSource() : QString() );
88 cfg.insert( QStringLiteral( "LayerProviderName" ), ( mLayerName->currentLayer() && mLayerName->currentLayer()->dataProvider() ) ? mLayerName->currentLayer()->providerType() : QString() );
89 cfg.insert( QStringLiteral( "Key" ), mKeyColumn->currentField() );
90 cfg.insert( QStringLiteral( "Value" ), mValueColumn->currentField() );
91 cfg.insert( QStringLiteral( "Group" ), mGroupColumn->currentField() );
92 cfg.insert( QStringLiteral( "DisplayGroupName" ), mDisplayGroupName->isChecked() );
93 cfg.insert( QStringLiteral( "Description" ), mDescriptionExpression->expression() );
94 cfg.insert( QStringLiteral( "AllowMulti" ), mAllowMulti->isChecked() );
95 cfg.insert( QStringLiteral( "NofColumns" ), mNofColumns->value() );
96 cfg.insert( QStringLiteral( "AllowNull" ), mAllowNull->isChecked() );
97 cfg.insert( QStringLiteral( "OrderByValue" ), mOrderByValue->isChecked() );
98 cfg.insert( QStringLiteral( "OrderByKey" ), mOrderByKey->isChecked() );
99 cfg.insert( QStringLiteral( "OrderByField" ), mOrderByField->isChecked() );
100 cfg.insert( QStringLiteral( "OrderByFieldName" ), mOrderByFieldName->currentField() );
101 cfg.insert( QStringLiteral( "OrderByDescending" ), mOrderByDescending->isChecked() );
102 cfg.insert( QStringLiteral( "FilterExpression" ), mFilterExpression->toPlainText() );
103 cfg.insert( QStringLiteral( "UseCompleter" ), mUseCompleter->isChecked() );
104 const Qt::MatchFlags completerMatchFlags { mCompleterMatchFromStart->isChecked() ? Qt::MatchFlag::MatchStartsWith : Qt::MatchFlag::MatchContains };
105 cfg.insert( QStringLiteral( "CompleterMatchFlags" ), static_cast<int>( completerMatchFlags ) );
106
107 return cfg;
108}
109
110void QgsValueRelationConfigDlg::setConfig( const QVariantMap &config )
111{
113 mLayerName->setLayer( lyr );
114 mOrderByFieldName->setLayer( lyr );
115 mKeyColumn->setField( config.value( QStringLiteral( "Key" ) ).toString() );
116 mValueColumn->setField( config.value( QStringLiteral( "Value" ) ).toString() );
117 mGroupColumn->setField( config.value( QStringLiteral( "Group" ) ).toString() );
118 mDisplayGroupName->setChecked( config.value( QStringLiteral( "DisplayGroupName" ) ).toBool() );
119 mDescriptionExpression->setField( config.value( QStringLiteral( "Description" ) ).toString() );
120 mAllowMulti->setChecked( config.value( QStringLiteral( "AllowMulti" ) ).toBool() );
121 mNofColumns->setValue( config.value( QStringLiteral( "NofColumns" ), 1 ).toInt() );
122 if ( !mAllowMulti->isChecked() )
123 {
124 label_nofColumns->setEnabled( false );
125 mNofColumns->setEnabled( false );
126 }
127 mAllowNull->setChecked( config.value( QStringLiteral( "AllowNull" ) ).toBool() );
128 mOrderByValue->setChecked( config.value( QStringLiteral( "OrderByValue" ) ).toBool() );
129 mOrderByField->setChecked( config.value( QStringLiteral( "OrderByField" ) ).toBool() );
130 mOrderByKey->setChecked( config.value( QStringLiteral( "OrderByKey" ) ).toBool() );
131 mOrderByFieldName->setField( config.value( QStringLiteral( "OrderByFieldName" ) ).toString() );
132 mOrderByDescending->setChecked( config.value( QStringLiteral( "OrderByDescending" ) ).toBool() );
133
134 if ( !mOrderByField->isChecked() && !mOrderByValue->isChecked() && !mOrderByKey->isChecked() )
135 {
136 mOrderByKey->setChecked( true );
137 }
138
139 // order by key is the default, if it is not checked, expand the config
140 if ( !mOrderByKey->isChecked() )
141 {
142 mOrderByGroupBox->setCollapsed( false );
143 }
144
145 mFilterExpression->setPlainText( config.value( QStringLiteral( "FilterExpression" ) ).toString() );
146 mUseCompleter->setChecked( config.value( QStringLiteral( "UseCompleter" ) ).toBool() );
147 // Default is MatchStartsWith for backwards compatibility
148 const Qt::MatchFlags completerMatchFlags { config.contains( QStringLiteral( "CompleterMatchFlags" ) ) ? static_cast<Qt::MatchFlags>( config.value( QStringLiteral( "CompleterMatchFlags" ), Qt::MatchFlag::MatchStartsWith ).toInt() ) : Qt::MatchFlag::MatchStartsWith };
149 mCompleterMatchFromStart->setChecked( completerMatchFlags.testFlag( Qt::MatchFlag::MatchStartsWith ) );
150}
151
152void QgsValueRelationConfigDlg::layerChanged()
153{
154 mFilterExpression->setEnabled( qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() ) );
155 mEditExpression->setEnabled( qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() ) );
156 mOrderByFieldName->setLayer( mLayerName->currentLayer() );
157}
158
160{
161 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() );
162 if ( !vl )
163 return;
164
168
169 context.setHighlightedFunctions( QStringList() << QStringLiteral( "current_value" ) << QStringLiteral( "current_parent_value" ) );
170 context.setHighlightedVariables( QStringList() << QStringLiteral( "current_geometry" ) << QStringLiteral( "current_feature" ) << QStringLiteral( "form_mode" ) << QStringLiteral( "current_parent_geometry" ) << QStringLiteral( "current_parent_feature" ) );
171
172 QgsExpressionBuilderDialog dlg( vl, mFilterExpression->toPlainText(), this, QStringLiteral( "generic" ), context );
173 dlg.setWindowTitle( tr( "Edit Filter Expression" ) );
174
175 if ( dlg.exec() == QDialog::Accepted )
176 {
177 mFilterExpression->setText( dlg.expressionBuilder()->expressionText() );
178 }
179}
This class should be subclassed for every configurable editor widget type.
void changed()
Emitted when the configuration of the widget is changed.
A generic dialog for building expression strings.
QgsExpressionBuilderWidget * expressionBuilder()
The builder widget that is used by the dialog.
QString expressionText()
Gets the expression string that has been set in the expression area.
static QgsExpressionContextScope * parentFormScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current parent attribute form/tab...
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table form...
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setHighlightedFunctions(const QStringList &names)
Sets the list of function names intended to be highlighted to the user.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
void setLayer(QgsMapLayer *layer)
Sets the layer for which fields are listed in the combobox.
The QgsFieldExpressionWidget class creates a widget to choose fields and edit expressions It contains...
void setLayer(QgsMapLayer *layer)
Sets the layer used to display the fields and expression.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsValueRelationConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
void setConfig(const QVariantMap &config) override
Update the configuration widget to represent the given configuration.
QVariantMap config() override
Create a configuration from the current GUI state.
static QgsVectorLayer * resolveLayer(const QVariantMap &config, const QgsProject *project)
Returns the (possibly nullptr) layer from the widget's config and project.
Represents a vector layer which manages a vector based data sets.