Skip to content

Commit

Permalink
Fix source select dialog does not add new pages for providers registered
Browse files Browse the repository at this point in the history
after QGIS startup (eg when enabling a new plugin), and also ensure
pages are correctly removed when providers are removed

(cherry picked from commit ba9c669)
  • Loading branch information
nyalldawson committed Dec 20, 2022
1 parent f567046 commit ba97310
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 13 deletions.
19 changes: 17 additions & 2 deletions python/gui/auto_generated/qgssourceselectproviderregistry.sip.in
Expand Up @@ -9,8 +9,7 @@




class QgsSourceSelectProviderRegistry
class QgsSourceSelectProviderRegistry : QObject
{
%Docstring(signature="appended")
This class keeps a list of source select providers that may add items to the :py:class:`QgsDataSourceManagerDialog`
Expand Down Expand Up @@ -78,6 +77,22 @@ Gets select widget from provider with ``name``
The function is replacement of :py:func:`QgsProviderRegistry.createSelectionWidget()` from QGIS 3.8

.. versionadded:: 3.10
%End

signals:

void providerAdded( const QString &name );
%Docstring
Emitted whenever a provider is added to the registry.

.. versionadded:: 3.30
%End

void providerRemoved( const QString &name );
%Docstring
Emitted whenever a provider is removed from the registry.

.. versionadded:: 3.30
%End

private:
Expand Down
48 changes: 42 additions & 6 deletions src/gui/qgsdatasourcemanagerdialog.cpp
Expand Up @@ -58,7 +58,9 @@ QgsDataSourceManagerDialog::QgsDataSourceManagerDialog( QgsBrowserGuiModel *brow
mBrowserWidget = new QgsBrowserDockWidget( QStringLiteral( "Browser" ), mBrowserModel, this );
mBrowserWidget->setFeatures( QDockWidget::NoDockWidgetFeatures );
ui->mOptionsStackedWidget->addWidget( mBrowserWidget );
mPageNames.append( QStringLiteral( "browser" ) );
mPageProviderKeys.append( QStringLiteral( "browser" ) );
mPageProviderNames.append( QStringLiteral( "browser" ) );

// Forward all browser signals
connect( mBrowserWidget, &QgsBrowserDockWidget::handleDropUriList, this, &QgsDataSourceManagerDialog::handleDropUriList );
connect( mBrowserWidget, &QgsBrowserDockWidget::openFile, this, &QgsDataSourceManagerDialog::openFile );
Expand All @@ -75,9 +77,28 @@ QgsDataSourceManagerDialog::QgsDataSourceManagerDialog( QgsBrowserGuiModel *brow
QgsMessageLog::logMessage( tr( "Cannot get %1 select dialog from source select provider %2." ).arg( provider->name(), provider->providerKey() ), QStringLiteral( "DataSourceManager" ), Qgis::MessageLevel::Critical );
continue;
}
addProviderDialog( dlg, provider->providerKey(), provider->text(), provider->icon( ), provider->toolTip( ) );
addProviderDialog( dlg, provider->providerKey(), provider->name(), provider->text(), provider->icon( ), provider->toolTip( ) );
}

connect( QgsGui::sourceSelectProviderRegistry(), &QgsSourceSelectProviderRegistry::providerAdded, this, [ = ]( const QString & name )
{
if ( QgsSourceSelectProvider *provider = QgsGui::sourceSelectProviderRegistry()->providerByName( name ) )
{
QgsAbstractDataSourceWidget *dlg = provider->createDataSourceWidget( this );
if ( !dlg )
{
QgsMessageLog::logMessage( tr( "Cannot get %1 select dialog from source select provider %2." ).arg( provider->name(), provider->providerKey() ), QStringLiteral( "DataSourceManager" ), Qgis::MessageLevel::Critical );
return;
}
addProviderDialog( dlg, provider->providerKey(), provider->name(), provider->text(), provider->icon( ), provider->toolTip( ) );
}
} );

connect( QgsGui::sourceSelectProviderRegistry(), &QgsSourceSelectProviderRegistry::providerRemoved, this, [ = ]( const QString & name )
{
removeProviderDialog( name );
} );

restoreOptionsBaseUi( tr( "Data Source Manager" ) );
}

Expand All @@ -88,7 +109,8 @@ QgsDataSourceManagerDialog::~QgsDataSourceManagerDialog()

void QgsDataSourceManagerDialog::openPage( const QString &pageName )
{
const int pageIdx = mPageNames.indexOf( pageName );
// TODO -- this is actually using provider keys, not provider names!
const int pageIdx = mPageProviderKeys.indexOf( pageName );
if ( pageIdx != -1 )
{
QTimer::singleShot( 0, this, [ = ] { setCurrentPage( pageIdx ); } );
Expand Down Expand Up @@ -152,11 +174,13 @@ 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 )
void QgsDataSourceManagerDialog::addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QString &text, const QIcon &icon, const QString &toolTip )
{
mPageNames.append( providerKey );
mPageProviderKeys.append( providerKey );
mPageProviderNames.append( providerName );
ui->mOptionsStackedWidget->addWidget( dlg );
QListWidgetItem *layerItem = new QListWidgetItem( providerName, ui->mOptionsListWidget );
QListWidgetItem *layerItem = new QListWidgetItem( text, ui->mOptionsListWidget );
layerItem->setData( Qt::UserRole, providerName );
layerItem->setToolTip( toolTip.isEmpty() ? tr( "Add %1 layer" ).arg( providerName ) : toolTip );
layerItem->setIcon( icon );
// Set crs and extent from canvas
Expand All @@ -171,6 +195,18 @@ void QgsDataSourceManagerDialog::addProviderDialog( QgsAbstractDataSourceWidget
makeConnections( dlg, providerKey );
}

void QgsDataSourceManagerDialog::removeProviderDialog( const QString &providerName )
{
const int pageIdx = mPageProviderNames.indexOf( providerName );
if ( pageIdx != -1 )
{
ui->mOptionsStackedWidget->removeWidget( ui->mOptionsStackedWidget->widget( pageIdx ) );
mPageProviderKeys.removeAt( pageIdx );
mPageProviderNames.removeAt( pageIdx );
ui->mOptionsListWidget->removeItemWidget( ui->mOptionsListWidget->item( pageIdx ) );
}
}

void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *dlg, const QString &providerKey )
{
// DB
Expand Down
6 changes: 4 additions & 2 deletions src/gui/qgsdatasourcemanagerdialog.h
Expand Up @@ -167,12 +167,14 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
void providerDialogsRefreshRequested();

private:
void addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QIcon &icon, const QString &toolTip = QString() );
void addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QString &text, const QIcon &icon, const QString &toolTip = QString() );
void removeProviderDialog( const QString &providerName );
void makeConnections( QgsAbstractDataSourceWidget *dlg, const QString &providerKey );
Ui::QgsDataSourceManagerDialog *ui = nullptr;
QgsBrowserDockWidget *mBrowserWidget = nullptr;
int mPreviousRow;
QStringList mPageNames;
QStringList mPageProviderKeys;
QStringList mPageProviderNames;
// Map canvas
QgsMapCanvas *mMapCanvas = nullptr;
QgsMessageBar *mMessageBar = nullptr;
Expand Down
4 changes: 4 additions & 0 deletions src/gui/qgssourceselectproviderregistry.cpp
Expand Up @@ -38,14 +38,18 @@ void QgsSourceSelectProviderRegistry::addProvider( QgsSourceSelectProvider *prov
{
return first->ordering() < second->ordering();
} );

emit providerAdded( provider->name() );
}

bool QgsSourceSelectProviderRegistry::removeProvider( QgsSourceSelectProvider *provider )
{
const QString name = provider ? provider->name() : QString();
const int index = mProviders.indexOf( provider );
if ( index >= 0 )
{
delete mProviders.takeAt( index );
emit providerRemoved( name );
return true;
}
return false;
Expand Down
23 changes: 20 additions & 3 deletions src/gui/qgssourceselectproviderregistry.h
Expand Up @@ -17,8 +17,7 @@
#define QGSSOURCESELECTPROVIDERREGISTRY_H

#include <QList>
#include <QWidget>

#include <QObject>
#include "qgis_gui.h"
#include "qgis_sip.h"

Expand All @@ -38,8 +37,10 @@ class QgsAbstractDataSourceWidget;
*
* \since QGIS 3.0
*/
class GUI_EXPORT QgsSourceSelectProviderRegistry
class GUI_EXPORT QgsSourceSelectProviderRegistry : public QObject
{
Q_OBJECT

public:

QgsSourceSelectProviderRegistry();
Expand Down Expand Up @@ -89,6 +90,22 @@ class GUI_EXPORT QgsSourceSelectProviderRegistry
QgsProviderRegistry::WidgetMode widgetMode
);

signals:

/**
* Emitted whenever a provider is added to the registry.
*
* \since QGIS 3.30
*/
void providerAdded( const QString &name );

/**
* Emitted whenever a provider is removed from the registry.
*
* \since QGIS 3.30
*/
void providerRemoved( const QString &name );

private:
#ifdef SIP_RUN
QgsSourceSelectProviderRegistry( const QgsSourceSelectProviderRegistry &rh );
Expand Down

0 comments on commit ba97310

Please sign in to comment.