Skip to content

Commit 2d073d6

Browse files
committedSep 4, 2017
Remove all hardcoded source selects: rely on the registry
The data source manager dialog is now clean from hardcoded provider keys and there is a mean to add items to the dialog via plugins (C++, providers and Python).
1 parent eb0d570 commit 2d073d6

File tree

5 files changed

+42
-64
lines changed

5 files changed

+42
-64
lines changed
 

‎src/gui/qgsdatasourcemanagerdialog.cpp

Lines changed: 27 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
#include "qgsbrowserdockwidget.h"
2323
#include "qgssettings.h"
2424
#include "qgsproviderregistry.h"
25+
#include "qgssourceselectprovider.h"
26+
#include "qgssourceselectproviderregistry.h"
2527
#include "qgsabstractdatasourcewidget.h"
2628
#include "qgsmapcanvas.h"
29+
#include "qgsgui.h"
2730

2831
QgsDataSourceManagerDialog::QgsDataSourceManagerDialog( QWidget *parent, QgsMapCanvas *canvas, Qt::WindowFlags fl ) :
2932
QgsOptionsDialogBase( QStringLiteral( "Data Source Manager" ), parent, fl ),
@@ -55,39 +58,18 @@ QgsDataSourceManagerDialog::QgsDataSourceManagerDialog( QWidget *parent, QgsMapC
5558
connect( mBrowserWidget, &QgsBrowserDockWidget::connectionsChanged, this, &QgsDataSourceManagerDialog::connectionsChanged );
5659
connect( this, &QgsDataSourceManagerDialog::updateProjectHome, mBrowserWidget, &QgsBrowserDockWidget::updateProjectHome );
5760

58-
// Add data provider dialogs
59-
60-
providerDialog( QStringLiteral( "ogr" ), tr( "Vector" ), QStringLiteral( "/mActionAddOgrLayer.svg" ) );
61-
62-
providerDialog( QStringLiteral( "gdal" ), tr( "Raster" ), QStringLiteral( "/mActionAddRasterLayer.svg" ) );
63-
64-
providerDialog( QStringLiteral( "delimitedtext" ), tr( "Delimited Text" ), QStringLiteral( "/mActionAddDelimitedTextLayer.svg" ) );
65-
66-
#ifdef HAVE_POSTGRESQL
67-
providerDialog( QStringLiteral( "postgres" ), tr( "PostgreSQL" ), QStringLiteral( "/mActionAddPostgisLayer.svg" ) );
68-
#endif
69-
70-
providerDialog( QStringLiteral( "spatialite" ), tr( "SpatiaLite" ), QStringLiteral( "/mActionAddSpatiaLiteLayer.svg" ) );
71-
72-
providerDialog( QStringLiteral( "mssql" ), tr( "MSSQL" ), QStringLiteral( "/mActionAddMssqlLayer.svg" ) );
73-
74-
providerDialog( QStringLiteral( "DB2" ), tr( "DB2" ), QStringLiteral( "/mActionAddDb2Layer.svg" ) );
75-
76-
#ifdef HAVE_ORACLE
77-
providerDialog( QStringLiteral( "oracle" ), tr( "Oracle" ), QStringLiteral( "/mActionAddOracleLayer.svg" ) );
78-
#endif
79-
80-
providerDialog( QStringLiteral( "virtual" ), tr( "Virtual Layer" ), QStringLiteral( "/mActionAddVirtualLayer.svg" ) );
81-
82-
providerDialog( QStringLiteral( "wms" ), tr( "WMS" ), QStringLiteral( "/mActionAddWmsLayer.svg" ) );
83-
84-
providerDialog( QStringLiteral( "wcs" ), tr( "WCS" ), QStringLiteral( "/mActionAddWcsLayer.svg" ) );
85-
86-
providerDialog( QStringLiteral( "WFS" ), tr( "WFS" ), QStringLiteral( "/mActionAddWfsLayer.svg" ) );
87-
88-
providerDialog( QStringLiteral( "arcgismapserver" ), tr( "ArcGIS Map Server" ), QStringLiteral( "/mActionAddAmsLayer.svg" ) );
89-
90-
providerDialog( QStringLiteral( "arcgisfeatureserver" ), tr( "ArcGIS Feature Server" ), QStringLiteral( "/mActionAddAfsLayer.svg" ) );
61+
// Add provider dialogs
62+
const QList<QgsSourceSelectProvider *> sourceSelectProviders = QgsGui::sourceSelectProviderRegistry()->providers( ) ;
63+
for ( const auto provider : sourceSelectProviders )
64+
{
65+
QgsAbstractDataSourceWidget *dlg = provider->createDataSourceWidget( this );
66+
if ( !dlg )
67+
{
68+
QMessageBox::warning( this, provider->name(), tr( "Cannot get %1 select dialog from source select provider %2." ).arg( provider->name(), provider->providerKey() ) );
69+
continue;
70+
}
71+
addProviderDialog( dlg, provider->providerKey(), provider->text(), provider->icon( ) );
72+
}
9173

9274
}
9375

@@ -140,31 +122,21 @@ void QgsDataSourceManagerDialog::vectorLayersAdded( const QStringList &layerQStr
140122
}
141123

142124

143-
QgsAbstractDataSourceWidget *QgsDataSourceManagerDialog::providerDialog( const QString providerKey, const QString providerName, const QString icon, QString title )
125+
void QgsDataSourceManagerDialog::addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QIcon &icon, QString toolTip )
144126
{
145-
QgsAbstractDataSourceWidget *dlg = dynamic_cast<QgsAbstractDataSourceWidget *>( QgsProviderRegistry::instance()->createSelectionWidget( providerKey, this, Qt::Widget, QgsProviderRegistry::WidgetMode::Embedded ) );
146-
if ( !dlg )
147-
{
148-
QMessageBox::warning( this, providerName, tr( "Cannot get %1 select dialog from provider %2." ).arg( providerName, providerKey ) );
149-
return nullptr;
150-
}
151-
else
127+
mPageNames.append( providerKey );
128+
ui->mOptionsStackedWidget->addWidget( dlg );
129+
QListWidgetItem *layerItem = new QListWidgetItem( providerName, ui->mOptionsListWidget );
130+
layerItem->setToolTip( toolTip.isEmpty() ? tr( "Add %1 layer" ).arg( providerName ) : toolTip );
131+
layerItem->setIcon( icon );
132+
// Set crs and extent from canvas
133+
if ( mMapCanvas )
152134
{
153-
mPageNames.append( providerKey );
154-
ui->mOptionsStackedWidget->addWidget( dlg );
155-
QListWidgetItem *layerItem = new QListWidgetItem( providerName, ui->mOptionsListWidget );
156-
layerItem->setToolTip( title.isEmpty() ? tr( "Add %1 layer" ).arg( providerName ) : title );
157-
layerItem->setIcon( QgsApplication::getThemeIcon( icon ) );
158-
// Set crs and extent from canvas
159-
if ( mMapCanvas )
160-
{
161-
dlg->setMapCanvas( mMapCanvas );
162-
}
163-
connect( dlg, &QgsAbstractDataSourceWidget::rejected, this, &QgsDataSourceManagerDialog::reject );
164-
connect( dlg, &QgsAbstractDataSourceWidget::accepted, this, &QgsDataSourceManagerDialog::accept );
165-
makeConnections( dlg, providerKey );
166-
return dlg;
135+
dlg->setMapCanvas( mMapCanvas );
167136
}
137+
connect( dlg, &QgsAbstractDataSourceWidget::rejected, this, &QgsDataSourceManagerDialog::reject );
138+
connect( dlg, &QgsAbstractDataSourceWidget::accepted, this, &QgsDataSourceManagerDialog::accept );
139+
makeConnections( dlg, providerKey );
168140
}
169141

170142
void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *dlg, const QString &providerKey )

‎src/gui/qgsdatasourcemanagerdialog.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
114114
void providerDialogsRefreshRequested();
115115

116116
private:
117-
// Return the dialog from the provider
118-
QgsAbstractDataSourceWidget *providerDialog( const QString providerKey, const QString providerName, const QString icon, QString title = QString() );
117+
void addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QIcon &icon, QString toolTip = QString() );
119118
void makeConnections( QgsAbstractDataSourceWidget *dlg, const QString &providerKey );
120119
Ui::QgsDataSourceManagerDialog *ui;
121120
QgsBrowserDockWidget *mBrowserWidget = nullptr;

‎src/gui/qgssourceselectprovider.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#include "qgis_gui.h"
2121
#include "qgis.h"
22+
#include "qgsguiutils.h"
23+
#include "qgsproviderregistry.h"
2224
#include "qgsabstractdatasourcewidget.h"
2325

2426
class QString;
@@ -61,7 +63,7 @@ class GUI_EXPORT QgsSourceSelectProvider
6163
/** Create a new instance of QgsAbstractDataSourceWidget (or null).
6264
* Caller takes responsibility of deleting created.
6365
*/
64-
virtual QgsAbstractDataSourceWidget *createDataSourceWidget( QWidget *parent = nullptr ) const = 0 SIP_FACTORY;
66+
virtual QgsAbstractDataSourceWidget *createDataSourceWidget( QWidget *parent = nullptr, Qt::WindowFlags fl = Qt::Widget, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::Embedded ) const = 0 SIP_FACTORY;
6567

6668
};
6769

‎src/gui/qgssourceselectproviderregistry.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@ void QgsSourceSelectProviderRegistry::addProvider( QgsSourceSelectProvider *prov
4747
} );
4848
}
4949

50-
void QgsSourceSelectProviderRegistry::removeProvider( QgsSourceSelectProvider *provider )
50+
bool QgsSourceSelectProviderRegistry::removeProvider( QgsSourceSelectProvider *provider )
5151
{
5252
int index = mProviders.indexOf( provider );
5353
if ( index >= 0 )
54+
{
5455
delete mProviders.takeAt( index );
56+
return true;
57+
}
58+
return false;
5559
}
5660

5761
QgsSourceSelectProvider *QgsSourceSelectProviderRegistry::providerByName( const QString &name )

‎src/gui/qgssourceselectproviderregistry.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,17 @@ class GUI_EXPORT QgsSourceSelectProviderRegistry
4949
//! Get list of available providers
5050
QList< QgsSourceSelectProvider *> providers();
5151

52-
//! Add a provider implementation. Takes ownership of the object.
52+
//! Add a \a provider implementation. Takes ownership of the object.
5353
void addProvider( QgsSourceSelectProvider *provider SIP_TRANSFER );
5454

55-
//! Remove provider implementation from the list (provider object is deleted)
56-
void removeProvider( QgsSourceSelectProvider *provider );
55+
//! Remove \a provider implementation from the list (\a provider object is deleted)
56+
//! \returns true if the provider was actually removed and deleted
57+
bool removeProvider( QgsSourceSelectProvider *provider SIP_TRANSFER );
5758

58-
//! Return a provider by name or nullptr if not found
59+
//! Return a provider by \a name or nullptr if not found
5960
QgsSourceSelectProvider *providerByName( const QString &name );
6061

61-
//! Return a (possibly empty) list of providers by data provider's key
62+
//! Return a (possibly empty) list of providers by data \a providerkey
6263
QList<QgsSourceSelectProvider *> providersByKey( const QString &providerKey );
6364

6465

0 commit comments

Comments
 (0)