Skip to content

Commit

Permalink
Add QgsAbstractProviderConnection subclass + provider metadata code
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Apr 5, 2020
1 parent 205b8ae commit ba4ceb4
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 48 deletions.
76 changes: 63 additions & 13 deletions src/core/vectortile/qgsvectortileconnection.cpp
Expand Up @@ -21,19 +21,44 @@

///@cond PRIVATE

QString QgsVectorTileConnection::encodedUri() const
QString QgsVectorTileProviderConnection::encodedUri( const QgsVectorTileProviderConnection::Data &conn )
{
QgsDataSourceUri uri;
uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
uri.setParam( QStringLiteral( "url" ), url );
if ( zMin != -1 )
uri.setParam( QStringLiteral( "zmin" ), QString::number( zMin ) );
if ( zMax != -1 )
uri.setParam( QStringLiteral( "zmax" ), QString::number( zMax ) );
uri.setParam( QStringLiteral( "url" ), conn.url );
if ( conn.zMin != -1 )
uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
if ( conn.zMax != -1 )
uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
return uri.encodedUri();
}

QStringList QgsVectorTileConnectionUtils::connectionList()
QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::decodedUri( const QString &uri )
{
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( uri );

QgsVectorTileProviderConnection::Data conn;
conn.url = dsUri.param( QStringLiteral( "url" ) );
conn.zMin = dsUri.hasParam( QStringLiteral( "zmin" ) ) ? dsUri.param( QStringLiteral( "zmin" ) ).toInt() : -1;
conn.zMax = dsUri.hasParam( QStringLiteral( "zmax" ) ) ? dsUri.param( QStringLiteral( "zmax" ) ).toInt() : -1;
return conn;
}

QString QgsVectorTileProviderConnection::encodedLayerUri( const QgsVectorTileProviderConnection::Data &conn )
{
// compared to encodedUri() this one also adds type=xyz to the URI
QgsDataSourceUri uri;
uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
uri.setParam( QStringLiteral( "url" ), conn.url );
if ( conn.zMin != -1 )
uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
if ( conn.zMax != -1 )
uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
return uri.encodedUri();
}

QStringList QgsVectorTileProviderConnection::connectionList()
{
QgsSettings settings;
settings.beginGroup( QStringLiteral( "qgis/connections-vector-tile" ) );
Expand All @@ -42,33 +67,58 @@ QStringList QgsVectorTileConnectionUtils::connectionList()
return connList;
}

QgsVectorTileConnection QgsVectorTileConnectionUtils::connection( const QString &name )
QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::connection( const QString &name )
{
QgsSettings settings;
settings.beginGroup( "qgis/connections-vector-tile/" + name );

QgsVectorTileConnection conn;
conn.name = name;
if ( settings.value( "url" ).toString().isEmpty() )
return QgsVectorTileProviderConnection::Data();

QgsVectorTileProviderConnection::Data conn;
conn.url = settings.value( QStringLiteral( "url" ) ).toString();
conn.zMin = settings.value( QStringLiteral( "zmin" ), -1 ).toInt();
conn.zMax = settings.value( QStringLiteral( "zmax" ), -1 ).toInt();
return conn;
}

void QgsVectorTileConnectionUtils::deleteConnection( const QString &name )
void QgsVectorTileProviderConnection::deleteConnection( const QString &name )
{
QgsSettings settings;
settings.remove( "qgis/connections-vector-tile/" + name );
}

void QgsVectorTileConnectionUtils::addConnection( const QgsVectorTileConnection &conn )
void QgsVectorTileProviderConnection::addConnection( const QString &name, QgsVectorTileProviderConnection::Data conn )
{
QgsSettings settings;

settings.beginGroup( "qgis/connections-vector-tile/" + conn.name );
settings.beginGroup( "qgis/connections-vector-tile/" + name );
settings.setValue( QStringLiteral( "url" ), conn.url );
settings.setValue( QStringLiteral( "zmin" ), conn.zMin );
settings.setValue( QStringLiteral( "zmax" ), conn.zMax );
}

//

QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &name )
: QgsAbstractProviderConnection( name )
{
setUri( encodedUri( connection( name ) ) );
}

QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &uri, const QVariantMap &configuration )
: QgsAbstractProviderConnection( uri, configuration )
{
}

void QgsVectorTileProviderConnection::store( const QString &name ) const
{
addConnection( name, decodedUri( uri() ) );
}

void QgsVectorTileProviderConnection::remove( const QString &name ) const
{
deleteConnection( name );
}

///@endcond
43 changes: 27 additions & 16 deletions src/core/vectortile/qgsvectortileconnection.h
Expand Up @@ -23,31 +23,42 @@

#include <QStringList>

struct QgsVectorTileConnection
{
QString name;
QString url;
int zMin = -1;
int zMax = -1;

QString encodedUri() const;
};
#include "qgsabstractproviderconnection.h"

//! Utility class for handling list of connections to vector tile layers
class CORE_EXPORT QgsVectorTileConnectionUtils
class CORE_EXPORT QgsVectorTileProviderConnection : public QgsAbstractProviderConnection
{

public:
QgsVectorTileProviderConnection( const QString &name );
QgsVectorTileProviderConnection( const QString &uri, const QVariantMap &configuration );

virtual void store( const QString &name ) const override;
virtual void remove( const QString &name ) const override;

//! Represents decoded data of a connection
struct Data
{
QString url;
int zMin = -1;
int zMax = -1;
};

//! Returns connection data encoded as a string
static QString encodedUri( const Data &conn );
//! Decodes connection string to a data structure
static Data decodedUri( const QString &uri );

//! Returns connection data encoded as a string containg URI for QgsVectorTileLayer
static QString encodedLayerUri( const Data &conn );

//! Returns list of existing connections, unless the hidden ones
static QStringList connectionList();

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

static Data connection( const QString &name );
//! Removes a connection from the list
static void deleteConnection( const QString &name );

//! Adds a new connection to the list
static void addConnection( const QgsVectorTileConnection &conn );
static void addConnection( const QString &name, Data conn );
};

///@endcond
Expand Down
6 changes: 3 additions & 3 deletions src/core/vectortile/qgsvectortiledataitems.cpp
Expand Up @@ -30,11 +30,11 @@ QgsVectorTileRootItem::QgsVectorTileRootItem( QgsDataItem *parent, QString name,
QVector<QgsDataItem *> QgsVectorTileRootItem::createChildren()
{
QVector<QgsDataItem *> connections;
const auto connectionList = QgsVectorTileConnectionUtils::connectionList();
const auto connectionList = QgsVectorTileProviderConnection::connectionList();
for ( const QString &connName : connectionList )
{
QgsVectorTileConnection connection( QgsVectorTileConnectionUtils::connection( connName ) );
QgsDataItem *conn = new QgsVectorTileLayerItem( this, connName, mPath + '/' + connName, connection.encodedUri() );
QString uri = QgsVectorTileProviderConnection::encodedLayerUri( QgsVectorTileProviderConnection::connection( connName ) );
QgsDataItem *conn = new QgsVectorTileLayerItem( this, connName, mPath + '/' + connName, uri );
connections.append( conn );
}
return connections;
Expand Down
21 changes: 21 additions & 0 deletions src/core/vectortile/qgsvectortileprovidermetadata.cpp
Expand Up @@ -15,6 +15,7 @@

#include "qgsvectortileprovidermetadata.h"

#include "qgsvectortileconnection.h"
#include "qgsvectortiledataitems.h"

///@cond PRIVATE
Expand All @@ -34,4 +35,24 @@ QList<QgsDataItemProvider *> QgsVectorTileProviderMetadata::dataItemProviders()
return providers;
}

QMap<QString, QgsAbstractProviderConnection *> QgsVectorTileProviderMetadata::connections( bool cached )
{
return connectionsProtected<QgsVectorTileProviderConnection, QgsVectorTileProviderConnection>( cached );
}

QgsAbstractProviderConnection *QgsVectorTileProviderMetadata::createConnection( const QString &name )
{
return new QgsVectorTileProviderConnection( name );
}

void QgsVectorTileProviderMetadata::deleteConnection( const QString &name )
{
deleteConnectionProtected<QgsVectorTileProviderConnection>( name );
}

void QgsVectorTileProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
{
saveConnectionProtected( connection, name );
}

///@endcond
7 changes: 7 additions & 0 deletions src/core/vectortile/qgsvectortileprovidermetadata.h
Expand Up @@ -33,6 +33,13 @@ class QgsVectorTileProviderMetadata : public QgsProviderMetadata
QgsVectorTileProviderMetadata();
QList< QgsDataItemProvider * > dataItemProviders() const override;

// handling of stored connections

QMap<QString, QgsAbstractProviderConnection *> connections( bool cached ) override;
QgsAbstractProviderConnection *createConnection( const QString &name ) override;
void deleteConnection( const QString &name ) override;
void saveConnection( const QgsAbstractProviderConnection *connection, const QString &name ) override;

};

///@endcond
Expand Down
18 changes: 12 additions & 6 deletions src/gui/vectortile/qgsvectortileconnectiondialog.cpp
Expand Up @@ -31,26 +31,32 @@ QgsVectorTileConnectionDialog::QgsVectorTileConnectionDialog( QWidget *parent )
connect( mCheckBoxZMax, &QCheckBox::toggled, mSpinZMax, &QSpinBox::setEnabled );
}

void QgsVectorTileConnectionDialog::setConnection( const QgsVectorTileConnection &conn )
void QgsVectorTileConnectionDialog::setConnection( const QString &name, const QString &uri )
{
mEditName->setText( conn.name );
mEditName->setText( name );

QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( uri );
mEditUrl->setText( conn.url );
mCheckBoxZMin->setChecked( conn.zMin != -1 );
mSpinZMin->setValue( conn.zMin != -1 ? conn.zMin : 0 );
mCheckBoxZMax->setChecked( conn.zMax != -1 );
mSpinZMax->setValue( conn.zMax != -1 ? conn.zMax : 14 );
}

QgsVectorTileConnection QgsVectorTileConnectionDialog::connection() const
QString QgsVectorTileConnectionDialog::connectionUri() const
{
QgsVectorTileConnection conn;
conn.name = mEditName->text();
QgsVectorTileProviderConnection::Data conn;
conn.url = mEditUrl->text();
if ( mCheckBoxZMin->isChecked() )
conn.zMin = mSpinZMin->value();
if ( mCheckBoxZMax->isChecked() )
conn.zMax = mSpinZMax->value();
return conn;
return QgsVectorTileProviderConnection::encodedUri( conn );
}

QString QgsVectorTileConnectionDialog::connectionName() const
{
return mEditName->text();
}

void QgsVectorTileConnectionDialog::accept()
Expand Down
8 changes: 3 additions & 5 deletions src/gui/vectortile/qgsvectortileconnectiondialog.h
Expand Up @@ -24,18 +24,16 @@
#include "ui_qgsvectortileconnectiondialog.h"


struct QgsVectorTileConnection;


class QgsVectorTileConnectionDialog : public QDialog, public Ui::QgsVectorTileConnectionDialog
{
Q_OBJECT
public:
explicit QgsVectorTileConnectionDialog( QWidget *parent = nullptr );

void setConnection( const QgsVectorTileConnection &conn );
void setConnection( const QString &name, const QString &uri );

QgsVectorTileConnection connection() const;
QString connectionUri() const;
QString connectionName() const;

void accept() override;

Expand Down
14 changes: 9 additions & 5 deletions src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp
Expand Up @@ -57,12 +57,14 @@ void QgsVectorTileDataItemGuiProvider::populateContextMenu( QgsDataItem *item, Q
void QgsVectorTileDataItemGuiProvider::editConnection( QgsDataItem *item )
{
QgsVectorTileConnectionDialog dlg;
dlg.setConnection( QgsVectorTileConnectionUtils::connection( item->name() ) );
QString uri = QgsVectorTileProviderConnection::encodedUri( QgsVectorTileProviderConnection::connection( item->name() ) );
dlg.setConnection( item->name(), uri );
if ( !dlg.exec() )
return;

QgsVectorTileConnectionUtils::deleteConnection( item->name() );
QgsVectorTileConnectionUtils::addConnection( dlg.connection() );
QgsVectorTileProviderConnection::deleteConnection( item->name() );
QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );

item->parent()->refreshConnections();
}
Expand All @@ -73,7 +75,7 @@ void QgsVectorTileDataItemGuiProvider::deleteConnection( QgsDataItem *item )
QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
return;

QgsVectorTileConnectionUtils::deleteConnection( item->name() );
QgsVectorTileProviderConnection::deleteConnection( item->name() );

item->parent()->refreshConnections();
}
Expand All @@ -84,7 +86,9 @@ void QgsVectorTileDataItemGuiProvider::newConnection( QgsDataItem *item )
if ( !dlg.exec() )
return;

QgsVectorTileConnectionUtils::addConnection( dlg.connection() );
QgsVectorTileProviderConnection::Data conn = QgsVectorTileProviderConnection::decodedUri( dlg.connectionUri() );
QgsVectorTileProviderConnection::addConnection( dlg.connectionName(), conn );

item->refreshConnections();
}

Expand Down

0 comments on commit ba4ceb4

Please sign in to comment.