QGIS API Documentation 3.99.0-Master (09f76ad7019)
Loading...
Searching...
No Matches
qgswmsdimensiondialog.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswmsdimensiondialog.cpp
3 ------------------
4 begin : August 20, 2019
5 copyright : (C) 2019 by René-Luc D'Hont
6 email : rldhont at 3liz dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsfieldcombobox.h"
21#include "qgsvectorlayer.h"
22
23#include <QPushButton>
24#include <QStandardItemModel>
25#include <QString>
26
27#include "moc_qgswmsdimensiondialog.cpp"
28
29using namespace Qt::StringLiterals;
30
31QgsWmsDimensionDialog::QgsWmsDimensionDialog( QgsVectorLayer *layer, QStringList alreadyDefinedDimensions, QWidget *parent, Qt::WindowFlags f )
32 : QDialog( parent, f )
33 , mLayer( layer )
34{
35 setupUi( this );
36
37 if ( !mLayer )
38 {
39 return;
40 }
41
42 const QString nameToolTip = tr( "OAPIF supports \"Name\" and \"Date\" only. For \"WMS\", \"Time\" and \"Elevation\" are predefined values according to OGC specifications but it can be user-defined." );
43 mNameLabel->setToolTip( nameToolTip );
44 mNameComboBox->setToolTip( nameToolTip );
45
46 // Set field combobox
47 mFieldComboBox->setLayer( mLayer );
48 mEndFieldComboBox->setLayer( mLayer );
49 mEndFieldComboBox->setAllowEmptyFieldName( true );
50
51 connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsWmsDimensionDialog::accept );
52 connect( buttonBox, &QDialogButtonBox::rejected, this, &QgsWmsDimensionDialog::reject );
53 connect( mFieldComboBox, &QgsFieldComboBox::fieldChanged, this, &QgsWmsDimensionDialog::fieldChanged );
54 connect( mEndFieldComboBox, &QgsFieldComboBox::fieldChanged, this, &QgsWmsDimensionDialog::fieldChanged );
55 connect( mNameComboBox, &QComboBox::editTextChanged, this, &QgsWmsDimensionDialog::nameChanged );
56 connect( mDefaultDisplayComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsWmsDimensionDialog::defaultDisplayChanged );
57
58 // Set available names
59 const QMetaEnum pnMetaEnum( QMetaEnum::fromType<QgsMapLayerServerProperties::PredefinedWmsDimensionName>() );
60 for ( int i = 0; i < pnMetaEnum.keyCount(); i++ )
61 {
62 const QString name( pnMetaEnum.key( i ) );
63 if ( !alreadyDefinedDimensions.contains( name.toLower() ) )
64 {
65 mNameComboBox->addItem( u"%1%2"_s.arg( !name.isEmpty() ? name.at( 0 ) : QString(), name.mid( 1 ).toLower() ), QVariant( pnMetaEnum.value( i ) ) );
66 }
67 }
68
69 // Set default display combobox
70 mDefaultDisplayComboBox->clear();
71 QMap<int, QString> defaultDisplayLabels = QgsMapLayerServerProperties::wmsDimensionDefaultDisplayLabels();
72 for ( auto it = defaultDisplayLabels.constBegin(); it != defaultDisplayLabels.constEnd(); it++ )
73 {
74 mDefaultDisplayComboBox->addItem( it.value(), QVariant( it.key() ) );
75 }
76 // Set default display to All values
77 mDefaultDisplayComboBox->setCurrentIndex( mDefaultDisplayComboBox->findData( QVariant( QgsMapLayerServerProperties::WmsDimensionInfo::AllValues ) ) );
78
79 mReferenceValueLabel->setEnabled( false );
80 mReferenceValueComboBox->setEnabled( false );
81
82 fieldChanged();
83}
84
86{
87 const QMetaEnum pnMetaEnum( QMetaEnum::fromType<QgsMapLayerServerProperties::PredefinedWmsDimensionName>() );
88 const int predefinedNameValue = pnMetaEnum.keyToValue( info.name.toUpper().toStdString().c_str() );
89 if ( predefinedNameValue == -1 )
90 {
91 mNameComboBox->setEditText( info.name );
92 }
93 else
94 {
95 mNameComboBox->setCurrentIndex( mNameComboBox->findData( QVariant( predefinedNameValue ) ) );
96 }
97 mNameComboBox->setEnabled( false );
98
99 mFieldComboBox->setField( info.fieldName );
100 mEndFieldComboBox->setField( info.endFieldName );
101
102 mUnitsLineEdit->setText( info.units );
103 mUnitSymbolLineEdit->setText( info.unitSymbol );
104
105 mDefaultDisplayComboBox->setCurrentIndex( mDefaultDisplayComboBox->findData( QVariant( info.defaultDisplayType ) ) );
106 if ( info.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::ReferenceValue )
107 {
108 const int referenceValueIndex = mReferenceValueComboBox->findData( info.referenceValue );
109 if ( referenceValueIndex == -1 )
110 {
111 mReferenceValueComboBox->setEditText( info.referenceValue.toString() );
112 }
113 else
114 {
115 mReferenceValueComboBox->setCurrentIndex( referenceValueIndex );
116 }
117 }
118 else
119 {
120 mReferenceValueComboBox->setCurrentIndex( 0 );
121 }
122}
123
125{
126 // Is the name a predefined value?
127 QString name = mNameComboBox->currentText();
128 if ( mNameComboBox->findText( name ) != -1 )
129 {
130 name = name.toLower();
131 }
132
133 // Gets the reference value
134 const QString refText = mReferenceValueComboBox->currentText();
135 QVariant refValue;
136 if ( mReferenceValueComboBox->findText( refText ) != -1 )
137 {
138 refValue = mReferenceValueComboBox->currentData();
139 }
140 return QgsMapLayerServerProperties::WmsDimensionInfo( name, mFieldComboBox->currentField(), mEndFieldComboBox->currentField(), mUnitsLineEdit->text(), mUnitSymbolLineEdit->text(), mDefaultDisplayComboBox->currentData().toInt(), refValue );
141}
142
143void QgsWmsDimensionDialog::nameChanged( const QString &name )
144{
145 // reset input
146 mUnitsLabel->setEnabled( true );
147 mUnitsLineEdit->setEnabled( true );
148 mUnitsLineEdit->clear();
149 mUnitSymbolLabel->setEnabled( true );
150 mUnitSymbolLineEdit->setEnabled( true );
151 mUnitSymbolLineEdit->clear();
152 mFieldLabel->setToolTip( QString() );
153 mEndFieldLabel->setToolTip( QString() );
154 mFieldComboBox->setToolTip( QString() );
155 mEndFieldComboBox->setToolTip( QString() );
156
157 // Is the name a predefined value?
158 if ( mNameComboBox->findText( name ) != -1 )
159 {
160 const int data = mNameComboBox->currentData().toInt();
162 {
164 mFieldComboBox->setFilters( filters );
165 mEndFieldComboBox->setFilters( filters );
166 mUnitsLineEdit->setText( u"ISO8601"_s );
167 mUnitsLabel->setEnabled( false );
168 mUnitsLineEdit->setEnabled( false );
169 mUnitSymbolLabel->setEnabled( false );
170 mUnitSymbolLineEdit->setEnabled( false );
171
172 const QString fieldToolTip = tr( "If a string is used, it must be formatted according to <a href=\"https://www.iso.org/iso-8601-date-and-time-format.html\">ISO8601</a>." );
173 mFieldLabel->setToolTip( fieldToolTip );
174 mEndFieldLabel->setToolTip( fieldToolTip );
175 mFieldComboBox->setToolTip( fieldToolTip );
176 mEndFieldComboBox->setToolTip( fieldToolTip );
177 }
179 {
180 mFieldComboBox->setFilters( QgsFieldProxyModel::String | QgsFieldProxyModel::Date );
181 mEndFieldComboBox->setFilters( QgsFieldProxyModel::String | QgsFieldProxyModel::Date );
182 mUnitsLineEdit->setText( u"ISO8601"_s );
183 mUnitsLabel->setEnabled( false );
184 mUnitsLineEdit->setEnabled( false );
185 mUnitSymbolLabel->setEnabled( false );
186 mUnitSymbolLineEdit->setEnabled( false );
187 }
189 {
190 mFieldComboBox->setFilters( QgsFieldProxyModel::Numeric );
191 mEndFieldComboBox->setFilters( QgsFieldProxyModel::Numeric );
192 }
193 }
194 else
195 {
196 mFieldComboBox->setFilters( QgsFieldProxyModel::AllTypes );
197 mEndFieldComboBox->setFilters( QgsFieldProxyModel::AllTypes );
198 }
199
200 fieldChanged();
201}
202
203void QgsWmsDimensionDialog::fieldChanged()
204{
205 const QString currentFieldName = mFieldComboBox->currentField();
206 const int currentFieldIndexOf = mLayer->fields().indexOf( currentFieldName );
207 QSet<QVariant> uniqueValues = mLayer->uniqueValues( currentFieldIndexOf );
208
209 const QString currentEndFieldName = mEndFieldComboBox->currentField();
210 if ( !currentEndFieldName.isEmpty() )
211 {
212 const int currentEndFieldIndexOf = mLayer->fields().indexOf( currentEndFieldName );
213 uniqueValues.unite( mLayer->uniqueValues( currentEndFieldIndexOf ) );
214 }
215 QList<QVariant> values = qgis::setToList( uniqueValues );
216 std::sort( values.begin(), values.end() );
217
218 mReferenceValueComboBox->clear();
219 mReferenceValueComboBox->addItem( QString(), QVariant() ); // Empty value
220 const auto constValues = values;
221 for ( const QVariant &v : constValues )
222 {
223 mReferenceValueComboBox->addItem( v.toString(), v );
224 }
225}
226
227void QgsWmsDimensionDialog::defaultDisplayChanged( int index )
228{
229 if ( index == 3 )
230 {
231 mReferenceValueLabel->setEnabled( true );
232 mReferenceValueComboBox->setEnabled( true );
233 }
234 else
235 {
236 mReferenceValueLabel->setEnabled( false );
237 mReferenceValueComboBox->setEnabled( false );
238 }
239}
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
@ DateTime
Datetime fields.
@ LongLong
Longlong fields.
@ AllTypes
All field types.
@ Date
Date or datetime fields.
@ Int
Integer fields.
@ String
String fields.
@ Numeric
All numeric fields.
QFlags< Filter > Filters
static QMap< int, QString > wmsDimensionDefaultDisplayLabels()
Returns WMS Dimension default display labels.
Represents a vector layer which manages a vector based dataset.
void setInfo(const QgsMapLayerServerProperties::WmsDimensionInfo &info)
QgsWmsDimensionDialog(QgsVectorLayer *layer, QStringList alreadyDefinedDimensions, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
QgsMapLayerServerProperties::WmsDimensionInfo info() const
Setting to define QGIS Server WMS Dimension.