Skip to content

Commit

Permalink
Add a mechanism for data providers to supply QgsMapLayerConfigWidgetF…
Browse files Browse the repository at this point in the history
…actory

via their GUI metadata

Allows providers to create layer properties pages, giving us a nice
way to keep provider-specific logic out of the layer properties
classes.
  • Loading branch information
nyalldawson committed Mar 24, 2021
1 parent cd17a85 commit 8c0b98d
Show file tree
Hide file tree
Showing 21 changed files with 86 additions and 21 deletions.
Expand Up @@ -31,7 +31,7 @@ Constructor
:param lyr: Mesh map layer for which properties will be displayed
%End

void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );
%Docstring
Adds properties page from a factory

Expand Down
11 changes: 11 additions & 0 deletions python/gui/auto_generated/qgsproviderguimetadata.sip.in
Expand Up @@ -84,6 +84,17 @@ Returns source widget providers
Ownership of created providers is passed to the caller.

.. versionadded:: 3.18
%End

virtual QList<const QgsMapLayerConfigWidgetFactory *> mapLayerConfigWidgetFactories();
%Docstring
Returns map layer config widget factories associated with the provider.

.. note::

Ownership of factories remains with the provider.

.. versionadded:: 3.20
%End

QString key() const;
Expand Down
9 changes: 9 additions & 0 deletions python/gui/auto_generated/qgsproviderguiregistry.sip.in
Expand Up @@ -103,6 +103,15 @@ Returns all source widget providers registered in provider with ``providerKey``
.. versionadded:: 3.18
%End

virtual QList<const QgsMapLayerConfigWidgetFactory *> mapLayerConfigWidgetFactories( QgsMapLayer *layer = 0 );
%Docstring
Returns all map layer config widget factories associated with the registered providers.

The optional ``layer`` argument can be used to only return factories which support the specified layer.

.. versionadded:: 3.20
%End


};

Expand Down
Expand Up @@ -36,7 +36,7 @@ Constructor
:param fl: windows flag
%End

void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );
%Docstring
Adds a properties page factory to the raster layer properties dialog.

Expand Down
Expand Up @@ -31,7 +31,7 @@ the Free Software Foundation; either version 2 of the License, or *

QgsVectorLayerProperties( QgsMapCanvas *canvas, QgsMessageBar *messageBar, QgsVectorLayer *lyr = 0, QWidget *parent = 0, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags );

void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );
%Docstring
Adds a properties page factory to the vector layer properties dialog.
%End
Expand Down
2 changes: 1 addition & 1 deletion src/app/pointcloud/qgspointcloudlayerproperties.cpp
Expand Up @@ -121,7 +121,7 @@ QgsPointCloudLayerProperties::QgsPointCloudLayerProperties( QgsPointCloudLayer *
restoreOptionsBaseUi( title );
}

void QgsPointCloudLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory )
void QgsPointCloudLayerProperties::addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory )
{
if ( !factory->supportsLayer( mLayer ) || !factory->supportLayerPropertiesDialog() )
{
Expand Down
2 changes: 1 addition & 1 deletion src/app/pointcloud/qgspointcloudlayerproperties.h
Expand Up @@ -95,7 +95,7 @@ class QgsPointCloudLayerProperties : public QgsOptionsDialogBase, private Ui::Qg
QgsPointCloudLayerProperties( QgsPointCloudLayer *lyr, QgsMapCanvas *canvas, QgsMessageBar *messageBar, QWidget *parent = nullptr, Qt::WindowFlags = QgsGuiUtils::ModalDialogFlags );


void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );

private slots:
void apply();
Expand Down
12 changes: 8 additions & 4 deletions src/app/qgisapp.cpp
Expand Up @@ -16242,13 +16242,17 @@ void QgisApp::showLayerProperties( QgsMapLayer *mapLayer, const QString &page )
return; //don't show properties of embedded layers
}

// collect factories from registered data providers
QList<const QgsMapLayerConfigWidgetFactory *> providerFactories = QgsGui::providerGuiRegistry()->mapLayerConfigWidgetFactories( mapLayer );
providerFactories.append( mMapLayerPanelFactories );

switch ( mapLayer->type() )
{
case QgsMapLayerType::RasterLayer:
{
QgsRasterLayerProperties *rasterLayerPropertiesDialog = new QgsRasterLayerProperties( mapLayer, mMapCanvas, this );

for ( QgsMapLayerConfigWidgetFactory *factory : std::as_const( mMapLayerPanelFactories ) )
for ( const QgsMapLayerConfigWidgetFactory *factory : std::as_const( providerFactories ) )
{
rasterLayerPropertiesDialog->addPropertiesPageFactory( factory );
}
Expand Down Expand Up @@ -16280,7 +16284,7 @@ void QgisApp::showLayerProperties( QgsMapLayer *mapLayer, const QString &page )
{
QgsMeshLayerProperties meshLayerPropertiesDialog( mapLayer, mMapCanvas, this );

for ( QgsMapLayerConfigWidgetFactory *factory : std::as_const( mMapLayerPanelFactories ) )
for ( const QgsMapLayerConfigWidgetFactory *factory : std::as_const( providerFactories ) )
{
meshLayerPropertiesDialog.addPropertiesPageFactory( factory );
}
Expand Down Expand Up @@ -16319,7 +16323,7 @@ void QgisApp::showLayerProperties( QgsMapLayer *mapLayer, const QString &page )
saveAsFile( clone.get() );
}
} );
for ( QgsMapLayerConfigWidgetFactory *factory : std::as_const( mMapLayerPanelFactories ) )
for ( const QgsMapLayerConfigWidgetFactory *factory : std::as_const( providerFactories ) )
{
vectorLayerPropertiesDialog->addPropertiesPageFactory( factory );
}
Expand Down Expand Up @@ -16368,7 +16372,7 @@ void QgisApp::showLayerProperties( QgsMapLayer *mapLayer, const QString &page )
else
pointCloudLayerPropertiesDialog.restoreLastPage();

for ( QgsMapLayerConfigWidgetFactory *factory : std::as_const( mMapLayerPanelFactories ) )
for ( const QgsMapLayerConfigWidgetFactory *factory : std::as_const( providerFactories ) )
{
pointCloudLayerPropertiesDialog.addPropertiesPageFactory( factory );
}
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgisapp.h
Expand Up @@ -2578,7 +2578,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
QgsGeoreferencerMainWindow *mGeoreferencer = nullptr;
#endif

QList<QgsMapLayerConfigWidgetFactory *> mMapLayerPanelFactories;
QList<const QgsMapLayerConfigWidgetFactory *> mMapLayerPanelFactories;
QList<QPointer<QgsOptionsWidgetFactory>> mOptionsWidgetFactories;
QList<QPointer<QgsOptionsWidgetFactory>> mProjectPropertiesWidgetFactories;

Expand Down
4 changes: 2 additions & 2 deletions src/app/qgslayerstylingwidget.cpp
Expand Up @@ -60,7 +60,7 @@
#endif


QgsLayerStylingWidget::QgsLayerStylingWidget( QgsMapCanvas *canvas, QgsMessageBar *messageBar, const QList<QgsMapLayerConfigWidgetFactory *> &pages, QWidget *parent )
QgsLayerStylingWidget::QgsLayerStylingWidget( QgsMapCanvas *canvas, QgsMessageBar *messageBar, const QList<const QgsMapLayerConfigWidgetFactory *> &pages, QWidget *parent )
: QWidget( parent )
, mNotSupportedPage( 0 )
, mLayerPage( 1 )
Expand Down Expand Up @@ -117,7 +117,7 @@ QgsLayerStylingWidget::~QgsLayerStylingWidget()
delete mStyleManagerFactory;
}

void QgsLayerStylingWidget::setPageFactories( const QList<QgsMapLayerConfigWidgetFactory *> &factories )
void QgsLayerStylingWidget::setPageFactories( const QList<const QgsMapLayerConfigWidgetFactory *> &factories )
{
mPageFactories = factories;
// Always append the style manager factory at the bottom of the list
Expand Down
6 changes: 3 additions & 3 deletions src/app/qgslayerstylingwidget.h
Expand Up @@ -97,11 +97,11 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
Symbology3D,
};

QgsLayerStylingWidget( QgsMapCanvas *canvas, QgsMessageBar *messageBar, const QList<QgsMapLayerConfigWidgetFactory *> &pages, QWidget *parent = nullptr );
QgsLayerStylingWidget( QgsMapCanvas *canvas, QgsMessageBar *messageBar, const QList<const QgsMapLayerConfigWidgetFactory *> &pages, QWidget *parent = nullptr );
~QgsLayerStylingWidget() override;
QgsMapLayer *layer() { return mCurrentLayer; }

void setPageFactories( const QList<QgsMapLayerConfigWidgetFactory *> &factories );
void setPageFactories( const QList<const QgsMapLayerConfigWidgetFactory *> &factories );

/**
* Sets whether updates of the styling widget are blocked. This can be called to prevent
Expand Down Expand Up @@ -154,7 +154,7 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
QgsRendererMeshPropertiesWidget *mMeshStyleWidget = nullptr;
QgsVectorTileBasicRendererWidget *mVectorTileStyleWidget = nullptr;
QgsVectorTileBasicLabelingWidget *mVectorTileLabelingWidget = nullptr;
QList<QgsMapLayerConfigWidgetFactory *> mPageFactories;
QList<const QgsMapLayerConfigWidgetFactory *> mPageFactories;
QMap<int, QgsMapLayerConfigWidgetFactory *> mUserPages;
QgsLayerStyleManagerWidgetFactory *mStyleManagerFactory = nullptr;
};
Expand Down
2 changes: 1 addition & 1 deletion src/gui/mesh/qgsmeshlayerproperties.cpp
Expand Up @@ -155,7 +155,7 @@ QgsMeshLayerProperties::QgsMeshLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *
restoreOptionsBaseUi( title );
}

void QgsMeshLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory )
void QgsMeshLayerProperties::addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory )
{
if ( !factory->supportsLayer( mMeshLayer ) || !factory->supportLayerPropertiesDialog() )
{
Expand Down
2 changes: 1 addition & 1 deletion src/gui/mesh/qgsmeshlayerproperties.h
Expand Up @@ -57,7 +57,7 @@ class GUI_EXPORT QgsMeshLayerProperties : public QgsOptionsDialogBase, private U
*
* \since QGIS 3.16
*/
void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );

protected slots:
void optionsStackedWidget_CurrentChanged( int index ) override SIP_SKIP ;
Expand Down
5 changes: 5 additions & 0 deletions src/gui/qgsproviderguimetadata.cpp
Expand Up @@ -52,6 +52,11 @@ QList<QgsProviderSourceWidgetProvider *> QgsProviderGuiMetadata::sourceWidgetPro
return QList<QgsProviderSourceWidgetProvider *>();
}

QList< const QgsMapLayerConfigWidgetFactory *> QgsProviderGuiMetadata::mapLayerConfigWidgetFactories()
{
return QList<const QgsMapLayerConfigWidgetFactory *>();
}

QString QgsProviderGuiMetadata::key() const
{
return mKey;
Expand Down
9 changes: 9 additions & 0 deletions src/gui/qgsproviderguimetadata.h
Expand Up @@ -29,6 +29,7 @@ class QgsSourceSelectProvider;
class QgsProjectStorageGuiProvider;
class QgsSubsetStringEditorProvider;
class QgsProviderSourceWidgetProvider;
class QgsMapLayerConfigWidgetFactory;

/**
* \ingroup gui
Expand Down Expand Up @@ -85,6 +86,14 @@ class GUI_EXPORT QgsProviderGuiMetadata
*/
virtual QList<QgsProviderSourceWidgetProvider *> sourceWidgetProviders() SIP_FACTORY;

/**
* Returns map layer config widget factories associated with the provider.
*
* \note Ownership of factories remains with the provider.
* \since QGIS 3.20
*/
virtual QList<const QgsMapLayerConfigWidgetFactory *> mapLayerConfigWidgetFactories();

//! Returns unique provider key
QString key() const;

Expand Down
16 changes: 16 additions & 0 deletions src/gui/qgsproviderguiregistry.cpp
Expand Up @@ -26,6 +26,7 @@
#include "qgsogrguiprovider.h"
#include "qgsvectortileproviderguimetadata.h"
#include "qgspointcloudproviderguimetadata.h"
#include "qgsmaplayerconfigwidgetfactory.h"

#ifdef HAVE_EPT
#include "qgseptproviderguimetadata.h"
Expand Down Expand Up @@ -229,6 +230,21 @@ QList<QgsProviderSourceWidgetProvider *> QgsProviderGuiRegistry::sourceWidgetPro
return QList<QgsProviderSourceWidgetProvider *>();
}

QList<const QgsMapLayerConfigWidgetFactory *> QgsProviderGuiRegistry::mapLayerConfigWidgetFactories( QgsMapLayer *layer )
{
QList<const QgsMapLayerConfigWidgetFactory *> res;
for ( GuiProviders::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
{
const QList<const QgsMapLayerConfigWidgetFactory *> providerFactories = ( *it ).second->mapLayerConfigWidgetFactories();
for ( const QgsMapLayerConfigWidgetFactory *factory : providerFactories )
{
if ( !layer || factory->supportsLayer( layer ) )
res << factory;
}
}
return res;
}

QStringList QgsProviderGuiRegistry::providerList() const
{
QStringList lst;
Expand Down
11 changes: 11 additions & 0 deletions src/gui/qgsproviderguiregistry.h
Expand Up @@ -35,6 +35,8 @@ class QgsSourceSelectProvider;
class QgsProjectStorageGuiProvider;
class QgsSubsetStringEditorProvider;
class QgsProviderSourceWidgetProvider;
class QgsMapLayerConfigWidgetFactory;
class QgsMapLayer;

/**
* \ingroup gui
Expand Down Expand Up @@ -102,6 +104,15 @@ class GUI_EXPORT QgsProviderGuiRegistry
*/
virtual QList<QgsProviderSourceWidgetProvider *> sourceWidgetProviders( const QString &providerKey ) SIP_FACTORY;

/**
* Returns all map layer config widget factories associated with the registered providers.
*
* The optional \a layer argument can be used to only return factories which support the specified layer.
*
* \since QGIS 3.20
*/
virtual QList<const QgsMapLayerConfigWidgetFactory *> mapLayerConfigWidgetFactories( QgsMapLayer *layer = nullptr );

//! Type for data provider metadata associative container
SIP_SKIP typedef std::map<QString, QgsProviderGuiMetadata *> GuiProviders;

Expand Down
2 changes: 1 addition & 1 deletion src/gui/raster/qgsrasterlayerproperties.cpp
Expand Up @@ -542,7 +542,7 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanv
mOptsPage_Server->setProperty( "helpPage", QStringLiteral( "working_with_raster/raster_properties.html#server-properties" ) );
}

void QgsRasterLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory )
void QgsRasterLayerProperties::addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory )
{
if ( !factory->supportsLayer( mRasterLayer ) || !factory->supportLayerPropertiesDialog() )
{
Expand Down
2 changes: 1 addition & 1 deletion src/gui/raster/qgsrasterlayerproperties.h
Expand Up @@ -83,7 +83,7 @@ class GUI_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private
* Adds a properties page factory to the raster layer properties dialog.
* \since QGIS 3.18
*/
void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );

protected slots:
//! \brief auto slot executed when the active page in the main widget stack is changed
Expand Down
2 changes: 1 addition & 1 deletion src/gui/vector/qgsvectorlayerproperties.cpp
Expand Up @@ -463,7 +463,7 @@ void QgsVectorLayerProperties::toggleEditing()
setPbnQueryBuilderEnabled();
}

void QgsVectorLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory )
void QgsVectorLayerProperties::addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory )
{
if ( !factory->supportsLayer( mLayer ) || !factory->supportLayerPropertiesDialog() )
{
Expand Down
2 changes: 1 addition & 1 deletion src/gui/vector/qgsvectorlayerproperties.h
Expand Up @@ -70,7 +70,7 @@ class GUI_EXPORT QgsVectorLayerProperties : public QgsOptionsDialogBase, private
QgsVectorLayerProperties( QgsMapCanvas *canvas, QgsMessageBar *messageBar, QgsVectorLayer *lyr = nullptr, QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags );

//! Adds a properties page factory to the vector layer properties dialog.
void addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory *factory );
void addPropertiesPageFactory( const QgsMapLayerConfigWidgetFactory *factory );

protected slots:
void optionsStackedWidget_CurrentChanged( int index ) override SIP_SKIP;
Expand Down

0 comments on commit 8c0b98d

Please sign in to comment.