Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[feature] Expose option to load vector tile sources from files
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.