QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgstiledscenedataitemguiprovider.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstiledscenedataitemguiprovider.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 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsapplication.h"
25
26#include <QFileDialog>
27#include <QMessageBox>
28
29#include "moc_qgstiledscenedataitemguiprovider.cpp"
30
32
33void QgsTiledSceneDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &selection, QgsDataItemGuiContext context )
34{
35 if ( QgsTiledSceneLayerItem *layerItem = qobject_cast<QgsTiledSceneLayerItem *>( item ) )
36 {
37 const QList<QgsTiledSceneLayerItem *> sceneConnectionItems = QgsDataItem::filteredItems<QgsTiledSceneLayerItem>( selection );
38 if ( sceneConnectionItems.size() == 1 )
39 {
40 QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
41 connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } );
42 menu->addAction( actionEdit );
43
44 QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
45 connect( actionDuplicate, &QAction::triggered, this, [layerItem] { duplicateConnection( layerItem ); } );
46 menu->addAction( actionDuplicate );
47 }
48
49 QAction *actionDelete = new QAction( sceneConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
50 connect( actionDelete, &QAction::triggered, this, [sceneConnectionItems, context] {
51 QgsDataItemGuiProviderUtils::deleteConnections( sceneConnectionItems, []( const QString &connectionName ) { QgsTiledSceneProviderConnection( QString() ).remove( connectionName ); }, context );
52 } );
53 menu->addAction( actionDelete );
54 }
55
56 if ( QgsTiledSceneRootItem *rootItem = qobject_cast<QgsTiledSceneRootItem *>( item ) )
57 {
58 QAction *actionNewCesium = new QAction( tr( "New Cesium 3D Tiles Connection…" ), menu );
59 connect( actionNewCesium, &QAction::triggered, this, [rootItem] { newConnection( rootItem, "cesiumtiles" ); } );
60 menu->addAction( actionNewCesium );
61
62 QAction *actionNewQM = new QAction( tr( "New Quantized Mesh Connection…" ), menu );
63 connect( actionNewQM, &QAction::triggered, this, [rootItem] { newConnection( rootItem, "quantizedmesh" ); } );
64 menu->addAction( actionNewQM );
65
66 menu->addSeparator();
67
68 QAction *actionSave = new QAction( tr( "Save Connections…" ), menu );
69 connect( actionSave, &QAction::triggered, this, [] { saveConnections(); } );
70 menu->addAction( actionSave );
71
72 QAction *actionLoadXyzTilesServers = new QAction( tr( "Load Connections…" ), menu );
73 connect( actionLoadXyzTilesServers, &QAction::triggered, this, [rootItem] { loadConnections( rootItem ); } );
74 menu->addAction( actionLoadXyzTilesServers );
75 }
76}
77
78void QgsTiledSceneDataItemGuiProvider::editConnection( QgsDataItem *item )
79{
81 const QString uri = QgsTiledSceneProviderConnection::encodedUri( connection );
82
83 QgsTiledSceneConnectionDialog dlg;
84
85 dlg.setConnection( item->name(), uri );
86 if ( !dlg.exec() )
87 return;
88
89 QgsTiledSceneProviderConnection( QString() ).remove( item->name() );
90
92 newConnection.provider = connection.provider;
93
94 QgsTiledSceneProviderConnection::addConnection( dlg.connectionName(), newConnection );
95
96 item->parent()->refreshConnections();
97}
98
99void QgsTiledSceneDataItemGuiProvider::duplicateConnection( QgsDataItem *item )
100{
101 const QString connectionName = item->name();
103 const QStringList connections = QgsTiledSceneProviderConnection::sTreeConnectionTiledScene->items();
104
105 const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections );
106
107 QgsTiledSceneProviderConnection::addConnection( newConnectionName, connection );
108 item->parent()->refreshConnections();
109}
110
111void QgsTiledSceneDataItemGuiProvider::newConnection( QgsDataItem *item, QString provider )
112{
113 QgsTiledSceneConnectionDialog dlg( QgsApplication::instance()->activeWindow() );
114 if ( !dlg.exec() )
115 return;
116
118 conn.provider = provider;
119
120 QgsTiledSceneProviderConnection::addConnection( dlg.connectionName(), conn );
121
122 item->refreshConnections();
123}
124
125void QgsTiledSceneDataItemGuiProvider::saveConnections()
126{
128 dlg.exec();
129}
130
131void QgsTiledSceneDataItemGuiProvider::loadConnections( QgsDataItem *item )
132{
133 const QString fileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Connections" ), QDir::homePath(), tr( "XML files (*.xml *.XML)" ) );
134 if ( fileName.isEmpty() )
135 {
136 return;
137 }
138
140 if ( dlg.exec() == QDialog::Accepted )
141 item->refreshConnections();
142}
143
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
Encapsulates the context in which a QgsDataItem is shown within the application GUI.
static const QString uniqueName(const QString &name, const QStringList &connectionNames)
Check if connection with name exists in connectionNames list and then try to append a number to it to...
static void deleteConnections(const QList< T * > &items, const std::function< void(const QString &)> &deleteConnection, QgsDataItemGuiContext context)
Handles deletion of a list of connection items.
Base class for all items in the model.
Definition qgsdataitem.h:47
QString name() const
Returns the name of the item (the displayed text for the item).
virtual void refreshConnections(const QString &providerKey=QString())
Causes a data item provider to refresh all registered connections.
QgsDataItem * parent() const
Gets item parent.
static QList< T * > filteredItems(const QList< QgsDataItem * > &items)
Returns a filtered list of data items which match the template type.
A dialog for importing or exporting stored connections.
@ TiledScene
Tiled scene connection.
Represents connections to tiled scene data sources.
void remove(const QString &name) const override
Deletes the connection from the settings.
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 QString encodedUri(const Data &data)
Returns connection data encoded as a string.
Represents decoded data of a tiled scene connection.