From e8e4e8212e5ca0dfb5a3a160af01e4cbcb9fa7ec Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 26 Jun 2023 16:14:21 +1000 Subject: [PATCH] Tiled mesh data item GUI provider --- src/gui/CMakeLists.txt | 2 + .../qgstiledmeshdataitemguiprovider.cpp | 124 ++++++++++++++++++ .../qgstiledmeshdataitemguiprovider.h | 47 +++++++ .../qgstiledmeshproviderguimetadata.cpp | 6 + .../qgstiledmeshproviderguimetadata.h | 1 + 5 files changed, 180 insertions(+) create mode 100644 src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.cpp create mode 100644 src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.h diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 9f0679e1609e..d11c24da7d50 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -461,6 +461,7 @@ set(QGIS_GUI_SRCS tableeditor/qgstableeditorwidget.cpp tiledmesh/qgstiledmeshconnectiondialog.cpp + tiledmesh/qgstiledmeshdataitemguiprovider.cpp tiledmesh/qgstiledmeshproviderguimetadata.cpp tiledmesh/qgstiledmeshsourceselect.cpp @@ -1475,6 +1476,7 @@ set(QGIS_GUI_HDRS tableeditor/qgstableeditorwidget.h tiledmesh/qgstiledmeshconnectiondialog.h + tiledmesh/qgstiledmeshdataitemguiprovider.h tiledmesh/qgstiledmeshproviderguimetadata.h tiledmesh/qgstiledmeshsourceselect.h diff --git a/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.cpp b/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.cpp new file mode 100644 index 000000000000..b81821031295 --- /dev/null +++ b/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.cpp @@ -0,0 +1,124 @@ +/*************************************************************************** + qgstiledmeshdataitemguiprovider.cpp + -------------------------------------- + begin : June 2023 + copyright : (C) 2023 by Nyall Dawson + email : nyall dot dawson at gmail dot com + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "qgstiledmeshdataitemguiprovider.h" +#include "qgstiledmeshdataitems.h" +#include "qgstiledmeshconnection.h" +#include "qgstiledmeshconnectiondialog.h" +#include "qgsmanageconnectionsdialog.h" + +#include +#include + +///@cond PRIVATE + +void QgsTiledMeshDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList &, QgsDataItemGuiContext ) +{ + if ( QgsTiledMeshLayerItem *layerItem = qobject_cast< QgsTiledMeshLayerItem * >( item ) ) + { + QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu ); + connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } ); + menu->addAction( actionEdit ); + + QAction *actionDelete = new QAction( tr( "Remove Connection" ), menu ); + connect( actionDelete, &QAction::triggered, this, [layerItem] { deleteConnection( layerItem ); } ); + menu->addAction( actionDelete ); + } + + if ( QgsTiledMeshRootItem *rootItem = qobject_cast< QgsTiledMeshRootItem * >( item ) ) + { + QAction *actionNewCesium = new QAction( tr( "New Cesium 3D Tiles Connection…" ), menu ); + connect( actionNewCesium, &QAction::triggered, this, [rootItem] { newConnection( rootItem ); } ); + menu->addAction( actionNewCesium ); + + menu->addSeparator(); + + QAction *actionSave = new QAction( tr( "Save Connections…" ), menu ); + connect( actionSave, &QAction::triggered, this, [] { saveConnections(); } ); + menu->addAction( actionSave ); + + QAction *actionLoadXyzTilesServers = new QAction( tr( "Load Connections…" ), menu ); + connect( actionLoadXyzTilesServers, &QAction::triggered, this, [rootItem] { loadConnections( rootItem ); } ); + menu->addAction( actionLoadXyzTilesServers ); + } +} + +void QgsTiledMeshDataItemGuiProvider::editConnection( QgsDataItem *item ) +{ + const QgsTiledMeshProviderConnection::Data connection = QgsTiledMeshProviderConnection::connection( item->name() ); + const QString uri = QgsTiledMeshProviderConnection::encodedUri( connection ); + + QgsTiledMeshConnectionDialog dlg; + + dlg.setConnection( item->name(), uri ); + if ( !dlg.exec() ) + return; + + QgsTiledMeshProviderConnection::deleteConnection( item->name() ); + + QgsTiledMeshProviderConnection::Data newConnection = QgsTiledMeshProviderConnection::decodedUri( dlg.connectionUri() ); + newConnection.provider = connection.provider; + + QgsTiledMeshProviderConnection::addConnection( dlg.connectionName(), newConnection ); + + item->parent()->refreshConnections(); +} + +void QgsTiledMeshDataItemGuiProvider::deleteConnection( QgsDataItem *item ) +{ + if ( QMessageBox::question( nullptr, tr( "Remove Connection" ), tr( "Are you sure you want to remove the connection “%1”?" ).arg( item->name() ), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes ) + return; + + QgsTiledMeshProviderConnection::deleteConnection( item->name() ); + + item->parent()->refreshConnections(); +} + +void QgsTiledMeshDataItemGuiProvider::newConnection( QgsDataItem *item ) +{ + QgsTiledMeshConnectionDialog dlg; + if ( !dlg.exec() ) + return; + + QgsTiledMeshProviderConnection::Data conn = QgsTiledMeshProviderConnection::decodedUri( dlg.connectionUri() ); + conn.provider = QStringLiteral( "cesium" ); + + QgsTiledMeshProviderConnection::addConnection( dlg.connectionName(), conn ); + + item->refreshConnections(); +} + +void QgsTiledMeshDataItemGuiProvider::saveConnections() +{ + QgsManageConnectionsDialog dlg( nullptr, QgsManageConnectionsDialog::Export, QgsManageConnectionsDialog::TiledMesh ); + dlg.exec(); +} + +void QgsTiledMeshDataItemGuiProvider::loadConnections( QgsDataItem *item ) +{ + const QString fileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Connections" ), QDir::homePath(), + tr( "XML files (*.xml *.XML)" ) ); + if ( fileName.isEmpty() ) + { + return; + } + + QgsManageConnectionsDialog dlg( nullptr, QgsManageConnectionsDialog::Import, QgsManageConnectionsDialog::TiledMesh, fileName ); + if ( dlg.exec() == QDialog::Accepted ) + item->refreshConnections(); +} + +///@endcond diff --git a/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.h b/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.h new file mode 100644 index 000000000000..62454f5b6ae8 --- /dev/null +++ b/src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.h @@ -0,0 +1,47 @@ +/*************************************************************************** + qgstiledmeshdataitemguiprovider.h + -------------------------------------- + begin : June 2023 + copyright : (C) 2023 by Nyall Dawson + email : nyall dot dawson at gmail dot com + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef QGSTILEDMESHDATAITEMGUIPROVIDER_H +#define QGSTILEDMESHDATAITEMGUIPROVIDER_H + +///@cond PRIVATE +#define SIP_NO_FILE + +#include "qgsdataitemguiprovider.h" + + +class QgsTiledMeshDataItemGuiProvider : public QObject, public QgsDataItemGuiProvider +{ + Q_OBJECT + public: + + QString name() override { return QStringLiteral( "Tiled Mesh" ); } + + void populateContextMenu( QgsDataItem *item, QMenu *menu, + const QList &selectedItems, QgsDataItemGuiContext context ) override; + + private: + static void editConnection( QgsDataItem *item ); + static void deleteConnection( QgsDataItem *item ); + static void newConnection( QgsDataItem *item ); + static void newArcGISConnection( QgsDataItem *item ); + static void saveConnections(); + static void loadConnections( QgsDataItem *item ); + +}; + +///@endcond + +#endif // QGSTILEDMESHDATAITEMGUIPROVIDER_H diff --git a/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.cpp b/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.cpp index 8d8f0ac5ecc8..6db10acbef95 100644 --- a/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.cpp +++ b/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.cpp @@ -17,6 +17,7 @@ #include "qgssourceselectprovider.h" #include "qgsapplication.h" #include "qgstiledmeshsourceselect.h" +#include "qgstiledmeshdataitemguiprovider.h" ///@cond PRIVATE @@ -39,6 +40,11 @@ QgsTiledMeshProviderGuiMetadata::QgsTiledMeshProviderGuiMetadata() { } +QList QgsTiledMeshProviderGuiMetadata::dataItemGuiProviders() +{ + return { new QgsTiledMeshDataItemGuiProvider() }; +} + QList QgsTiledMeshProviderGuiMetadata::sourceSelectProviders() { return { new QgsTiledMeshSourceSelectProvider }; diff --git a/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.h b/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.h index 571d5b7643ae..05ed584ba5cd 100644 --- a/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.h +++ b/src/gui/tiledmesh/qgstiledmeshproviderguimetadata.h @@ -29,6 +29,7 @@ class QgsTiledMeshProviderGuiMetadata: public QgsProviderGuiMetadata public: QgsTiledMeshProviderGuiMetadata(); + QList dataItemGuiProviders() override; QList sourceSelectProviders() override; };