QGIS API Documentation 3.41.0-Master (3440c17df1d)
Loading...
Searching...
No Matches
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 "moc_qgsowssourceselect.cpp"
36#include "qgssettings.h"
37#include "qgsgui.h"
38
39#include <QButtonGroup>
40#include <QFileDialog>
41#include <QRadioButton>
42#include <QDomDocument>
43#include <QHeaderView>
44#include <QImageReader>
45#include <QInputDialog>
46#include <QMap>
47#include <QMessageBox>
48#include <QPicture>
49#include <QUrl>
50#include <QValidator>
51#include <QNetworkRequest>
52#include <QNetworkReply>
53#include <QRegularExpression>
54
55QgsOWSSourceSelect::QgsOWSSourceSelect( const QString &service, QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
56 : QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
57 , mService( service )
58
59{
60 setupUi( this );
62 connect( mNewButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mNewButton_clicked );
63 connect( mEditButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mEditButton_clicked );
64 connect( mDeleteButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mDeleteButton_clicked );
65 connect( mSaveButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mSaveButton_clicked );
66 connect( mLoadButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLoadButton_clicked );
67 connect( mConnectButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mConnectButton_clicked );
68 connect( mChangeCRSButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mChangeCRSButton_clicked );
69 connect( mLayersTreeWidget, &QTreeWidget::itemSelectionChanged, this, &QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged );
70 connect( mConnectionsComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::activated ), this, &QgsOWSSourceSelect::mConnectionsComboBox_activated );
71 connect( mAddDefaultButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mAddDefaultButton_clicked );
72 connect( mTilesetsTableWidget, &QTableWidget::itemClicked, this, &QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked );
73 connect( mLayerUpButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLayerUpButton_clicked );
74 connect( mLayerDownButton, &QPushButton::clicked, this, &QgsOWSSourceSelect::mLayerDownButton_clicked );
75 setupButtons( buttonBox );
76
77
78 setWindowTitle( tr( "Add Layer(s) from a %1 Server" ).arg( service ) );
79
80 clearCrs();
81
82 mCacheComboBox->addItem( tr( "Always Cache" ), QNetworkRequest::AlwaysCache );
83 mCacheComboBox->addItem( tr( "Prefer Cache" ), QNetworkRequest::PreferCache );
84 mCacheComboBox->addItem( tr( "Prefer Network" ), QNetworkRequest::PreferNetwork );
85 mCacheComboBox->addItem( tr( "Always Network" ), QNetworkRequest::AlwaysNetwork );
86
87 // 'Prefer network' is the default noted in the combobox's tool tip
88 mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
89
91 {
92 //set the current project CRS if available
93 const QgsCoordinateReferenceSystem currentRefSys = QgsProject::instance()->crs();
94 //convert CRS id to epsg
95 if ( currentRefSys.isValid() )
96 {
97 mSelectedCRS = currentRefSys.authid();
98 }
99 }
100 else
101 {
102 mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
103 mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
104 mTimeWidget->hide();
105 mFormatWidget->hide();
106 mCRSWidget->hide();
107 mCacheWidget->hide();
108 }
110
111 // set up the WMS connections we already know about
113}
114
120
122{
123 QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
124 mSpatialExtentBox->setOutputCrs( crs );
125 QgsMapCanvas *canvas = mapCanvas();
126 if ( !canvas )
127 return;
128 QgsCoordinateReferenceSystem destinationCrs = canvas->mapSettings().destinationCrs();
129 mSpatialExtentBox->setCurrentExtent( destinationCrs.bounds(), destinationCrs );
130 mSpatialExtentBox->setOutputExtentFromCurrent();
131 mSpatialExtentBox->setMapCanvas( canvas );
132}
133
138
140{
141 mLayersTreeWidget->clearSelection();
142}
143
145{
146 mFormatComboBox->clear();
147 mFormatComboBox->setEnabled( false );
148}
149
151{
152
153 // A server may offer more similar formats, which are mapped
154 // to the same GDAL format, e.g. GeoTIFF and TIFF
155 // -> recreate always buttons for all available formats, enable supported
156
157 clearFormats();
158
159 if ( mProviderFormats.isEmpty() )
160 {
161 mProviderFormats = providerFormats();
162 for ( int i = 0; i < mProviderFormats.size(); i++ )
163 {
164 // GDAL mime types may be image/tiff, image/png, ...
165 mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
166 }
167 }
168
169 // selectedLayersFormats may come in various forms:
170 // image/tiff, GTiff, GeoTIFF, TIFF, geotiff_int16, geotiff_rgb,
171 // PNG, GTOPO30, ARCGRID, IMAGEMOSAIC
172 // and even any string defined in server configuration, for example the
173 // value used in UMN Mapserver for OUTPUTFORMAT->NAME is used in
174 // WCS 1.0.0 SupportedFormats/Format
175
176 // TODO: It is impossible to cover all possible formats coming from server
177 // -> enabled all formats, GDAL may be able to open them
178
179 QMap<QString, QString> formatsMap;
180 formatsMap.insert( QStringLiteral( "geotiff" ), QStringLiteral( "tiff" ) );
181 formatsMap.insert( QStringLiteral( "gtiff" ), QStringLiteral( "tiff" ) );
182 formatsMap.insert( QStringLiteral( "tiff" ), QStringLiteral( "tiff" ) );
183 formatsMap.insert( QStringLiteral( "tif" ), QStringLiteral( "tiff" ) );
184 formatsMap.insert( QStringLiteral( "gif" ), QStringLiteral( "gif" ) );
185 formatsMap.insert( QStringLiteral( "jpeg" ), QStringLiteral( "jpeg" ) );
186 formatsMap.insert( QStringLiteral( "jpg" ), QStringLiteral( "jpeg" ) );
187 formatsMap.insert( QStringLiteral( "png" ), QStringLiteral( "png" ) );
188
189 int preferred = -1;
190 const QStringList layersFormats = selectedLayersFormats();
191 for ( int i = 0; i < layersFormats.size(); i++ )
192 {
193 const QString format = layersFormats.value( i );
194 QgsDebugMsgLevel( "server format = " + format, 2 );
195 const QString simpleFormat = format.toLower().remove( QStringLiteral( "image/" ) ).remove( QRegularExpression( "_.*" ) );
196 QgsDebugMsgLevel( "server simpleFormat = " + simpleFormat, 2 );
197 const QString mimeFormat = "image/" + formatsMap.value( simpleFormat );
198 QgsDebugMsgLevel( "server mimeFormat = " + mimeFormat, 2 );
199
200 QString label = format;
201
202 if ( mMimeLabelMap.contains( mimeFormat ) )
203 {
204 if ( format != mMimeLabelMap.value( mimeFormat ) )
205 {
206 // Append name of GDAL driver
207 label += " / " + mMimeLabelMap.value( mimeFormat );
208 }
209
210 if ( simpleFormat.contains( QLatin1String( "tif" ) ) ) // prefer *tif*
211 {
212 if ( preferred < 0 || simpleFormat.startsWith( 'g' ) ) // prefer geotiff
213 {
214 preferred = i;
215 }
216 }
217 }
218 else
219 {
220 // We cannot always say that the format is not supported by GDAL because
221 // server can use strange names, but format itself is supported
222 QgsDebugMsgLevel( QStringLiteral( "format %1 unknown" ).arg( format ), 2 );
223 }
224
225 mFormatComboBox->insertItem( i, label );
226 }
227 // Set preferred
228 // TODO: all enabled for now, see above
229 preferred = preferred >= 0 ? preferred : 0;
230 mFormatComboBox->setCurrentIndex( preferred );
231
232 mFormatComboBox->setEnabled( true );
233}
234
236{
237 mTimeComboBox->clear();
238 mTimeComboBox->insertItems( 0, selectedLayersTimes() );
239 mTimeComboBox->setEnabled( !selectedLayersTimes().isEmpty() );
240}
241
243{
244 mTimeComboBox->clear();
245 mTimeComboBox->setEnabled( false );
246}
247
249{
250 mConnectionsComboBox->clear();
251 mConnectionsComboBox->addItems( QgsOwsConnection::connectionList( mService ) );
252
254}
255
257{
258 if ( string.compare( QLatin1String( "wms" ), Qt::CaseInsensitive ) == 0 )
260 else if ( string.compare( QLatin1String( "wfs" ), Qt::CaseInsensitive ) == 0 )
262 else if ( string.compare( QLatin1String( "wcs" ), Qt::CaseInsensitive ) == 0 )
264 else
266}
267
268void QgsOWSSourceSelect::mNewButton_clicked()
269{
271 QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, type, mService.toUpper() );
272
273 if ( nc->exec() )
274 {
276 emit connectionsChanged();
277 }
278
279 delete nc;
280}
281
282void QgsOWSSourceSelect::mEditButton_clicked()
283{
285 QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, type, mService.toUpper(), mConnectionsComboBox->currentText() );
286
287 if ( nc->exec() )
288 {
290 emit connectionsChanged();
291 }
292
293 delete nc;
294}
295
296void QgsOWSSourceSelect::mDeleteButton_clicked()
297{
298 const QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
299 .arg( mConnectionsComboBox->currentText() );
300 const QMessageBox::StandardButton result = QMessageBox::question( this, tr( "Remove Connection" ), msg, QMessageBox::Yes | QMessageBox::No );
301 if ( result == QMessageBox::Yes )
302 {
303 QgsOwsConnection::deleteConnection( mService, mConnectionsComboBox->currentText() );
304 mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() ); // populateConnectionList();
306 emit connectionsChanged();
307 }
308}
309
310void QgsOWSSourceSelect::mSaveButton_clicked()
311{
313 dlg.exec();
314}
315
316void QgsOWSSourceSelect::mLoadButton_clicked()
317{
318 const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load Connections" ), QDir::homePath(),
319 tr( "XML files (*.xml *.XML)" ) );
320 if ( fileName.isEmpty() )
321 {
322 return;
323 }
324
326 dlg.exec();
328 emit connectionsChanged();
329}
330
332 int id,
333 const QStringList &names,
334 QMap<int, QgsTreeWidgetItem *> &items,
335 int &layerAndStyleCount,
336 const QMap<int, int> &layerParents,
337 const QMap<int, QStringList> &layerParentNames )
338{
339 QgsDebugMsgLevel( QStringLiteral( "id = %1 layerAndStyleCount = %2 names = %3 " ).arg( id ).arg( layerAndStyleCount ).arg( names.join( "," ) ), 2 );
340 if ( items.contains( id ) )
341 return items[id];
342
343
344 QgsTreeWidgetItem *item = nullptr;
345 if ( layerParents.contains( id ) )
346 {
347 // it has parent -> create first its parent
348 const int parent = layerParents[ id ];
349 item = new QgsTreeWidgetItem( createItem( parent, layerParentNames[ parent ], items, layerAndStyleCount, layerParents, layerParentNames ) );
350 }
351 else
352 item = new QgsTreeWidgetItem( mLayersTreeWidget );
353
354 item->setText( 0, QString::number( ++layerAndStyleCount ) );
355 item->setText( 1, names[0].simplified() );
356 item->setText( 2, names[1].simplified() );
357 item->setText( 3, names[2].simplified() );
358 item->setToolTip( 3, "<font color=black>" + names[2].simplified() + "</font>" );
359
360 items[ id ] = item;
361
362 return item;
363}
364
368
369void QgsOWSSourceSelect::mConnectButton_clicked()
370{
371
372 mLayersTreeWidget->clear();
373 clearFormats();
374 clearTimes();
375 clearCrs();
376
377 mConnName = mConnectionsComboBox->currentText();
378
379 const QgsOwsConnection connection( mService, mConnectionsComboBox->currentText() );
380 mUri = connection.uri();
381
382 QApplication::setOverrideCursor( Qt::WaitCursor );
383
384 QgsDebugMsgLevel( QStringLiteral( "call populateLayerList" ), 3 );
386
387 QApplication::restoreOverrideCursor();
388}
389
391{
392}
393
394void QgsOWSSourceSelect::mChangeCRSButton_clicked()
395{
396 QStringList layers;
397 const auto constSelectedItems = mLayersTreeWidget->selectedItems();
398 for ( QTreeWidgetItem *item : constSelectedItems )
399 {
400 const QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
401 if ( !layer.isEmpty() )
402 layers << layer;
403 }
404
406 mySelector->setOgcWmsCrsFilter( mSelectedLayersCRSs );
407
409 if ( defaultCRS.isValid() )
410 {
411 mySelector->setCrs( defaultCRS );
412 }
413 else
414 {
415 mySelector->showNoCrsForLayerMessage();
416 }
417
418 if ( !mySelector->exec() )
419 return;
420
421 mSelectedCRS = mySelector->crs().authid();
422 mSpatialExtentBox->setOutputCrs( mySelector->crs() );
423 delete mySelector;
424
425 mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
426
427 for ( int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
428 {
429 enableLayersForCrs( mLayersTreeWidget->topLevelItem( i ) );
430 }
431
432 updateButtons();
433}
434
435void QgsOWSSourceSelect::mLayersTreeWidget_itemSelectionChanged()
436{
437}
438
440{
441 clearCrs();
442 mSelectedLayersCRSs = qgis::listToSet( selectedLayersCrses() );
443 mCRSLabel->setText( tr( "Coordinate Reference System (%n available)", "crs count", mSelectedLayersCRSs.count() ) + ':' );
444
445 mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
446
447 if ( !mSelectedLayersCRSs.isEmpty() )
448 {
449 // check whether current CRS is supported
450 // if not, use one of the available CRS
451 QString defaultCRS;
452 QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
453 for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
454 {
455 if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
456 break;
457
458 // save first CRS in case the current CRS is not available
459 if ( it == mSelectedLayersCRSs.constBegin() )
460 defaultCRS = *it;
461
462 // prefer value of DEFAULT_GEO_EPSG_CRS_ID if available
463 if ( *it == geoEpsgCrsAuthId() )
464 defaultCRS = *it;
465 }
466
467 if ( it == mSelectedLayersCRSs.constEnd() )
468 {
469 if ( mSelectedLayersCRSs.constFind( QgsProject::instance()->crs().authid() ) != mSelectedLayersCRSs.constEnd() )
470 {
471 mSelectedCRS = QgsProject::instance()->crs().authid();
472 }
473 else
474 {
475 // not found
476 mSelectedCRS = defaultCRS;
477 }
478 }
479 mSpatialExtentBox->setOutputCrs( QgsCoordinateReferenceSystem( mSelectedCRS ) );
480 mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
481 mChangeCRSButton->setEnabled( true );
482 }
483 QgsDebugMsgLevel( "mSelectedCRS = " + mSelectedCRS, 2 );
484}
485
487{
488 mCRSLabel->setText( tr( "Coordinate Reference System" ) + ':' );
489 mSelectedCRS.clear();
490 mSelectedCRSLabel->clear();
491 mChangeCRSButton->setEnabled( false );
492}
493
494void QgsOWSSourceSelect::mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
495{
496 Q_UNUSED( item )
497
498 QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
499 const bool wasSelected = mCurrentTileset == rowItem;
500
501 mTilesetsTableWidget->blockSignals( true );
502 mTilesetsTableWidget->clearSelection();
503 if ( !wasSelected )
504 {
505 QgsDebugMsgLevel( QStringLiteral( "selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ), 2 );
506 mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
507 mCurrentTileset = rowItem;
508 }
509 else
510 {
511 mCurrentTileset = nullptr;
512 }
513 mTilesetsTableWidget->blockSignals( false );
514
515 updateButtons();
516}
517
518
519
521{
522 return mConnName;
523}
524
529
531{
532 return selectedLayersFormats().value( mFormatComboBox->currentIndex() );
533}
534
535QNetworkRequest::CacheLoadControl QgsOWSSourceSelect::selectedCacheLoadControl()
536{
537 const int cache = mCacheComboBox->currentData().toInt();
538 return static_cast<QNetworkRequest::CacheLoadControl>( cache );
539}
540
542{
543 return mSelectedCRS;
544}
545
547{
548 return mTimeComboBox->currentText();
549}
550
552{
553 const QString toSelect = QgsOwsConnection::selectedConnection( mService );
554
555 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
556
557 if ( mConnectionsComboBox->currentIndex() < 0 )
558 {
559 if ( toSelect.isNull() )
560 mConnectionsComboBox->setCurrentIndex( 0 );
561 else
562 mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
563 }
564
565 if ( mConnectionsComboBox->count() == 0 )
566 {
567 // No connections - disable various buttons
568 mConnectButton->setEnabled( false );
569 mEditButton->setEnabled( false );
570 mDeleteButton->setEnabled( false );
571 mSaveButton->setEnabled( false );
572 }
573 else
574 {
575 // Connections - enable various buttons
576 mConnectButton->setEnabled( true );
577 mEditButton->setEnabled( true );
578 mDeleteButton->setEnabled( true );
579 mSaveButton->setEnabled( true );
580 }
581
582 QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
583}
584
585void QgsOWSSourceSelect::showStatusMessage( QString const &message )
586{
587 mStatusLabel->setText( message );
588
589 // update the display of this widget
590 update();
591}
592
593
594void QgsOWSSourceSelect::showError( QString const &title, QString const &format, QString const &error )
595{
596 QgsMessageViewer *mv = new QgsMessageViewer( this );
597 mv->setWindowTitle( title );
598
599 if ( format == QLatin1String( "text/html" ) )
600 {
601 mv->setMessageAsHtml( error );
602 }
603 else
604 {
605 mv->setMessageAsPlainText( tr( "Could not understand the response:\n%1" ).arg( error ) );
606 }
607 mv->showMessage( true ); // Is deleted when closed
608}
609
610void QgsOWSSourceSelect::mConnectionsComboBox_activated( int )
611{
612 // Remember which server was selected.
613 QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
614}
615
616void QgsOWSSourceSelect::mAddDefaultButton_clicked()
617{
619}
620
621QString QgsOWSSourceSelect::descriptionForAuthId( const QString &authId )
622{
623 if ( mCrsNames.contains( authId ) )
624 return mCrsNames[ authId ];
625
627 mCrsNames.insert( authId, qgisSrs.userFriendlyIdentifier() );
628 return qgisSrs.userFriendlyIdentifier();
629}
630
632{
633 QMap<QString, QString> exampleServers;
634 exampleServers[QStringLiteral( "DM Solutions GMap" )] = QStringLiteral( "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
635 exampleServers[QStringLiteral( "Lizardtech server" )] = QStringLiteral( "http://wms.lizardtech.com/lizardtech/iserv/ows" );
636 // Nice to have the qgis users map, but I'm not sure of the URL at the moment.
637 // exampleServers["Qgis users map"] = "http://qgis.org/wms.cgi";
638
639 QgsSettings settings;
640 settings.beginGroup( "/qgis/connections-" + mService.toLower() );
641 QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
642 for ( ; i != exampleServers.constEnd(); ++i )
643 {
644 // Only do a server if it's name doesn't already exist.
645 const QStringList keys = settings.childGroups();
646 if ( !keys.contains( i.key() ) )
647 {
648 const QString path = i.key();
649 settings.setValue( path + "/url", i.value() );
650 }
651 }
652 settings.endGroup();
654
655 QMessageBox::information( this, tr( "Add WMS Servers" ), "<p>" + tr( "Several WMS servers have "
656 "been added to the server list. Note that if "
657 "you access the Internet via a web proxy, you will "
658 "need to set the proxy settings in the QGIS options dialog." ) + "</p>" );
659}
660
661void QgsOWSSourceSelect::mLayerUpButton_clicked()
662{
663 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
664 if ( selectionList.empty() )
665 {
666 return;
667 }
668 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
669 if ( selectedIndex < 1 )
670 {
671 return; //item not existing or already on top
672 }
673
674 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
675 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
676 mLayerOrderTreeWidget->clearSelection();
677 selectedItem->setSelected( true );
678}
679
680void QgsOWSSourceSelect::mLayerDownButton_clicked()
681{
682 QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
683 if ( selectionList.empty() )
684 {
685 return;
686 }
687 const int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
688 if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
689 {
690 return; //item not existing or already at bottom
691 }
692
693 QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
694 mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
695 mLayerOrderTreeWidget->clearSelection();
696 selectedItem->setSelected( true );
697}
698
699QList<QgsOWSSourceSelect::SupportedFormat> QgsOWSSourceSelect::providerFormats()
700{
701 return QList<SupportedFormat>();
702}
703
705{
706 return QStringList();
707}
708
710{
711 return QStringList();
712}
713
715{
716 return QStringList();
717}
718
719void QgsOWSSourceSelect::updateButtons()
720{
721}
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:209
Map canvas is a class for displaying all GIS data types on a canvas.
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.
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.
QgsOWSSourceSelect(const QString &service, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::Standalone)
Constructor.
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.
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.
@ Manager
Used by data items for QgsDataItem::paramWidget().
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.
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:6447
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:39
QgsNewHttpConnection::ConnectionType connectionTypeFromServiceString(const QString &string)
const QgsCoordinateReferenceSystem & crs