[feature] api for adding vector tile layers

This is code-only, not visible to users change and prerequisite for
exposing vector tile layer in the Data Source manager
This commit is contained in:
Alexander Bruy 2020-04-16 13:26:40 +03:00
parent 3b3c7d8012
commit 39e397ebd0
11 changed files with 106 additions and 15 deletions

View File

@ -767,6 +767,13 @@ Adds a raster layer to the current project, from the specified raster data provi
virtual QgsMeshLayer *addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey ) = 0;
%Docstring
Adds a mesh layer to the current project.
%End
virtual QgsVectorTileLayer *addVectorTileLayer( const QString &url, const QString &baseName ) = 0;
%Docstring
Adds a vector tile layer to the current project.
.. versionadded:: 3.14
%End
virtual bool addProject( const QString &project ) = 0;

View File

@ -92,6 +92,13 @@ will be used.
Emitted when a mesh layer has been selected for addition.
.. versionadded:: 3.4
%End
void addVectorTileLayer( const QString &url, const QString &baseName );
%Docstring
Emitted when a vector tile layer has been selected for addition.
.. versionadded:: 3.14
%End
void addVectorLayers( const QStringList &layerList, const QString &encoding, const QString &dataSourceType );

View File

@ -2323,6 +2323,7 @@ void QgisApp::dataSourceManager( const QString &pageName )
connect( mDataSourceManagerDialog, SIGNAL( addVectorLayers( QStringList const &, QString const &, QString const & ) ),
this, SLOT( addVectorLayers( QStringList const &, QString const &, QString const & ) ) );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::addMeshLayer, this, &QgisApp::addMeshLayer );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::addVectorTileLayer, this, &QgisApp::addVectorTileLayer );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::showStatusMessage, this, &QgisApp::showStatusMessage );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::addDatabaseLayers, this, &QgisApp::addDatabaseLayers );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::replaceSelectedVectorLayer, this, &QgisApp::replaceSelectedVectorLayer );
@ -5458,7 +5459,6 @@ bool QgisApp::addVectorLayersPrivate( const QStringList &layerQStringList, const
return true;
}
QgsMeshLayer *QgisApp::addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey )
{
return addMeshLayerPrivate( url, baseName, providerKey );
@ -5538,6 +5538,46 @@ QgsMeshLayer *QgisApp::addMeshLayerPrivate( const QString &url, const QString &b
return layer.release();
}
QgsVectorTileLayer *QgisApp::addVectorTileLayer( const QString &url, const QString &baseName )
{
return addVectorTileLayerPrivate( url, baseName );
}
QgsVectorTileLayer *QgisApp::addVectorTileLayerPrivate( const QString &url, const QString &baseName, const bool guiWarning )
{
QgsCanvasRefreshBlocker refreshBlocker;
QgsSettings settings;
QString base( baseName );
if ( settings.value( QStringLiteral( "qgis/formatLayerName" ), false ).toBool() )
{
base = QgsMapLayer::formatLayerName( base );
}
QgsDebugMsg( "completeBaseName: " + base );
// create the layer
std::unique_ptr<QgsVectorTileLayer> layer( new QgsVectorTileLayer( url, base ) );
if ( !layer || !layer->isValid() )
{
if ( guiWarning )
{
QString msg = tr( "%1 is not a valid or recognized data source." ).arg( url );
visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
}
// since the layer is bad, stomp on it
return nullptr;
}
QgsProject::instance()->addMapLayer( layer.get() );
activateDeactivateLayerRelatedActions( activeLayer() );
return layer.release();
}
// present a dialog to choose zipitem layers
bool QgisApp::askUserForZipItemLayers( const QString &path )
{

View File

@ -98,6 +98,7 @@ class QgsUndoWidget;
class QgsUserInputWidget;
class QgsVectorLayer;
class QgsVectorLayerTools;
class QgsVectorTileLayer;
class QgsWelcomePage;
class QgsOptionsWidgetFactory;
class QgsStatusBar;
@ -1022,8 +1023,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
/**
* Add a raster layer directly without prompting user for location
The caller must provide information compatible with the provider plugin
using the uri and baseName. The provider can use these
parameters in any way necessary to initialize the layer. The baseName
using the \a uri and \a baseName. The provider can use these
parameters in any way necessary to initialize the layer. The \a baseName
parameter is used in the Map Legend so it should be formed in a meaningful
way.
*/
@ -1032,8 +1033,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
/**
* Add a vector layer directly without prompting user for location
The caller must provide information compatible with the provider plugin
using the vectorLayerPath and baseName. The provider can use these
parameters in any way necessary to initialize the layer. The baseName
using the \a vectorLayerPath and \a baseName. The provider can use these
parameters in any way necessary to initialize the layer. The \a baseName
parameter is used in the Map Legend so it should be formed in a meaningful
way.
*/
@ -1041,10 +1042,23 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
/**
* Adds a mesh layer directly without prompting user for location
* \returns true if successfully added layer
* The caller must provide information compatible with the provider plugin
* using the \a url and \a baseName. The provider can use these
* parameters in any way necessary to initialize the layer. The \a baseName
* parameter is used in the Map Legend so it should be formed in a meaningful
* way.
*/
QgsMeshLayer *addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey );
/**
* Adds a vector tile layer directly without prompting user for location
* The caller must provide information needed for layer construction
* using the \a url and \a baseName. The \a baseName parameter is used
* in the Map Legend so it should be formed in a meaningful way.
* \since QGIS 3.14
*/
QgsVectorTileLayer *addVectorTileLayer( const QString &url, const QString &baseName );
/**
* \brief overloaded version of the private addLayer method that takes a list of
* file names instead of prompting user with a dialog.
@ -1915,6 +1929,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
QgsMeshLayer *addMeshLayerPrivate( const QString &uri, const QString &baseName,
const QString &providerKey, bool guiWarning = true );
//! Open a vector tile layer - this is the generic function which takes all parameters
QgsVectorTileLayer *addVectorTileLayerPrivate( const QString &uri, const QString &baseName, bool guiWarning = true );
bool addVectorLayersPrivate( const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType, bool guiWarning = true );
QgsVectorLayer *addVectorLayerPrivate( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey, bool guiWarning = true );

View File

@ -162,6 +162,11 @@ QgsMeshLayer *QgisAppInterface::addMeshLayer( const QString &url, const QString
return qgis->addMeshLayer( url, baseName, providerKey );
}
QgsVectorTileLayer *QgisAppInterface::addVectorTileLayer( const QString &url, const QString &baseName )
{
return qgis->addVectorTileLayer( url, baseName );
}
bool QgisAppInterface::addProject( const QString &projectName )
{
return qgis->addProject( projectName );

View File

@ -70,6 +70,7 @@ class APP_EXPORT QgisAppInterface : public QgisInterface
QgsRasterLayer *addRasterLayer( const QString &rasterLayerPath, const QString &baseName ) override;
QgsRasterLayer *addRasterLayer( const QString &url, const QString &baseName, const QString &providerKey ) override;
QgsMeshLayer *addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey ) override;
QgsVectorTileLayer *addVectorTileLayer( const QString &url, const QString &baseName ) override;
bool addProject( const QString &projectName ) override;
bool newProject( bool promptToSaveFlag = false ) override;
void reloadConnections( ) override;

View File

@ -57,6 +57,7 @@ class QgsPluginManagerInterface;
class QgsRasterLayer;
class QgsVectorLayer;
class QgsVectorLayerTools;
class QgsVectorTileLayer;
class QgsOptionsWidgetFactory;
class QgsLocatorFilter;
class QgsStatusBar;
@ -668,6 +669,12 @@ class GUI_EXPORT QgisInterface : public QObject
*/
virtual QgsMeshLayer *addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey ) = 0;
/**
* Adds a vector tile layer to the current project.
* \since QGIS 3.14
*/
virtual QgsVectorTileLayer *addVectorTileLayer( const QString &url, const QString &baseName ) = 0;
//! Adds (opens) a project
virtual bool addProject( const QString &project ) = 0;

View File

@ -37,7 +37,6 @@ const QgsMapCanvas *QgsAbstractDataSourceWidget::mapCanvas() const
void QgsAbstractDataSourceWidget::setupButtons( QDialogButtonBox *buttonBox )
{
buttonBox->setStandardButtons( QDialogButtonBox::Apply | QDialogButtonBox::Close | QDialogButtonBox::Help );
#ifdef Q_OS_MACX
buttonBox->setStyleSheet( "* { button-layout: 2 }" );
@ -52,10 +51,8 @@ void QgsAbstractDataSourceWidget::setupButtons( QDialogButtonBox *buttonBox )
QPushButton *closeButton = buttonBox->button( QDialogButtonBox::Close );
closeButton->setToolTip( tr( "Close this dialog without adding any layer" ) );
connect( closeButton, &QPushButton::clicked, this, &QgsAbstractDataSourceWidget::reject );
}
void QgsAbstractDataSourceWidget::setMapCanvas( const QgsMapCanvas *mapCanvas )
{
mMapCanvas = mapCanvas;
@ -68,4 +65,3 @@ void QgsAbstractDataSourceWidget::addButtonClicked()
void QgsAbstractDataSourceWidget::reset()
{
}

View File

@ -106,6 +106,12 @@ class GUI_EXPORT QgsAbstractDataSourceWidget : public QDialog
*/
void addMeshLayer( const QString &url, const QString &baseName, const QString &providerKey );
/**
* Emitted when a vector tile layer has been selected for addition.
* \since QGIS 3.14
*/
void addVectorTileLayer( const QString &url, const QString &baseName );
/**
* Emitted when one or more OGR supported layers are selected for addition
* \param layerList list of layers protocol URIs

View File

@ -129,7 +129,6 @@ void QgsDataSourceManagerDialog::reset()
if ( dataSourceWidget )
dataSourceWidget->reset();
}
}
void QgsDataSourceManagerDialog::rasterLayerAdded( const QString &uri, const QString &baseName, const QString &providerKey )
@ -147,7 +146,6 @@ void QgsDataSourceManagerDialog::vectorLayersAdded( const QStringList &layerQStr
emit addVectorLayers( layerQStringList, enc, dataSourceType );
}
void QgsDataSourceManagerDialog::addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QIcon &icon, const QString &toolTip )
{
mPageNames.append( providerKey );
@ -187,7 +185,8 @@ void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *d
this, SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ) );
// Mesh
connect( dlg, &QgsAbstractDataSourceWidget::addMeshLayer, this, &QgsDataSourceManagerDialog::addMeshLayer );
// Vector tile
connect( dlg, &QgsAbstractDataSourceWidget::addVectorTileLayer, this, &QgsDataSourceManagerDialog::addVectorTileLayer );
// Virtual
connect( dlg, SIGNAL( replaceVectorLayer( QString, QString, QString, QString ) ),
this, SIGNAL( replaceSelectedVectorLayer( QString, QString, QString, QString ) ) );
@ -202,4 +201,3 @@ void QgsDataSourceManagerDialog::showEvent( QShowEvent *e )
QgsOptionsDialogBase::showEvent( e );
resizeAlltabs( ui->mOptionsStackedWidget->currentIndex() );
}

View File

@ -111,10 +111,17 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
void addVectorLayer( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey );
/**
* Emitted when a mesh layer was selected for addition: for signal forwarding to QgisApp\
* Emitted when a mesh layer was selected for addition: for signal forwarding to QgisApp
* \since QGIS 3.4
*/
void addMeshLayer( const QString &uri, const QString &baseName, const QString &providerKey );
/**
* Emitted when a vector tile layer was selected for addition: for signal forwarding to QgisApp
* \since QGIS 3.14
*/
void addVectorTileLayer( const QString &uri, const QString &baseName );
//! Replace the selected layer by a vector layer defined by uri, layer name, data source uri
void replaceSelectedVectorLayer( const QString &oldId, const QString &uri, const QString &layerName, const QString &provider );
//! Emitted when a one or more layer were selected for addition: for signal forwarding to QgisApp