QGIS API Documentation 3.43.0-Master (0cdc48caa8d)
qgsvectortiledataitemguiprovider.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectortiledataitemguiprovider.cpp
3 --------------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 by Martin Dobias
6 Email : wonder dot sk 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#include "moc_qgsvectortiledataitemguiprovider.cpp"
18
19#include "qgsapplication.h"
26
27#include <QFileDialog>
28#include <QMessageBox>
29
31
32void QgsVectorTileDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &selection, QgsDataItemGuiContext context )
33{
34 if ( QgsVectorTileLayerItem *layerItem = qobject_cast<QgsVectorTileLayerItem *>( item ) )
35 {
36 const QList<QgsVectorTileLayerItem *> vtConnectionItems = QgsDataItem::filteredItems<QgsVectorTileLayerItem>( selection );
37
38 if ( vtConnectionItems.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( vtConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
50 connect( actionDelete, &QAction::triggered, this, [vtConnectionItems, context] {
51 QgsDataItemGuiProviderUtils::deleteConnections( vtConnectionItems, []( const QString &connectionName ) { QgsVectorTileProviderConnection::deleteConnection( connectionName ); }, context );
52 } );
53 menu->addAction( actionDelete );
54 }
55
56 if ( QgsVectorTileRootItem *rootItem = qobject_cast<QgsVectorTileRootItem *>( item ) )
57 {
58 QAction *actionNew = new QAction( tr( "New Generic Connection…" ), menu );
59 connect( actionNew, &QAction::triggered, this, [rootItem] { newConnection( rootItem ); } );
60 menu->addAction( actionNew );
61
62 QAction *actionNewArcGISConnection = new QAction( tr( "New ArcGIS Vector Tile Service Connection…" ), menu );
63 connect( actionNewArcGISConnection, &QAction::triggered, this, [rootItem] { newArcGISConnection( rootItem ); } );
64 menu->addAction( actionNewArcGISConnection );
65
66 menu->addSeparator();
67
68 QAction *actionSaveXyzTilesServers = new QAction( tr( "Save Connections…" ), menu );
69 connect( actionSaveXyzTilesServers, &QAction::triggered, this, [] { saveXyzTilesServers(); } );
70 menu->addAction( actionSaveXyzTilesServers );
71
72 QAction *actionLoadXyzTilesServers = new QAction( tr( "Load Connections…" ), menu );
73 connect( actionLoadXyzTilesServers, &QAction::triggered, this, [rootItem] { loadXyzTilesServers( rootItem ); } );
74 menu->addAction( actionLoadXyzTilesServers );
75 }
76}
77
78void QgsVectorTileDataItemGuiProvider::editConnection( QgsDataItem *item )
79{
80 const QgsVectorTileProviderConnection::Data connection = QgsVectorTileProviderConnection::connection( item->name() );
81 const QString uri = QgsVectorTileProviderConnection::encodedUri( connection );
82
83 switch ( connection.serviceType )
84 {
85 case QgsVectorTileProviderConnection::Generic:
86 {
87 QgsVectorTileConnectionDialog dlg;
88
89 dlg.setConnection( item->name(), uri );
90 if ( !dlg.exec() )
91 return;
92
93 QgsVectorTileProviderConnection::deleteConnection( item->name() );
94 const QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
95 QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );
96 break;
97 }
98
99 case QgsVectorTileProviderConnection::ArcgisVectorTileService:
100 {
101 QgsArcgisVectorTileConnectionDialog dlg;
102
103 dlg.setConnection( item->name(), uri );
104 if ( !dlg.exec() )
105 return;
106
107 QgsVectorTileProviderConnection::deleteConnection( item->name() );
108 const QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
109 QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );
110 break;
111 }
112 }
113
114 item->parent()->refreshConnections();
115}
116
117void QgsVectorTileDataItemGuiProvider::duplicateConnection( QgsDataItem *item )
118{
119 const QString connectionName = item->name();
120 const QgsVectorTileProviderConnection::Data connection = QgsVectorTileProviderConnection::connection( connectionName );
121 const QStringList connections = QgsVectorTileProviderConnection::sTreeConnectionVectorTile->items();
122
123 const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections );
124
125 QgsVectorTileProviderConnection::addConnection( newConnectionName, connection );
126 item->parent()->refreshConnections();
127}
128
129void QgsVectorTileDataItemGuiProvider::newConnection( QgsDataItem *item )
130{
131 QgsVectorTileConnectionDialog dlg( QgsApplication::instance()->activeWindow() );
132 if ( !dlg.exec() )
133 return;
134
135 const QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
136 QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );
137
138 item->refreshConnections();
139}
140
141void QgsVectorTileDataItemGuiProvider::newArcGISConnection( QgsDataItem *item )
142{
143 QgsArcgisVectorTileConnectionDialog dlg;
144 if ( !dlg.exec() )
145 return;
146
147 const QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
148 QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );
149
150 item->refreshConnections();
151}
152
153void QgsVectorTileDataItemGuiProvider::saveXyzTilesServers()
154{
156 dlg.exec();
157}
158
159void QgsVectorTileDataItemGuiProvider::loadXyzTilesServers( QgsDataItem *item )
160{
161 const QString fileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Connections" ), QDir::homePath(), tr( "XML files (*.xml *.XML)" ) );
162 if ( fileName.isEmpty() )
163 {
164 return;
165 }
166
168 if ( dlg.exec() == QDialog::Accepted )
169 item->refreshConnections();
170}
171
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:46
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.
A dialog for importing or exporting stored connections.