QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
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 "qgsproject.h"
18 #include "qgsvectorlayer.h"
22 
24  : QgsEditorConfigWidget( vl, fieldIdx, parent )
25 {
26  setupUi( this );
27  mLayerName->setFilters( QgsMapLayerProxyModel::VectorLayer );
28  mKeyColumn->setLayer( mLayerName->currentLayer() );
29  mValueColumn->setLayer( mLayerName->currentLayer() );
30  connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mKeyColumn, &QgsFieldComboBox::setLayer );
31  connect( mLayerName, &QgsMapLayerComboBox::layerChanged, mValueColumn, &QgsFieldComboBox::setLayer );
32  connect( mLayerName, &QgsMapLayerComboBox::layerChanged, this, &QgsValueRelationConfigDlg::layerChanged );
33  connect( mEditExpression, &QAbstractButton::clicked, this, &QgsValueRelationConfigDlg::editExpression );
34 
35  mNofColumns->setMinimum( 1 );
36  mNofColumns->setMaximum( 10 );
37  mNofColumns->setValue( 1 );
38 
40  connect( mKeyColumn, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEditorConfigWidget::changed );
41  connect( mValueColumn, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsEditorConfigWidget::changed );
42  connect( mAllowMulti, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
43  connect( mAllowNull, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
44  connect( mOrderByValue, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
45  connect( mFilterExpression, &QTextEdit::textChanged, this, &QgsEditorConfigWidget::changed );
46  connect( mUseCompleter, &QAbstractButton::toggled, this, &QgsEditorConfigWidget::changed );
47  connect( mAllowMulti, &QAbstractButton::toggled, this, [ = ]( bool checked )
48  {
49  label_nofColumns->setEnabled( checked );
50  mNofColumns->setEnabled( checked );
51  }
52  );
53 
54  connect( mNofColumns, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsEditorConfigWidget::changed );
55 
56  layerChanged();
57 }
58 
60 {
61  QVariantMap cfg;
62 
63  cfg.insert( QStringLiteral( "Layer" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->id() : QString() );
64  cfg.insert( QStringLiteral( "LayerName" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->name() : QString() );
65  cfg.insert( QStringLiteral( "LayerSource" ), mLayerName->currentLayer() ? mLayerName->currentLayer()->publicSource() : QString() );
66  cfg.insert( QStringLiteral( "LayerProviderName" ), ( mLayerName->currentLayer() && mLayerName->currentLayer()->dataProvider() ) ?
67  mLayerName->currentLayer()->providerType() :
68  QString() );
69  cfg.insert( QStringLiteral( "Key" ), mKeyColumn->currentField() );
70  cfg.insert( QStringLiteral( "Value" ), mValueColumn->currentField() );
71  cfg.insert( QStringLiteral( "AllowMulti" ), mAllowMulti->isChecked() );
72  cfg.insert( QStringLiteral( "NofColumns" ), mNofColumns->value() );
73  cfg.insert( QStringLiteral( "AllowNull" ), mAllowNull->isChecked() );
74  cfg.insert( QStringLiteral( "OrderByValue" ), mOrderByValue->isChecked() );
75  cfg.insert( QStringLiteral( "FilterExpression" ), mFilterExpression->toPlainText() );
76  cfg.insert( QStringLiteral( "UseCompleter" ), mUseCompleter->isChecked() );
77 
78  return cfg;
79 }
80 
81 void QgsValueRelationConfigDlg::setConfig( const QVariantMap &config )
82 {
84  mLayerName->setLayer( lyr );
85  mKeyColumn->setField( config.value( QStringLiteral( "Key" ) ).toString() );
86  mValueColumn->setField( config.value( QStringLiteral( "Value" ) ).toString() );
87  mAllowMulti->setChecked( config.value( QStringLiteral( "AllowMulti" ) ).toBool() );
88  mNofColumns->setValue( config.value( QStringLiteral( "NofColumns" ), 1 ).toInt() );
89  if ( !mAllowMulti->isChecked() )
90  {
91  label_nofColumns->setEnabled( false );
92  mNofColumns->setEnabled( false );
93  }
94  mAllowNull->setChecked( config.value( QStringLiteral( "AllowNull" ) ).toBool() );
95  mOrderByValue->setChecked( config.value( QStringLiteral( "OrderByValue" ) ).toBool() );
96  mFilterExpression->setPlainText( config.value( QStringLiteral( "FilterExpression" ) ).toString() );
97  mUseCompleter->setChecked( config.value( QStringLiteral( "UseCompleter" ) ).toBool() );
98 }
99 
100 void QgsValueRelationConfigDlg::layerChanged()
101 {
102  mFilterExpression->setEnabled( qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() ) );
103  mEditExpression->setEnabled( qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() ) );
104 }
105 
107 {
108  QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mLayerName->currentLayer() );
109  if ( !vl )
110  return;
111 
114 
115  context.setHighlightedFunctions( QStringList() << QStringLiteral( "current_value" ) );
116  context.setHighlightedVariables( QStringList() << QStringLiteral( "current_geometry" )
117  << QStringLiteral( "current_feature" )
118  << QStringLiteral( "form_mode" ) );
119 
120  QgsExpressionBuilderDialog dlg( vl, mFilterExpression->toPlainText(), this, QStringLiteral( "generic" ), context );
121  dlg.setWindowTitle( tr( "Edit Filter Expression" ) );
122 
123  if ( dlg.exec() == QDialog::Accepted )
124  {
125  mFilterExpression->setText( dlg.expressionBuilder()->expressionText() );
126  }
127 }
This class should be subclassed for every configurable editor widget type.
QVariantMap config() override
Create a configuration from the current GUI state.
void setConfig(const QVariantMap &config) override
Update the configuration widget to represent the given configuration.
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 feat...
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
void setHighlightedFunctions(const QStringList &names)
Sets the list of function names intended to be highlighted to the user.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static QgsVectorLayer * resolveLayer(const QVariantMap &config, const QgsProject *project)
Returns the (possibly NULL) layer from the widget&#39;s config and project.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer&#39;s project and layer.
void changed()
Emitted when the configuration of the widget is changed.
void setLayer(QgsMapLayer *layer)
Sets the layer for which fields are listed in the combobox.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:450
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user...
QgsValueRelationConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Represents a vector layer which manages a vector based data sets.
A generic dialog for building expression strings.