QGIS API Documentation 4.3.0-Master (90cb4ecf9ef)
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 "qgshelp.h"
22#include "qgsvectorlayer.h"
23
24#include <QPushButton>
25#include <QStandardItemModel>
26#include <QString>
27
28#include "moc_qgswmsdimensiondialog.cpp"
29
30using namespace Qt::StringLiterals;
31
32QgsWmsDimensionDialog::QgsWmsDimensionDialog( QgsVectorLayer *layer, QStringList alreadyDefinedDimensions, QWidget *parent, Qt::WindowFlags f )
33 : QDialog( parent, f )
34 , mLayer( layer )
35{
36 setupUi( this );
37
38 if ( !mLayer )
39 {
40 return;
41 }
42
43 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." );
44 mNameLabel->setToolTip( nameToolTip );
45 mNameComboBox->setToolTip( nameToolTip );
46
47 // Set field combobox
48 mFieldComboBox->setLayer( mLayer );
49 mEndFieldComboBox->setLayer( mLayer );
50 mEndFieldComboBox->setAllowEmptyFieldName( true );
51
52 connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsWmsDimensionDialog::accept );
53 connect( buttonBox, &QDialogButtonBox::rejected, this, &QgsWmsDimensionDialog::reject );
54 connect( buttonBox, &QDialogButtonBox::helpRequested, this, [] { QgsHelp::openHelp( u"working_with_vector/vector_properties.html#vectorservermenu"_s ); } );
55 connect( mFieldComboBox, &QgsFieldComboBox::fieldChanged, this, &QgsWmsDimensionDialog::fieldChanged );
56 connect( mEndFieldComboBox, &QgsFieldComboBox::fieldChanged, this, &QgsWmsDimensionDialog::fieldChanged );
57 connect( mNameComboBox, &QComboBox::editTextChanged, this, &QgsWmsDimensionDialog::nameChanged );
58 connect( mDefaultDisplayComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsWmsDimensionDialog::defaultDisplayChanged );
59
60 // Set available names
61 const QMetaEnum pnMetaEnum( QMetaEnum::fromType<QgsMapLayerServerProperties::PredefinedWmsDimensionName>() );
62 for ( int i = 0; i < pnMetaEnum.keyCount(); i++ )
63 {
64 const QString name( pnMetaEnum.key( i ) );
65 if ( !alreadyDefinedDimensions.contains( name.toLower() ) )
66 {
67 mNameComboBox->addItem( u"%1%2"_s.arg( !name.isEmpty() ? name.at( 0 ) : QString(), name.mid( 1 ).toLower() ), QVariant( pnMetaEnum.value( i ) ) );
68 }
69 }
70
71 // Set default display combobox
72 mDefaultDisplayComboBox->clear();
73 QMap<Qgis::WmsDimensionDefaultDisplay, QString> defaultDisplayDescriptions = QgsMapLayerServerProperties::wmsDimensionDefaultDisplayDescriptions();
74 for ( auto it = defaultDisplayDescriptions.constBegin(); it != defaultDisplayDescriptions.constEnd(); it++ )
75 {
76 mDefaultDisplayComboBox->addItem( it.value(), QVariant( static_cast<int>( it.key() ) ) );
77 }
78 // Set default display to All values
79 mDefaultDisplayComboBox->setCurrentIndex( mDefaultDisplayComboBox->findData( QVariant( static_cast<int>( Qgis::WmsDimensionDefaultDisplay::AllValues ) ) ) );
80
81 mReferenceValueLabel->setEnabled( false );
82 mReferenceValueComboBox->setEnabled( false );
83
84 fieldChanged();
85}
86
88{
89 const QMetaEnum pnMetaEnum( QMetaEnum::fromType<QgsMapLayerServerProperties::PredefinedWmsDimensionName>() );
90 const int predefinedNameValue = pnMetaEnum.keyToValue( info.name.toUpper().toStdString().c_str() );
91 if ( predefinedNameValue == -1 )
92 {
93 mNameComboBox->setEditText( info.name );
94 }
95 else
96 {
97 mNameComboBox->setCurrentIndex( mNameComboBox->findData( QVariant( predefinedNameValue ) ) );
98 }
99 mNameComboBox->setEnabled( false );
100
101 mFieldComboBox->setField( info.fieldName );
102 mEndFieldComboBox->setField( info.endFieldName );
103
104 mUnitsLineEdit->setText( info.units );
105 mUnitSymbolLineEdit->setText( info.unitSymbol );
106
107 mDefaultDisplayComboBox->setCurrentIndex( mDefaultDisplayComboBox->findData( QVariant( static_cast<int>( info.defaultDisplayType ) ) ) );
108 if ( info.defaultDisplayType == Qgis::WmsDimensionDefaultDisplay::ReferenceValue )
109 {
110 const int referenceValueIndex = mReferenceValueComboBox->findData( info.referenceValue );
111 if ( referenceValueIndex == -1 )
112 {
113 mReferenceValueComboBox->setEditText( info.referenceValue.toString() );
114 }
115 else
116 {
117 mReferenceValueComboBox->setCurrentIndex( referenceValueIndex );
118 }
119 }
120 else
121 {
122 mReferenceValueComboBox->setCurrentIndex( 0 );
123 }
124}
125
127{
128 // Is the name a predefined value?
129 QString name = mNameComboBox->currentText();
130 if ( mNameComboBox->findText( name ) != -1 )
131 {
132 name = name.toLower();
133 }
134
135 // Gets the reference value
136 const QString refText = mReferenceValueComboBox->currentText();
137 QVariant refValue;
138 if ( mReferenceValueComboBox->findText( refText ) != -1 )
139 {
140 refValue = mReferenceValueComboBox->currentData();
141 }
143 name,
144 mFieldComboBox->currentField(),
145 mEndFieldComboBox->currentField(),
146 mUnitsLineEdit->text(),
147 mUnitSymbolLineEdit->text(),
148 static_cast<Qgis::WmsDimensionDefaultDisplay>( mDefaultDisplayComboBox->currentData().toInt() ),
149 refValue
150 );
151}
152
153void QgsWmsDimensionDialog::nameChanged( const QString &name )
154{
155 // reset input
156 mUnitsLabel->setEnabled( true );
157 mUnitsLineEdit->setEnabled( true );
158 mUnitsLineEdit->clear();
159 mUnitSymbolLabel->setEnabled( true );
160 mUnitSymbolLineEdit->setEnabled( true );
161 mUnitSymbolLineEdit->clear();
162 mFieldLabel->setToolTip( QString() );
163 mEndFieldLabel->setToolTip( QString() );
164 mFieldComboBox->setToolTip( QString() );
165 mEndFieldComboBox->setToolTip( QString() );
166
167 // Is the name a predefined value?
168 if ( mNameComboBox->findText( name ) != -1 )
169 {
170 const int data = mNameComboBox->currentData().toInt();
172 {
174 mFieldComboBox->setFilters( filters );
175 mEndFieldComboBox->setFilters( filters );
176 mUnitsLineEdit->setText( u"ISO8601"_s );
177 mUnitsLabel->setEnabled( false );
178 mUnitsLineEdit->setEnabled( false );
179 mUnitSymbolLabel->setEnabled( false );
180 mUnitSymbolLineEdit->setEnabled( false );
181
182 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>." );
183 mFieldLabel->setToolTip( fieldToolTip );
184 mEndFieldLabel->setToolTip( fieldToolTip );
185 mFieldComboBox->setToolTip( fieldToolTip );
186 mEndFieldComboBox->setToolTip( fieldToolTip );
187 }
189 {
190 mFieldComboBox->setFilters( QgsFieldProxyModel::String | QgsFieldProxyModel::Date );
191 mEndFieldComboBox->setFilters( QgsFieldProxyModel::String | QgsFieldProxyModel::Date );
192 mUnitsLineEdit->setText( u"ISO8601"_s );
193 mUnitsLabel->setEnabled( false );
194 mUnitsLineEdit->setEnabled( false );
195 mUnitSymbolLabel->setEnabled( false );
196 mUnitSymbolLineEdit->setEnabled( false );
197 }
199 {
200 mFieldComboBox->setFilters( QgsFieldProxyModel::Numeric );
201 mEndFieldComboBox->setFilters( QgsFieldProxyModel::Numeric );
202 }
203 }
204 else
205 {
206 mFieldComboBox->setFilters( QgsFieldProxyModel::AllTypes );
207 mEndFieldComboBox->setFilters( QgsFieldProxyModel::AllTypes );
208 }
209
210 fieldChanged();
211}
212
213void QgsWmsDimensionDialog::fieldChanged()
214{
215 const QString currentFieldName = mFieldComboBox->currentField();
216 const int currentFieldIndexOf = mLayer->fields().indexOf( currentFieldName );
217 QSet<QVariant> uniqueValues = mLayer->uniqueValues( currentFieldIndexOf );
218
219 const QString currentEndFieldName = mEndFieldComboBox->currentField();
220 if ( !currentEndFieldName.isEmpty() )
221 {
222 const int currentEndFieldIndexOf = mLayer->fields().indexOf( currentEndFieldName );
223 uniqueValues.unite( mLayer->uniqueValues( currentEndFieldIndexOf ) );
224 }
225 QList<QVariant> values = qgis::setToList( uniqueValues );
226 std::sort( values.begin(), values.end() );
227
228 mReferenceValueComboBox->clear();
229 mReferenceValueComboBox->addItem( QString(), QVariant() ); // Empty value
230 const auto constValues = values;
231 for ( const QVariant &v : constValues )
232 {
233 mReferenceValueComboBox->addItem( v.toString(), v );
234 }
235}
236
237void QgsWmsDimensionDialog::defaultDisplayChanged( int index )
238{
239 if ( index == 3 )
240 {
241 mReferenceValueLabel->setEnabled( true );
242 mReferenceValueComboBox->setEnabled( true );
243 }
244 else
245 {
246 mReferenceValueLabel->setEnabled( false );
247 mReferenceValueComboBox->setEnabled( false );
248 }
249}
WmsDimensionDefaultDisplay
QGIS Server WMS Dimension default display types.
Definition qgis.h:7030
@ AllValues
Display all values of the dimension.
Definition qgis.h:7031
@ ReferenceValue
Display a reference value.
Definition qgis.h:7034
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 void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:41
static QMap< Qgis::WmsDimensionDefaultDisplay, QString > wmsDimensionDefaultDisplayDescriptions()
Returns WMS Dimension default display descriptions.
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.