QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsowssourceselect.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsowssourceselect.cpp - selector for WMS,WFS,WCS
3 -------------------
4 begin : 3 April 2005
5 copyright :
6 original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
7 wms search : (C) 2009 Mathias Walker <mwa at sourcepole.ch>, Sourcepole AG
8 wms-c support : (C) 2010 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
9 generalized : (C) 2012 Radim Blazek, based on qgswmssourceselect.cpp
10 ***************************************************************************/
11
12/***************************************************************************
13 * *
14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. *
18 * *
19 ***************************************************************************/
20
21#include "qgis.h" // GEO_EPSG_CRS_ID
23#include "qgsdatasourceuri.h"
25#include "qgslogger.h"
27#include "qgsmessageviewer.h"
29#include "qgstreewidgetitem.h"
30#include "qgsproject.h"
31#include "qgsproviderregistry.h"
32#include "qgsowsconnection.h"
33#include "qgsdataprovider.h"
34#include "qgsowssourceselect.h"
35#include "qgssettings.h"
36#include "qgsgui.h"
37
38#include <QButtonGroup>
39#include <QFileDialog>
40#include <QRadioButton>
41#include <QDomDocument>
42#include <QHeaderView>
43#include <QImageReader>
44#include <QInputDialog>
45#include <QMap>
46#include <QMessageBox>
47#include <QPicture>
48#include <QUrl>
49#include <QValidator>
50#include <QNetworkRequest>
51#include <QNetworkReply>
52#include <QRegularExpression>
53
54QgsOWSSourceSelect::QgsOWSSourceSelect( const QString &service, QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
55 : QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
56 , mService( service )
57
58{
59 setupUi( this );
61 connect( mNewButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mNewButton_clicked );
62 connect( mEditButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mEditButton_clicked );
63 connect( mDeleteButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mDeleteButton_clicked );
64 connect( mSaveButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mSaveButton_clicked );
65 connect( mLoadButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLoadButton_clicked );
66 connect( mConnectButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mConnectButton_clicked );
67 connect( mChangeCRSButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mChangeCRSButton_clicked );
68 connect( mLayersTreeWidget, &QTreeWidget::itemSelectionChanged, this, &QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged );
69 connect( mConnectionsComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::activated ), this, &QgsOWSSourceSelect::mConnectionsComboBox_activated );
70 connect( mAddDefaultButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mAddDefaultButton_clicked );
71 connect( mTilesetsTableWidget, &QTableWidget::itemClicked, this, &QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked );
72 connect( mLayerUpButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLayerUpButton_clicked );
73 connect( mLayerDownButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLayerDownButton_clicked );
74 setupButtons( buttonBox );
75
76
77 setWindowTitle( tr( "Add Layer(s) from a %1 Server" ).arg( service ) );
78
79 clearCrs();
80
81 mCacheComboBox->addItem( tr( "Always Cache" ), QNetworkRequest::AlwaysCache );
82 mCacheComboBox->addItem( tr( "Prefer Cache" ), QNetworkRequest::PreferCache );
83 mCacheComboBox->addItem( tr( "Prefer Network" ), QNetworkRequest::PreferNetwork );
84 mCacheComboBox->addItem( tr( "Always Network" ), QNetworkRequest::AlwaysNetwork );
85
86 // 'Prefer network' is the default noted in the combobox's tool tip
87 mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
88
89 if ( widgetMode() != QgsProviderRegistry::WidgetMode::Manager )
90 {
91 //set the current project CRS if available
92 const QgsCoordinateReferenceSystem currentRefSys = QgsProject::instance()->crs();
93 //convert CRS id to epsg
94 if ( currentRefSys.isValid() )
95 {
96 mSelectedCRS = currentRefSys.authid();
97 }
98 }
99 else
100 {
101 mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
102 mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
103 mTimeWidget->hide();
104 mFormatWidget->hide();
105 mCRSWidget->hide();
106 mCacheWidget->hide();
107 }
109
110 // set up the WMS connections we already know about
112}
113
115{
118}
119
121{
122 QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
123 mSpatialExtentBox->setOutputCrs( crs );
124 QgsMapCanvas *canvas = mapCanvas();
125 if ( !canvas )
126 return;
127 QgsCoordinateReferenceSystem destinationCrs = canvas->mapSettings().destinationCrs();
128 mSpatialExtentBox->setCurrentExtent( destinationCrs.bounds(), destinationCrs );
129 mSpatialExtentBox->setOutputExtentFromCurrent();
130 mSpatialExtentBox->setMapCanvas( canvas );
131}
132
134{
136}
137
139{
140 mLayersTreeWidget->clearSelection();
141}
142
144{
145 mFormatComboBox->clear();
146 mFormatComboBox->setEnabled( false );
147}
148
150{
151
152 // A server may offer more similar formats, which are mapped
153 // to the same GDAL format, e.g. GeoTIFF and TIFF
154 // -> recreate always buttons for all available formats, enable supported
155
156 clearFormats();
157
158 if ( mProviderFormats.isEmpty() )
159 {
160 mProviderFormats = providerFormats();
161 for ( int i = 0; i < mProviderFormats.size(); i++ )
162 {
163 // GDAL mime types may be image/tiff, image/png, ...
164 mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
165 }
166 }
167
168 // selectedLayersFormats may come in various forms:
169 // image/tiff, GTiff, GeoTIFF, TIFF, geotiff_int16, geotiff_rgb,
170 // PNG, GTOPO30, ARCGRID, IMAGEMOSAIC
171 // and even any string defined in server configuration, for example the
172 // value used in UMN Mapserver for OUTPUTFORMAT->NAME is used in
173 // WCS 1.0.0 SupportedFormats/Format
174
175 // TODO: It is impossible to cover all possible formats coming from server
176 // -> enabled all formats, GDAL may be able to open them
177
178 QMap<QString, QString> formatsMap;
179 formatsMap.insert( QStringLiteral( "geotiff" ), QStringLiteral( "tiff" ) );
180 formatsMap.insert( QStringLiteral( "gtiff" ), QStringLiteral( "tiff" ) );
181 formatsMap.insert( QStringLiteral( "tiff" ), QStringLiteral( "tiff" ) );
182 formatsMap.insert( QStringLiteral( "tif" ), QStringLiteral( "tiff" ) );
183 formatsMap.insert( QStringLiteral( "gif" ), QStringLiteral( "gif" ) );
184 formatsMap.insert( QStringLiteral( "jpeg" ), QStringLiteral( "jpeg" ) );
185 formatsMap.insert( QStringLiteral( "jpg" ), QStringLiteral( "jpeg" ) );
186 formatsMap.insert( QStringLiteral( "png" ), QStringLiteral( "png" ) );
187
188 int preferred = -1;
189 const QStringList layersFormats = selectedLayersFormats();
190 for ( int i = 0; i < layersFormats.size(); i++ )
191 {
192 const QString format = layersFormats.value( i );
193 QgsDebugMsgLevel( "server format = " + format, 2 );
194 const QString simpleFormat = format.toLower().remove( QStringLiteral( "image/" ) ).remove( QRegularExpression( "_.*" ) );
195 QgsDebugMsgLevel( "server simpleFormat = " + simpleFormat, 2 );
196 const QString mimeFormat = "image/" + formatsMap.value( simpleFormat );
197 QgsDebugMsgLevel( "server mimeFormat = " + mimeFormat, 2 );
198
199 QString label = format;
200
201 if ( mMimeLabelMap.contains( mimeFormat ) )
202 {
203 if ( format != mMimeLabelMap.value( mimeFormat ) )
204 {
205 // Append name of GDAL driver
206 label += " / " + mMimeLabelMap.value( mimeFormat );
207 }
208
209 if ( simpleFormat.contains( QLatin1String( "tif" ) ) ) // prefer *tif*
210 {
211 if ( preferred < 0 || simpleFormat.startsWith( 'g' ) ) // prefer geotiff
212 {
213 preferred = i;
214 }
215 }
216 }
217 else
218 {
219 // We cannot always say that the format is not supported by GDAL because
220 // server can use strange names, but format itself is supported
221 QgsDebugMsgLevel( QStringLiteral( "format %1 unknown" ).arg( format ), 2 );
222 }
223
224 mFormatComboBox->insertItem( i, label );
225 }
226 // Set preferred
227 // TODO: all enabled for now, see above
228 preferred = preferred >= 0 ? preferred : 0;
229 mFormatComboBox->setCurrentIndex( preferred );
230
231 mFormatComboBox->setEnabled( true );
232}
233
235{
236 mTimeComboBox->clear();
237 mTimeComboBox->insertItems( 0, selectedLayersTimes() );
238 mTimeComboBox->setEnabled( !selectedLayersTimes().isEmpty() );
239}
240
242{
243 mTimeComboBox->clear();
244 mTimeComboBox->setEnabled( false );
245}
246
248{
249 mConnectionsComboBox->clear();
250 mConnectionsComboBox->addItems( QgsOwsConnection::connectionList( mService ) );
251
253}
254
256{
257 if ( string.compare( QLatin1String( "wms" ), Qt::CaseInsensitive ) == 0 )
259 else if ( string.compare( QLatin1String( "wfs" ), Qt::CaseInsensitive ) == 0 )
261 else if ( string.compare( QLatin1String( "wcs" ), Qt::CaseInsensitive ) == 0 )
263 else
265}
266
267void QgsOWSSourceSelect::mNewButton_clicked()
268{
270 QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, type, mService.toUpper() );
271
272 if ( nc->exec() )
273 {
275 emit connectionsChanged();
276 }
277
278 delete nc;
279}
280
281void QgsOWSSourceSelect::mEditButton_clicked()
282{
284 QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, type, mService.toUpper(), mConnectionsComboBox->currentText() );
285
286 if ( nc->exec() )
287 {
289 emit connectionsChanged();
290 }
291
292 delete nc;
293}
294
295void QgsOWSSourceSelect::mDeleteButton_clicked()
296{
297 const QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
298 .arg( mConnectionsComboBox->currentText() );
299 const QMessageBox::StandardButton result = QMessageBox::question( this, tr( "Remove Connection" ), msg, QMessageBox::Yes | QMessageBox::No );
300 if ( result == QMessageBox::Yes )
301 {
302 QgsOwsConnection::deleteConnection( mService, mConnectionsComboBox->currentText() );
303 mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() ); // populateConnectionList();
305 emit connectionsChanged();
306 }
307}
308
309void QgsOWSSourceSelect::mSaveButton_clicked()
310{
312 dlg.exec();
313}
314
315void QgsOWSSourceSelect::mLoadButton_clicked()
316{
317 const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load Connections" ), QDir::homePath(),
318 tr( "XML files (*.xml *.XML)" ) );
319 if ( fileName.isEmpty() )
320 {
321 return;
322 }
323
325 dlg.exec();
327 emit connectionsChanged();
328}
329
331 int id,
332 const QStringList &names,
333 QMap<int, QgsTreeWidgetItem *> &items,
334 int &layerAndStyleCount,
335 const QMap<int, int> &layerParents,
336 const QMap<int, QStringList> &layerParentNames )
337{
338 QgsDebugMsgLevel( QStringLiteral( "id = %1 layerAndStyleCount = %2 names = %3 " ).arg( id ).arg( layerAndStyleCount ).arg( names.join( "," ) ), 2 );
339 if ( items.contains( id ) )
340 return items[id];
341
342
343 QgsTreeWidgetItem *item = nullptr;
344 if ( layerParents.contains( id ) )
345 {
346 // it has parent -> create first its parent
347 const int parent = layerParents[ id ];
348 item = new QgsTreeWidgetItem( createItem( parent, layerParentNames[ parent ], items, layerAndStyleCount, layerParents, layerParentNames ) );
349 }
350 else
351 item = new QgsTreeWidgetItem( mLayersTreeWidget );
352
353 item->setText( 0, QString::number( ++layerAndStyleCount ) );
354 item->setText( 1, names[0].simplified() );
355 item->setText( 2, names[1].simplified() );
356 item->setText( 3, names[2].simplified() );
357 item->setToolTip( 3, "<font color=black>" + names[2].simplified() + "</font>" );
358
359 items[ id ] = item;
360
361 return item;
362}
363
365{
366}
367
368void QgsOWSSourceSelect::mConnectButton_clicked()
369{
370
371 mLayersTreeWidget->clear();
372 clearFormats();
373 clearTimes();
374 clearCrs();
375
376 mConnName = mConnectionsComboBox->currentText();
377
378 const QgsOwsConnection connection( mService, mConnectionsComboBox->currentText() );
379 mUri = connection.uri();
380
381 QApplication::setOverrideCursor( Qt::WaitCursor );
382
383 QgsDebugMsgLevel( QStringLiteral( "call populateLayerList" ), 3 );
385
386 QApplication::restoreOverrideCursor();
387}
388
390{
391}
392
393void QgsOWSSourceSelect::mChangeCRSButton_clicked()
394{
395 QStringList layers;
396 const auto constSelectedItems = mLayersTreeWidget->selectedItems();
397 for ( QTreeWidgetItem *item : constSelectedItems )
398 {
399 const QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
400 if ( !layer.isEmpty() )
401 layers << layer;
402 }
403
405 mySelector->setOgcWmsCrsFilter( mSelectedLayersCRSs );
406
408 if ( defaultCRS.isValid() )
409 {
410 mySelector->setCrs( defaultCRS );
411 }
412 else
413 {
414 mySelector->showNoCrsForLayerMessage();
415 }
416
417 if ( !mySelector->exec() )
418 return;
419
420 mSelectedCRS = mySelector->crs().authid();
421 mSpatialExtentBox->setOutputCrs( mySelector->crs() );
422 delete mySelector;
423
424 mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
425
426 for ( int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
427 {
428 enableLayersForCrs( mLayersTreeWidget->topLevelItem( i ) );
429 }
430
431 updateButtons();
432}
433
434void QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged()
435{
436}
437
439{
440 clearCrs();
441 mSelectedLayersCRSs = qgis::listToSet( selectedLayersCrses() );
442 mCRSLabel->setText( tr( "Coordinate Reference System (%n available)", "crs count", mSelectedLayersCRSs.count() ) + ':' );
443
444 mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
445
446 if ( !mSelectedLayersCRSs.isEmpty() )
447 {
448 // check whether current CRS is supported
449 // if not, use one of the available CRS
450 QString defaultCRS;
451 QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
452 for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
453 {
454 if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
455 break;
456
457 // save first CRS in case the current CRS is not available
458 if ( it == mSelectedLayersCRSs.constBegin() )
459 defaultCRS = *it;
460
461 // prefer value of DEFAULT_GEO_EPSG_CRS_ID if available
462 if ( *it == geoEpsgCrsAuthId() )
463 defaultCRS = *it;
464 }
465
466 if ( it == mSelectedLayersCRSs.constEnd() )
467 {
468 if ( mSelectedLayersCRSs.constFind( QgsProject::instance()->crs().authid() ) != mSelectedLayersCRSs.constEnd() )
469 {
470 mSelectedCRS = QgsProject::instance()->crs().authid();
471 }
472 else
473 {
474 // not found
475 mSelectedCRS = defaultCRS;
476 }
477 }
478 mSpatialExtentBox->setOutputCrs( QgsCoordinateReferenceSystem( mSelectedCRS ) );
479 mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
480 mChangeCRSButton->setEnabled( true );
481 }
482 QgsDebugMsgLevel( "mSelectedCRS = " + mSelectedCRS, 2 );
483}
484
486{
487 mCRSLabel->setText( tr( "Coordinate Reference System" ) + ':' );
488 mSelectedCRS.clear();
489 mSelectedCRSLabel->clear();
490 mChangeCRSButton->setEnabled( false );
491}
492
493void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
494{
495 Q_UNUSED( item )
496
497 QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
498 const bool wasSelected = mCurrentTileset == rowItem;
499
500 mTilesetsTableWidget->blockSignals( true );
501 mTilesetsTableWidget->clearSelection();
502 if ( !wasSelected )
503 {
504 QgsDebugMsgLevel( QStringLiteral( "selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ), 2 );
505 mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
506 mCurrentTileset = rowItem;
507 }
508 else
509 {
510 mCurrentTileset = nullptr;
511 }
512 mTilesetsTableWidget->blockSignals( false );
513
514 updateButtons();
515}
516
517
518
520{
521 return mConnName;
522}
523
525{
526 return mConnectionInfo;
527}
528
530{
531 return selectedLayersFormats().value( mFormatComboBox->currentIndex() );
532}
533
534QNetworkRequest::CacheLoadControl QgsOWSSourceSelect::selectedCacheLoadControl()
535{
536 const int cache = mCacheComboBox->currentData().toInt();
537 return static_cast<QNetworkRequest::CacheLoadControl>( cache );
538}
539
541{
542 return mSelectedCRS;
543}
544
546{
547 return mTimeComboBox->currentText();
548}
549
551{
552 const QString toSelect = QgsOwsConnection::selectedConnection( mService );
553
554 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
555
556 if ( mConnectionsComboBox->currentIndex() < 0 )
557 {
558 if ( toSelect.isNull() )
559 mConnectionsComboBox->setCurrentIndex( 0 );
560 else
561 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
562 }
563
564 if ( mConnectionsComboBox->count() == 0 )
565 {
566 // No connections - disable various buttons
567 mConnectButton->setEnabled( false );
568 mEditButton->setEnabled( false );
569 mDeleteButton->setEnabled( false );
570 mSaveButton->setEnabled( false );
571 }
572 else
573 {
574 // Connections - enable various buttons
575 mConnectButton->setEnabled( true );
576 mEditButton->setEnabled( true );
577 mDeleteButton->setEnabled( true );
578 mSaveButton->setEnabled( true );
579 }
580
581 QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
582}
583
584void QgsOWSSourceSelect::showStatusMessage( QString const &message )
585{
586 mStatusLabel->setText( message );
587
588 // update the display of this widget
589 update();
590}
591
592
593void QgsOWSSourceSelect::showError( QString const &title, QString const &format, QString const &error )
594{
595 QgsMessageViewer *mv = new QgsMessageViewer( this );
596 mv->setWindowTitle( title );
597
598 if ( format == QLatin1String( "text/html" ) )
599 {
600 mv->setMessageAsHtml( error );
601 }
602 else
603 {
604 mv->setMessageAsPlainText( tr( "Could not understand the response:\n%1" ).arg( error ) );
605 }
606 mv->showMessage( true ); // Is deleted when closed
607}
608
609void QgsOWSSourceSelect::mConnectionsComboBox_activated( int )
610{
611 // Remember which server was selected.
612 QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
613}
614
615void QgsOWSSourceSelect::mAddDefaultButton_clicked()
616{
618}
619
620QString QgsOWSSourceSelect::descriptionForAuthId( const QString &authId )
621{
622 if ( mCrsNames.contains( authId ) )
623 return mCrsNames[ authId ];
624
626 mCrsNames.insert( authId, qgisSrs.userFriendlyIdentifier() );
627 return qgisSrs.userFriendlyIdentifier();
628}
629
631{
632 QMap<QString, QString> exampleServers;
633 exampleServers[QStringLiteral( "DM Solutions GMap" )] = QStringLiteral( "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
634 exampleServers[QStringLiteral( "Lizardtech server" )] = QStringLiteral( "http://wms.lizardtech.com/lizardtech/iserv/ows" );
635 // Nice to have the qgis users map, but I'm not sure of the URL at the moment.
636 // exampleServers["Qgis users map"] = "http://qgis.org/wms.cgi";
637
638 QgsSettings settings;
639 settings.beginGroup( "/qgis/connections-" + mService.toLower() );
640 QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
641 for ( ; i != exampleServers.constEnd(); ++i )
642 {
643 // Only do a server if it's name doesn't already exist.
644 const QStringList keys = settings.childGroups();
645 if ( !keys.contains( i.key() ) )
646 {
647 const QString path = i.key();
648 settings.setValue( path + "/url", i.value() );
649 }
650 }
651 settings.endGroup();
653
654 QMessageBox::information( this, tr( "Add WMS Servers" ), "<p>" + tr( "Several WMS servers have "
655 "been added to the server list. Note that if "
656 "you access the Internet via a web proxy, you will "
657 "need to set the proxy settings in the QGIS options dialog." ) + "</p>" );
658}
659
660void QgsOWSSourceSelect::mLayerUpButton_clicked()
661{
662 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
663 if ( selectionList.empty() )
664 {
665 return;
666 }
667 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
668 if ( selectedIndex < 1 )
669 {
670 return; //item not existing or already on top
671 }
672
673 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
674 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
675 mLayerOrderTreeWidget->clearSelection();
676 selectedItem->setSelected( true );
677}
678
679void QgsOWSSourceSelect::mLayerDownButton_clicked()
680{
681 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
682 if ( selectionList.empty() )
683 {
684 return;
685 }
686 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
687 if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
688 {
689 return; //item not existing or already at bottom
690 }
691
692 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
693 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
694 mLayerOrderTreeWidget->clearSelection();
695 selectedItem->setSelected( true );
696}
697
698QList<QgsOWSSourceSelect::SupportedFormat> QgsOWSSourceSelect::providerFormats()
699{
700 return QList<SupportedFormat>();
701}
702
704{
705 return QStringList();
706}
707
709{
710 return QStringList();
711}
712
714{
715 return QStringList();
716}
717
718void QgsOWSSourceSelect::updateButtons()
719{
720}
Abstract base Data Source Widget to create connections and add layers This class provides common func...
virtual QgsMapCanvas * mapCanvas()
Returns the dialog map canvas.
void setupButtons(QDialogButtonBox *buttonBox)
Connect the ok and apply/add buttons to the slots.
virtual void setMapCanvas(QgsMapCanvas *mapCanvas)
Sets the dialog map canvas.
void connectionsChanged()
Emitted when the provider's connections have changed This signal is normally forwarded the app and us...
QgsProviderRegistry::WidgetMode widgetMode() const
Returns the widget mode.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QgsRectangle bounds() const
Returns the approximate bounds for the region the CRS is usable within.
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
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:194
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:93
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
A generic message view for displaying QGIS messages.
void setMessageAsPlainText(const QString &msg)
void showMessage(bool blocking=true) override
display the message to the user and deletes itself
void setMessageAsHtml(const QString &msg)
Dialog to allow the user to configure and save connection information for an HTTP Server for WMS,...
ConnectionType
Available connection types for configuring in the dialog.
@ ConnectionWms
WMS connection.
@ ConnectionWfs
WFS connection.
@ ConnectionWcs
WCS connection.
virtual QStringList selectedLayersCrses()
Server CRS supported for currently selected layer item(s)
virtual QStringList selectedLayersTimes()
List of times (temporalDomain timePosition/timePeriod for currently selected layer item(s)
QString descriptionForAuthId(const QString &authId)
Returns a textual description for the authority id.
void refresh() override
Triggered when the provider's connections need to be refreshed.
QString selectedTime()
Returns currently selected time.
void clearCrs()
Clear CRSs.
void populateCrs()
Sets supported CRSs.
virtual void enableLayersForCrs(QTreeWidgetItem *item)
QString mService
Service name.
virtual QList< QgsOWSSourceSelect::SupportedFormat > providerFormats()
List of image formats (encodings) supported by provider.
QgsOWSSourceSelect(const QString &service, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::None)
Constructor.
QString connectionInfo()
Connection info (uri)
void setMapCanvas(QgsMapCanvas *mapCanvas) override
Sets the dialog map canvas.
QNetworkRequest::CacheLoadControl selectedCacheLoadControl()
Returns currently selected cache load control.
void populateFormats()
Populate supported formats.
QTableWidgetItem * mCurrentTileset
QString selectedCrs()
Returns currently selected Crs.
void populateTimes()
Populate times.
virtual QStringList selectedLayersFormats()
List of formats supported for currently selected layer item(s)
void reset() override
Called when this source select widget is being shown in a "new and clean" dialog.
void setConnectionListPosition()
Sets the server connection combo box to that stored in the config file.
void clearTimes()
Clear times.
QgsTreeWidgetItem * createItem(int id, const QStringList &names, QMap< int, QgsTreeWidgetItem * > &items, int &layerAndStyleCount, const QMap< int, int > &layerParents, const QMap< int, QStringList > &layerParentNames)
create an item including possible parents
QString selectedFormat()
Returns currently selected format.
QString mConnName
Name for selected connection.
void showError(const QString &title, const QString &format, const QString &error)
show whatever error is exposed.
void populateConnectionList()
Populate the connection list combo box.
QString connName()
Connection name.
void addDefaultServers()
Add a few example servers to the list.
void showStatusMessage(const QString &message)
Sets status message to theMessage.
QgsDataSourceUri mUri
URI for selected connection.
QString mConnectionInfo
Connection info for selected connection.
void prepareExtent()
Prepares the spatial extent box with the general settings including original crs, destination crs and...
void clearFormats()
Clear previously set formats.
virtual void populateLayerList()
Populate the layer list.
QMap< QString, QString > mCrsNames
Connections management.
static QStringList connectionList(const QString &service)
Returns the list of connections for the specified service.
static void setSelectedConnection(const QString &service, const QString &name)
Marks the specified connection for the specified service as selected.
static void deleteConnection(const QString &service, const QString &name)
Deletes the connection for the specified service with the specified name.
static QString selectedConnection(const QString &service)
Retrieves the selected connection for the specified service.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:481
QgsCoordinateReferenceSystem crs
Definition: qgsproject.h:112
A generic dialog to prompt the user for a Coordinate Reference System.
void showNoCrsForLayerMessage()
When called, the dialog will show a default "layer has no CRS set" message above the projection selec...
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the initial crs to show within the dialog.
QgsCoordinateReferenceSystem crs() const
Returns the CRS currently selected in the widget.
void setOgcWmsCrsFilter(const QSet< QString > &crsFilter)
filters this dialog by the given CRSs
WidgetMode
Different ways a source select dialog can be used.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:64
QStringList childGroups(Qgis::SettingsOrigin origin=Qgis::SettingsOrigin::Any) const
Returns a list of all key top-level groups that contain keys that can be read using the QSettings obj...
void endGroup()
Resets the group to what it was before the corresponding beginGroup() call.
void beginGroup(const QString &prefix, QgsSettings::Section section=QgsSettings::NoSection)
Appends prefix to the current group.
Definition: qgssettings.cpp:92
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
QTreeWidgetItem subclass with custom handling for item sorting.
CONSTLATIN1STRING geoEpsgCrsAuthId()
Geographic coord sys from EPSG authority.
Definition: qgis.h:5688
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)
const QgsCoordinateReferenceSystem & crs