Skip to content

Commit

Permalink
Add source widgets for vector tile VTPK and MBTiles layers
Browse files Browse the repository at this point in the history
Allows changing the path to the .vtpk / .mbtiles file from the
Layer Properties - Source tab (just like what we expose for
GDAL sources in raster layer properties)
  • Loading branch information
nyalldawson committed Apr 1, 2023
1 parent d1c3e8d commit 819544d
Show file tree
Hide file tree
Showing 10 changed files with 551 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/gui/CMakeLists.txt
Expand Up @@ -415,6 +415,9 @@ set(QGIS_GUI_SRCS
providers/gdal/qgsgdalsourceselect.cpp
providers/gdal/qgsgdalguiprovider.cpp

providers/mbtilesvectortiles/qgsmbtilesvectortileguiprovider.cpp
providers/mbtilesvectortiles/qgsmbtilesvectortilesourcewidget.cpp

providers/ogr/qgsogrguiprovider.cpp
providers/ogr/qgsogrdbsourceselect.cpp
providers/ogr/qgsogrdbtablemodel.cpp
Expand All @@ -424,6 +427,9 @@ set(QGIS_GUI_SRCS
providers/ogr/qgsogritemguiprovider.cpp
providers/ogr/qgsgeopackageprojectstorageguiprovider.cpp

providers/vtpkvectortiles/qgsvtpkvectortileguiprovider.cpp
providers/vtpkvectortiles/qgsvtpkvectortilesourcewidget.cpp

sensor/qgssensorguiregistry.cpp
sensor/qgssensorwidget.cpp

Expand Down Expand Up @@ -1317,6 +1323,9 @@ set(QGIS_GUI_HDRS
providers/gdal/qgsgdalguiprovider.h
providers/gdal/qgsgdalsourceselect.h

providers/mbtilesvectortiles/qgsmbtilesvectortileguiprovider.h
providers/mbtilesvectortiles/qgsmbtilesvectortilesourcewidget.h

providers/ogr/qgsgeopackageitemguiprovider.h
providers/ogr/qgsgeopackageprojectstoragedialog.h
providers/ogr/qgsgeopackageprojectstorageguiprovider.h
Expand All @@ -1326,6 +1335,9 @@ set(QGIS_GUI_HDRS
providers/ogr/qgsogritemguiprovider.h
providers/ogr/qgsogrsourceselect.h

providers/vtpkvectortiles/qgsvtpkvectortileguiprovider.h
providers/vtpkvectortiles/qgsvtpkvectortilesourcewidget.h

raster/qgsrasterattributetablewidget.h
raster/qgscreaterasterattributetabledialog.h
raster/qgsloadrasterattributetabledialog.h
Expand Down Expand Up @@ -1550,7 +1562,9 @@ target_include_directories(qgis_gui PUBLIC
${CMAKE_SOURCE_DIR}/src/gui/processing/models
${CMAKE_SOURCE_DIR}/src/gui/providers
${CMAKE_SOURCE_DIR}/src/gui/providers/gdal
${CMAKE_SOURCE_DIR}/src/gui/providers/mbtilesvectortiles
${CMAKE_SOURCE_DIR}/src/gui/providers/ogr
${CMAKE_SOURCE_DIR}/src/gui/providers/vtpkvectortiles
${CMAKE_SOURCE_DIR}/src/gui/pointcloud
${CMAKE_SOURCE_DIR}/src/gui/raster
${CMAKE_SOURCE_DIR}/src/gui/sensor
Expand Down
@@ -0,0 +1,93 @@
/***************************************************************************
qgsmbtilesvectortileguiprovider.cpp
--------------------------------------
Date : March 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 "qgsmbtilesvectortileguiprovider.h"
///@cond PRIVATE

#include <QList>
#include <QAction>
#include <QDesktopServices>
#include <QMenu>
#include <QMessageBox>

#include "qgsmaplayer.h"
#include "qgsmbtilesvectortilesourcewidget.h"
#include "qgsproviderregistry.h"
#include "qgsmbtilesvectortiledataprovider.h"


//
// QgsMbtilesVectorTileGuiProviderMetadata
//

QgsMbtilesVectorTileSourceWidgetProvider::QgsMbtilesVectorTileSourceWidgetProvider()
{

}

QString QgsMbtilesVectorTileSourceWidgetProvider::providerKey() const
{
return QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY;
}

bool QgsMbtilesVectorTileSourceWidgetProvider::canHandleLayer( QgsMapLayer *layer ) const
{
if ( layer->providerType() != QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY )
return false;

const QVariantMap parts = QgsProviderRegistry::instance()->decodeUri(
QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
layer->source() );
if ( parts.value( QStringLiteral( "path" ) ).toString().isEmpty() )
return false;

return true;
}

QgsProviderSourceWidget *QgsMbtilesVectorTileSourceWidgetProvider::createWidget( QgsMapLayer *layer, QWidget *parent )
{
if ( layer->providerType() != QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY )
return nullptr;

const QVariantMap parts = QgsProviderRegistry::instance()->decodeUri(
QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
layer->source()
);

if ( parts.value( QStringLiteral( "path" ) ).toString().isEmpty() )
return nullptr;

return new QgsMbtilesVectorTileSourceWidget( parent );
}


//
// QgsMbtilesVectorTileGuiProviderMetadata
//
QgsMbtilesVectorTileGuiProviderMetadata::QgsMbtilesVectorTileGuiProviderMetadata():
QgsProviderGuiMetadata( QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY )
{
}

QList<QgsProviderSourceWidgetProvider *> QgsMbtilesVectorTileGuiProviderMetadata::sourceWidgetProviders()
{
QList<QgsProviderSourceWidgetProvider *> providers;
providers << new QgsMbtilesVectorTileSourceWidgetProvider();
return providers;
}

///@endcond
@@ -0,0 +1,45 @@
/***************************************************************************
qgsmbtilesvectortileguiprovider.h
--------------------------------------
Date : March 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 QGSMBTILESVECTORTILEGUIPROVIDER_H
#define QGSMBTILESVECTORTILEGUIPROVIDER_H

#include "qgsproviderguimetadata.h"
#include "qgsprovidersourcewidgetprovider.h"

///@cond PRIVATE
#define SIP_NO_FILE

class QgsMbtilesVectorTileSourceWidgetProvider : public QgsProviderSourceWidgetProvider
{
public:
QgsMbtilesVectorTileSourceWidgetProvider();
QString providerKey() const override;
bool canHandleLayer( QgsMapLayer *layer ) const override;
QgsProviderSourceWidget *createWidget( QgsMapLayer *layer, QWidget *parent = nullptr ) override;
};

class QgsMbtilesVectorTileGuiProviderMetadata: public QgsProviderGuiMetadata
{
public:
QgsMbtilesVectorTileGuiProviderMetadata();
QList<QgsProviderSourceWidgetProvider *> sourceWidgetProviders() override;
};

///@endcond
#endif // QGSMBTILESVECTORTILEGUIPROVIDER_H
@@ -0,0 +1,76 @@
/***************************************************************************
qgsmbtilesvectortilesourcewidget.cpp
--------------------------------------
Date : March 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 "qgsmbtilesvectortilesourcewidget.h"
///@cond PRIVATE

#include "qgsproviderregistry.h"
#include "qgsfilewidget.h"
#include "qgsmbtilesvectortiledataprovider.h"

#include <QHBoxLayout>


QgsMbtilesVectorTileSourceWidget::QgsMbtilesVectorTileSourceWidget( QWidget *parent )
: QgsProviderSourceWidget( parent )
{
QHBoxLayout *layout = new QHBoxLayout();
layout->setContentsMargins( 0, 0, 0, 0 );

mFileWidget = new QgsFileWidget();
mFileWidget->setDialogTitle( tr( "Select Mbtiles Dataset" ) );
mFileWidget->setFilter( tr( "Mbtiles Files" ) + QStringLiteral( " (*.mbtiles *.MBTILES)" ) );
mFileWidget->setStorageMode( QgsFileWidget::GetFile );
mFileWidget->setOptions( QFileDialog::HideNameFilterDetails );
layout->addWidget( mFileWidget );

setLayout( layout );

connect( mFileWidget, &QgsFileWidget::fileChanged, this, &QgsMbtilesVectorTileSourceWidget::validate );
}

void QgsMbtilesVectorTileSourceWidget::setSourceUri( const QString &uri )
{
mSourceParts = QgsProviderRegistry::instance()->decodeUri(
QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
uri
);

mFileWidget->setFilePath( mSourceParts.value( QStringLiteral( "path" ) ).toString() );
mIsValid = true;
}

QString QgsMbtilesVectorTileSourceWidget::sourceUri() const
{
QVariantMap parts = mSourceParts;
parts.insert( QStringLiteral( "path" ), mFileWidget->filePath() );
return QgsProviderRegistry::instance()->encodeUri(
QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
parts
);
}

void QgsMbtilesVectorTileSourceWidget::validate()
{
const bool valid = !mFileWidget->filePath().isEmpty();
if ( valid != mIsValid )
emit validChanged( valid );
mIsValid = valid;
}


///@endcond
@@ -0,0 +1,50 @@
/***************************************************************************
qgsmbtilesvectortilesourcewidget.h
--------------------------------------
Date : March 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 QGSMBTILESKVECTORTILESOURCEWIDGET_H
#define QGSMBTILESKVECTORTILESOURCEWIDGET_H

#include "qgsprovidersourcewidget.h"
#include <QVariantMap>

class QgsFileWidget;

///@cond PRIVATE
#define SIP_NO_FILE

class QgsMbtilesVectorTileSourceWidget : public QgsProviderSourceWidget
{
Q_OBJECT

public:
QgsMbtilesVectorTileSourceWidget( QWidget *parent = nullptr );

void setSourceUri( const QString &uri ) override;
QString sourceUri() const override;

private slots:

void validate();

private:
QgsFileWidget *mFileWidget = nullptr;

QVariantMap mSourceParts;
bool mIsValid = false;
};

///@endcond
#endif // QGSMBTILESKVECTORTILESOURCEWIDGET_H

0 comments on commit 819544d

Please sign in to comment.