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