Skip to content

Commit

Permalink
[feature] Expose option to load vector tile sources from files
Browse files Browse the repository at this point in the history
in Data Source Manager

The Vector Tile tab now includes choices for selecting from a
"Service" (the existing, connection based approach for adding
vector tiles from online sources) or "File" (the new option
which allows directly adding VTPK or MBTiles vector tile files)
  • Loading branch information
nyalldawson committed Apr 2, 2023
1 parent e4a84d6 commit 692d7a7
Show file tree
Hide file tree
Showing 2 changed files with 284 additions and 97 deletions.
57 changes: 53 additions & 4 deletions src/gui/vectortile/qgsvectortilesourceselect.cpp
Expand Up @@ -22,6 +22,8 @@
#include "qgsvectortileconnection.h"
#include "qgsvectortileconnectiondialog.h"
#include "qgsarcgisvectortileconnectiondialog.h"
#include "qgsprovidermetadata.h"
#include "qgsproviderutils.h"

#include <QFileDialog>
#include <QMessageBox>
Expand All @@ -36,10 +38,25 @@ QgsVectorTileSourceSelect::QgsVectorTileSourceSelect( QWidget *parent, Qt::Windo
{
setupUi( this );

QgsGui::enableAutoGeometryRestore( this );

setWindowTitle( tr( "Add Vector Tile Layer" ) );
mConnectionsGroupBox->setTitle( tr( "Vector Tile Connections" ) );

QgsGui::enableAutoGeometryRestore( this );
mRadioSourceService->setChecked( true );
mStackedWidget->setCurrentIndex( 1 );

connect( mRadioSourceFile, &QRadioButton::toggled, this, [this]
{
mStackedWidget->setCurrentIndex( 0 );

emit enableButtons( !mFileWidget->filePath().isEmpty() );
} );
connect( mRadioSourceService, &QRadioButton::toggled, this, [this]
{
mStackedWidget->setCurrentIndex( 1 );

emit enableButtons( !cmbConnections->currentText().isEmpty() );
} );

btnNew->setPopupMode( QToolButton::InstantPopup );
QMenu *newMenu = new QMenu( btnNew );
Expand All @@ -63,6 +80,15 @@ QgsVectorTileSourceSelect::QgsVectorTileSourceSelect( QWidget *parent, Qt::Windo
setupButtons( buttonBox );

populateConnectionList();

mFileWidget->setDialogTitle( tr( "Open Vector Tile Dataset" ) );
mFileWidget->setFilter( QgsProviderRegistry::instance()->fileVectorTileFilters() );
mFileWidget->setStorageMode( QgsFileWidget::GetFile );
mFileWidget->setOptions( QFileDialog::HideNameFilterDetails );
connect( mFileWidget, &QgsFileWidget::fileChanged, this, [ = ]( const QString & path )
{
emit enableButtons( ! path.isEmpty() );
} );
}

void QgsVectorTileSourceSelect::btnNew_clicked()
Expand Down Expand Up @@ -158,8 +184,31 @@ void QgsVectorTileSourceSelect::btnLoad_clicked()

void QgsVectorTileSourceSelect::addButtonClicked()
{
const QString uri = QgsVectorTileProviderConnection::encodedUri( QgsVectorTileProviderConnection::connection( cmbConnections->currentText() ) );
emit addVectorTileLayer( uri, cmbConnections->currentText() );
if ( mRadioSourceService->isChecked() )
{

const QString uri = QgsVectorTileProviderConnection::encodedUri( QgsVectorTileProviderConnection::connection( cmbConnections->currentText() ) );
emit addVectorTileLayer( uri, cmbConnections->currentText() );
}
else if ( mRadioSourceFile->isChecked() )
{
const QString filePath = mFileWidget->filePath();
const QList< QgsProviderRegistry::ProviderCandidateDetails > providers = QgsProviderRegistry::instance()->preferredProvidersForUri( filePath );
QString providerKey;
for ( const QgsProviderRegistry::ProviderCandidateDetails &details : providers )
{
if ( details.layerTypes().contains( Qgis::LayerType::VectorTile ) )
{
providerKey = details.metadata()->key();
}
}

QVariantMap parts;
parts.insert( QStringLiteral( "path" ), filePath );
const QString uri = QgsProviderRegistry::instance()->encodeUri( providerKey, parts );

emit addVectorTileLayer( uri, QgsProviderUtils::suggestLayerNameFromFilePath( filePath ) );
}
}

void QgsVectorTileSourceSelect::populateConnectionList()
Expand Down

0 comments on commit 692d7a7

Please sign in to comment.