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