Skip to content

Commit

Permalink
[feature] add XYZ tab to the datasource manager dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Apr 14, 2020
1 parent 5f91b06 commit f02ee87
Show file tree
Hide file tree
Showing 7 changed files with 364 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/providers/wms/CMakeLists.txt
Expand Up @@ -14,6 +14,7 @@ IF (WITH_GUI)
qgstilescalewidget.cpp
qgswmtsdimensions.cpp
qgsxyzconnectiondialog.cpp
qgsxyzsourceselect.cpp
)
ENDIF ()

Expand Down
17 changes: 16 additions & 1 deletion src/providers/wms/qgswmsprovidergui.cpp
Expand Up @@ -16,6 +16,7 @@
#include "qgswmsprovidergui.h"
#include "qgswmsprovider.h"
#include "qgswmssourceselect.h"
#include "qgsxyzsourceselect.h"
#include "qgssourceselectprovider.h"
#include "qgstilescalewidget.h"
#include "qgsproviderguimetadata.h"
Expand All @@ -37,6 +38,20 @@ class QgsWmsSourceSelectProvider : public QgsSourceSelectProvider
}
};

class QgsXyzSourceSelectProvider : public QgsSourceSelectProvider
{
public:

QString providerKey() const override { return QStringLiteral( "xyz" ); }
QString text() const override { return QStringLiteral( "XYZ" ); } // untranslatable string as acronym for this particular case. Use QObject::tr() otherwise
int ordering() const override { return QgsSourceSelectProvider::OrderRemoteProvider + 11; }
QIcon icon() const override { return QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddWmsLayer.svg" ) ); }
QgsAbstractDataSourceWidget *createDataSourceWidget( QWidget *parent = nullptr, Qt::WindowFlags fl = Qt::Widget, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::Embedded ) const override
{
return new QgsXyzSourceSelect( parent, fl, widgetMode );
}
};

QgsWmsProviderGuiMetadata::QgsWmsProviderGuiMetadata()
: QgsProviderGuiMetadata( QgsWmsProvider::WMS_KEY )
{
Expand All @@ -45,7 +60,7 @@ QgsWmsProviderGuiMetadata::QgsWmsProviderGuiMetadata()
QList<QgsSourceSelectProvider *> QgsWmsProviderGuiMetadata::sourceSelectProviders()
{
QList<QgsSourceSelectProvider *> providers;
providers << new QgsWmsSourceSelectProvider;
providers << new QgsWmsSourceSelectProvider << new QgsXyzSourceSelectProvider;
return providers;
}

Expand Down
13 changes: 12 additions & 1 deletion src/providers/wms/qgsxyzconnection.cpp
Expand Up @@ -66,6 +66,18 @@ QStringList QgsXyzConnectionUtils::connectionList()
return connList;
}

QString QgsXyzConnectionUtils::selectedConnection()
{
QgsSettings settings;
return settings.value( QStringLiteral( "qgis/connections-xyz/selected" ) ).toString();
}

void QgsXyzConnectionUtils::setSelectedConnection( const QString &name )
{
QgsSettings settings;
return settings.setValue( QStringLiteral( "qgis/connections-xyz/selected" ), name );
}

QgsXyzConnection QgsXyzConnectionUtils::connection( const QString &name )
{
QgsSettings settings;
Expand Down Expand Up @@ -128,5 +140,4 @@ void QgsXyzConnectionUtils::addConnection( const QgsXyzConnection &conn )
{
settings.setValue( QStringLiteral( "hidden" ), false );
}

}
6 changes: 6 additions & 0 deletions src/providers/wms/qgsxyzconnection.h
Expand Up @@ -46,6 +46,12 @@ class QgsXyzConnectionUtils
//! Returns list of existing connections, unless the hidden ones
static QStringList connectionList();

//! Returns last used connection
static QString selectedConnection();

//! Saves name of the last used connection
static void setSelectedConnection( const QString &connName );

//! Returns connection details
static QgsXyzConnection connection( const QString &name );

Expand Down
133 changes: 133 additions & 0 deletions src/providers/wms/qgsxyzsourceselect.cpp
@@ -0,0 +1,133 @@
/***************************************************************************
qgsxyzsourceselect.cpp
---------------------------------
begin : April 2020
copyright : (C) 2020 by Alexander Bruy
email : alexander dot bruy 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 "qgshelp.h"
#include "qgsgui.h"
#include "qgsxyzsourceselect.h"
#include "qgsxyzconnection.h"
#include "qgsxyzconnectiondialog.h"

#include <QMessageBox>

QgsXyzSourceSelect::QgsXyzSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
: QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
{
setupUi( this );
QgsGui::enableAutoGeometryRestore( this );

connect( btnNew, &QPushButton::clicked, this, &QgsXyzSourceSelect::btnNew_clicked );
connect( btnEdit, &QPushButton::clicked, this, &QgsXyzSourceSelect::btnEdit_clicked );
connect( btnDelete, &QPushButton::clicked, this, &QgsXyzSourceSelect::btnDelete_clicked );
connect( btnSave, &QPushButton::clicked, this, &QgsXyzSourceSelect::btnSave_clicked );
connect( btnLoad, &QPushButton::clicked, this, &QgsXyzSourceSelect::btnLoad_clicked );
connect( cmbConnections, &QComboBox::currentTextChanged, this, &QgsXyzSourceSelect::cmbConnections_currentTextChanged );
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsXyzSourceSelect::showHelp );
setupButtons( buttonBox );
populateConnectionList();
}

void QgsXyzSourceSelect::btnNew_clicked()
{
QgsXyzConnectionDialog *nc = new QgsXyzConnectionDialog( this );
if ( nc->exec() )
{
QgsXyzConnectionUtils::addConnection( nc->connection() );
populateConnectionList();
emit connectionsChanged();
}
delete nc;
}

void QgsXyzSourceSelect::btnEdit_clicked()
{
QgsXyzConnectionDialog *nc = new QgsXyzConnectionDialog( this );
nc->setConnection( QgsXyzConnectionUtils::connection( cmbConnections->currentText() ) );
if ( nc->exec() )
{
QgsXyzConnectionUtils::addConnection( nc->connection() );
populateConnectionList();
emit connectionsChanged();
}
delete nc;
}

void QgsXyzSourceSelect::btnDelete_clicked()
{
QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
.arg( cmbConnections->currentText() );
if ( QMessageBox::Yes != QMessageBox::question( this, tr( "Confirm Delete" ), msg, QMessageBox::Yes | QMessageBox::No ) )
return;

QgsXyzConnectionUtils::deleteConnection( cmbConnections->currentText() );

populateConnectionList();
emit connectionsChanged();
}

void QgsXyzSourceSelect::btnSave_clicked()
{
}

void QgsXyzSourceSelect::btnLoad_clicked()
{
}

void QgsXyzSourceSelect::addButtonClicked()
{
emit addRasterLayer( QgsXyzConnectionUtils::connection( cmbConnections->currentText() ).encodedUri(), cmbConnections->currentText(), QStringLiteral( "wms" ) );
}

void QgsXyzSourceSelect::populateConnectionList()
{
cmbConnections->blockSignals( true );
cmbConnections->clear();
cmbConnections->addItems( QgsXyzConnectionUtils::connectionList() );
cmbConnections->blockSignals( false );

setConnectionListPosition();

btnEdit->setDisabled( cmbConnections->count() == 0 );
btnDelete->setDisabled( cmbConnections->count() == 0 );
cmbConnections->setDisabled( cmbConnections->count() == 0 );
}

void QgsXyzSourceSelect::setConnectionListPosition()
{
QString toSelect = QgsXyzConnectionUtils::selectedConnection();

cmbConnections->setCurrentIndex( cmbConnections->findText( toSelect ) );

if ( cmbConnections->currentIndex() < 0 )
{
if ( toSelect.isNull() )
cmbConnections->setCurrentIndex( 0 );
else
cmbConnections->setCurrentIndex( cmbConnections->count() - 1 );
}
emit enableButtons( !cmbConnections->currentText().isEmpty() );
}

void QgsXyzSourceSelect::cmbConnections_currentTextChanged( const QString &text )
{
QgsXyzConnectionUtils::setSelectedConnection( text );
emit enableButtons( !text.isEmpty() );
}

void QgsXyzSourceSelect::showHelp()
{
QgsHelp::openHelp( QStringLiteral( "managing_data_source/opening_data.html#using-xyz-tile-services" ) );
}
65 changes: 65 additions & 0 deletions src/providers/wms/qgsxyzsourceselect.h
@@ -0,0 +1,65 @@
/***************************************************************************
qgsxyzsourceselect.h
---------------------------------
begin : April 2020
copyright : (C) 2020 by Alexander Bruy
email : alexander dot bruy 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 QGSXYZSOURCESELECT_H
#define QGSXYZSOURCESELECT_H

#include "qgsabstractdatasourcewidget.h"
#include "ui_qgsxyzsourceselectbase.h"

/*!
* \brief Dialog to create connections to XYZ servers.
*
* This dialog allows the user to define and save connection information
* for XYZ servers.
*
* The user can then connect and add layers from the XYZ server to the
* map canvas.
*/
class QgsXyzSourceSelect : public QgsAbstractDataSourceWidget, private Ui::QgsXyzSourceSelectBase
{
Q_OBJECT

public:
//! Constructor
QgsXyzSourceSelect( QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None );

//! Determines the layers the user selected
void addButtonClicked() override;

private slots:

//! Opens the create connection dialog to build a new connection
void btnNew_clicked();
//! Opens a dialog to edit an existing connection
void btnEdit_clicked();
//! Deletes the selected connection
void btnDelete_clicked();
//! Saves connections to the file
void btnSave_clicked();
//! Loads connections from the file
void btnLoad_clicked();
//! Stores the selected datasource whenerver it is changed
void cmbConnections_currentTextChanged( const QString &text );

private:
void populateConnectionList();
void setConnectionListPosition();
void showHelp();
};

#endif // QGSXYZSOURCESELECT_H

0 comments on commit f02ee87

Please sign in to comment.