QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgstiledscenesourceselect.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstiledscenesourceselect.cpp
3 ---------------------------------
4 begin : June 2023
5 copyright : (C) 2023 by Nyall Dawson
6 email : nyall dot dawson at gmail 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
20#include "qgsgui.h"
21#include "qgsprovidermetadata.h"
22#include "qgsproviderutils.h"
25#include "qgshelp.h"
26
27#include <QMenu>
28#include <QMessageBox>
29
31
32QgsTiledSceneSourceSelect::QgsTiledSceneSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
33 : QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
34{
35 setupUi( this );
36
38
39 setWindowTitle( tr( "Add Scene Layer" ) );
40
41 mRadioSourceService->setChecked( true );
42 mStackedWidget->setCurrentIndex( 1 );
43
44 connect( mRadioSourceFile, &QRadioButton::toggled, this, [this]
45 {
46 mStackedWidget->setCurrentIndex( 0 );
47
48 emit enableButtons( !mFileWidget->filePath().isEmpty() );
49 } );
50 connect( mRadioSourceService, &QRadioButton::toggled, this, [this]
51 {
52 mStackedWidget->setCurrentIndex( 1 );
53
54 emit enableButtons( !cmbConnections->currentText().isEmpty() );
55 } );
56
57 btnNew->setPopupMode( QToolButton::InstantPopup );
58 QMenu *newMenu = new QMenu( btnNew );
59
60 QAction *actionNew = new QAction( tr( "New Cesium 3D Tiles Connection…" ), this );
61 connect( actionNew, &QAction::triggered, this, &QgsTiledSceneSourceSelect::btnNewCesium3DTiles_clicked );
62 newMenu->addAction( actionNew );
63
64 btnNew->setMenu( newMenu );
65
66 connect( btnEdit, &QToolButton::clicked, this, &QgsTiledSceneSourceSelect::btnEdit_clicked );
67 connect( btnDelete, &QToolButton::clicked, this, &QgsTiledSceneSourceSelect::btnDelete_clicked );
68 connect( btnSave, &QToolButton::clicked, this, &QgsTiledSceneSourceSelect::btnSave_clicked );
69 connect( btnLoad, &QToolButton::clicked, this, &QgsTiledSceneSourceSelect::btnLoad_clicked );
70 connect( cmbConnections, &QComboBox::currentTextChanged, this, &QgsTiledSceneSourceSelect::cmbConnections_currentTextChanged );
71 setupButtons( buttonBox );
72 connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsTiledSceneSourceSelect::showHelp );
73
74 populateConnectionList();
75
76 mFileWidget->setDialogTitle( tr( "Open Scene Dataset" ) );
77 mFileWidget->setFilter( QgsProviderRegistry::instance()->fileTiledSceneFilters() );
78 mFileWidget->setStorageMode( QgsFileWidget::GetFile );
79 mFileWidget->setOptions( QFileDialog::HideNameFilterDetails );
80 connect( mFileWidget, &QgsFileWidget::fileChanged, this, [ = ]( const QString & path )
81 {
82 emit enableButtons( !path.isEmpty() );
83 } );
84}
85
86void QgsTiledSceneSourceSelect::btnNewCesium3DTiles_clicked()
87{
88 QgsTiledSceneConnectionDialog nc( this );
89 if ( nc.exec() )
90 {
92 connectionData.provider = QStringLiteral( "cesiumtiles" );
93
94 QgsTiledSceneProviderConnection::addConnection( nc.connectionName(), connectionData );
95 populateConnectionList();
96 emit connectionsChanged();
97 }
98}
99
100void QgsTiledSceneSourceSelect::btnEdit_clicked()
101{
102 const QgsTiledSceneProviderConnection::Data connection = QgsTiledSceneProviderConnection::connection( cmbConnections->currentText() );
103 const QString uri = QgsTiledSceneProviderConnection::encodedUri( connection );
104 const QString provider = connection.provider;
105
106 QgsTiledSceneConnectionDialog nc( this );
107 nc.setConnection( cmbConnections->currentText(), uri );
108 if ( nc.exec() )
109 {
111 connectionData.provider = provider;
112
113 QgsTiledSceneProviderConnection::addConnection( nc.connectionName(), connectionData );
114 populateConnectionList();
115 emit connectionsChanged();
116 }
117
118}
119
120void QgsTiledSceneSourceSelect::btnDelete_clicked()
121{
122 const QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
123 .arg( cmbConnections->currentText() );
124 if ( QMessageBox::Yes != QMessageBox::question( this, tr( "Confirm Delete" ), msg, QMessageBox::Yes | QMessageBox::No ) )
125 return;
126
127 QgsTiledSceneProviderConnection( QString() ).remove( cmbConnections->currentText() );
128
129 populateConnectionList();
130 emit connectionsChanged();
131}
132
133void QgsTiledSceneSourceSelect::btnSave_clicked()
134{
136 dlg.exec();
137}
138
139void QgsTiledSceneSourceSelect::btnLoad_clicked()
140{
141 const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load Connections" ), QDir::homePath(),
142 tr( "XML files (*.xml *.XML)" ) );
143 if ( fileName.isEmpty() )
144 {
145 return;
146 }
147
149 dlg.exec();
150 populateConnectionList();
151}
152
153void QgsTiledSceneSourceSelect::addButtonClicked()
154{
155 if ( mRadioSourceService->isChecked() )
156 {
157 const QgsTiledSceneProviderConnection::Data connection = QgsTiledSceneProviderConnection::connection( cmbConnections->currentText() );
158 const QString uri = QgsTiledSceneProviderConnection::encodedUri( connection );
159 emit addLayer( Qgis::LayerType::TiledScene, uri, cmbConnections->currentText(), connection.provider );
160 }
161 else if ( mRadioSourceFile->isChecked() )
162 {
163 const QString filePath = mFileWidget->filePath();
164 const QList< QgsProviderRegistry::ProviderCandidateDetails > providers = QgsProviderRegistry::instance()->preferredProvidersForUri( filePath );
165 QString providerKey;
166 for ( const QgsProviderRegistry::ProviderCandidateDetails &details : providers )
167 {
168 if ( details.layerTypes().contains( Qgis::LayerType::TiledScene ) )
169 {
170 providerKey = details.metadata()->key();
171 }
172 }
173
174 QVariantMap parts;
175 parts.insert( QStringLiteral( "path" ), filePath );
176 const QString uri = QgsProviderRegistry::instance()->encodeUri( providerKey, parts );
177
178 emit addLayer( Qgis::LayerType::TiledScene, uri, QgsProviderUtils::suggestLayerNameFromFilePath( filePath ), providerKey );
179 }
180}
181
182void QgsTiledSceneSourceSelect::populateConnectionList()
183{
184 cmbConnections->blockSignals( true );
185 cmbConnections->clear();
186 cmbConnections->addItems( QgsTiledSceneProviderConnection::connectionList() );
187 cmbConnections->blockSignals( false );
188
189 btnEdit->setDisabled( cmbConnections->count() == 0 );
190 btnDelete->setDisabled( cmbConnections->count() == 0 );
191 btnSave->setDisabled( cmbConnections->count() == 0 );
192 cmbConnections->setDisabled( cmbConnections->count() == 0 );
193
194 setConnectionListPosition();
195}
196
197void QgsTiledSceneSourceSelect::setConnectionListPosition()
198{
200
201 cmbConnections->setCurrentIndex( cmbConnections->findText( toSelect ) );
202
203 if ( cmbConnections->currentIndex() < 0 )
204 {
205 if ( toSelect.isNull() )
206 cmbConnections->setCurrentIndex( 0 );
207 else
208 cmbConnections->setCurrentIndex( cmbConnections->count() - 1 );
209 }
210
211 emit enableButtons( !cmbConnections->currentText().isEmpty() );
212}
213
214void QgsTiledSceneSourceSelect::cmbConnections_currentTextChanged( const QString &text )
215{
217 emit enableButtons( !text.isEmpty() );
218}
219
220void QgsTiledSceneSourceSelect::showHelp()
221{
222 QgsHelp::openHelp( QStringLiteral( "managing_data_source/opening_data.html" ) );
223}
224
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
Abstract base Data Source Widget to create connections and add layers This class provides common func...
@ GetFile
Select a single file.
Definition: qgsfilewidget.h:68
void fileChanged(const QString &path)
Emitted whenever the current file or directory path is changed.
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
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition: qgshelp.cpp:39
@ TiledScene
Tiled scene connection (since QGIS 3.34)
Contains information pertaining to a candidate provider.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
WidgetMode
Different ways a source select dialog can be used.
QList< QgsProviderRegistry::ProviderCandidateDetails > preferredProvidersForUri(const QString &uri) const
Returns the details for the preferred provider(s) for opening the specified uri.
QString encodeUri(const QString &providerKey, const QVariantMap &parts)
Reassembles a provider data source URI from its component paths (e.g.
static QString suggestLayerNameFromFilePath(const QString &path)
Suggests a suitable layer name given only a file path.
Represents connections to tiled scene data sources.
virtual void remove(const QString &name) const override
Deletes the connection from the settings.
static QString selectedConnection()
Returns the name of the last used connection.
static Data decodedUri(const QString &uri)
Returns a connection uri decoded to a data structure.
static Data connection(const QString &name)
Returns connection details for the stored connection with the specified name.
static void addConnection(const QString &name, const Data &connection)
Stores a new connection, under the specified connection name.
static void setSelectedConnection(const QString &name)
Stores the name of the last used connection.
static QStringList connectionList()
Returns a list of the stored connection names.
static QString encodedUri(const Data &data)
Returns connection data encoded as a string.
Represents decoded data of a tiled scene connection.