Skip to content

Commit

Permalink
Tiled mesh data item GUI provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jun 29, 2023
1 parent af77c4b commit e8e4e82
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ set(QGIS_GUI_SRCS
tableeditor/qgstableeditorwidget.cpp

tiledmesh/qgstiledmeshconnectiondialog.cpp
tiledmesh/qgstiledmeshdataitemguiprovider.cpp
tiledmesh/qgstiledmeshproviderguimetadata.cpp
tiledmesh/qgstiledmeshsourceselect.cpp

Expand Down Expand Up @@ -1475,6 +1476,7 @@ set(QGIS_GUI_HDRS
tableeditor/qgstableeditorwidget.h

tiledmesh/qgstiledmeshconnectiondialog.h
tiledmesh/qgstiledmeshdataitemguiprovider.h
tiledmesh/qgstiledmeshproviderguimetadata.h
tiledmesh/qgstiledmeshsourceselect.h

Expand Down
124 changes: 124 additions & 0 deletions src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.cpp
Original file line number Diff line number Diff line change
@@ -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 <QMessageBox>
#include <QFileDialog>

///@cond PRIVATE

void QgsTiledMeshDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &, 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
47 changes: 47 additions & 0 deletions src/gui/tiledmesh/qgstiledmeshdataitemguiprovider.h
Original file line number Diff line number Diff line change
@@ -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<QgsDataItem *> &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
6 changes: 6 additions & 0 deletions src/gui/tiledmesh/qgstiledmeshproviderguimetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "qgssourceselectprovider.h"
#include "qgsapplication.h"
#include "qgstiledmeshsourceselect.h"
#include "qgstiledmeshdataitemguiprovider.h"

///@cond PRIVATE

Expand All @@ -39,6 +40,11 @@ QgsTiledMeshProviderGuiMetadata::QgsTiledMeshProviderGuiMetadata()
{
}

QList<QgsDataItemGuiProvider *> QgsTiledMeshProviderGuiMetadata::dataItemGuiProviders()
{
return { new QgsTiledMeshDataItemGuiProvider() };
}

QList<QgsSourceSelectProvider *> QgsTiledMeshProviderGuiMetadata::sourceSelectProviders()
{
return { new QgsTiledMeshSourceSelectProvider };
Expand Down
1 change: 1 addition & 0 deletions src/gui/tiledmesh/qgstiledmeshproviderguimetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class QgsTiledMeshProviderGuiMetadata: public QgsProviderGuiMetadata
public:
QgsTiledMeshProviderGuiMetadata();

QList<QgsDataItemGuiProvider *> dataItemGuiProviders() override;
QList<QgsSourceSelectProvider *> sourceSelectProviders() override;
};

Expand Down

0 comments on commit e8e4e82

Please sign in to comment.