QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsdatasourcemanagerdialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsdatasourcemanagerdialog.cpp - datasource manager dialog
3 
4  ---------------------
5  begin : May 19, 2017
6  copyright : (C) 2017 by Alessandro Pasotti
7  email : apasotti at itopen dot it
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include <QListWidgetItem>
18 
20 #include "ui_qgsdatasourcemanagerdialog.h"
21 #include "qgsbrowserdockwidget.h"
22 #include "qgssettings.h"
23 #include "qgsproviderregistry.h"
27 #include "qgsmapcanvas.h"
28 #include "qgsmessagelog.h"
29 #include "qgsmessagebar.h"
30 #include "qgsgui.h"
31 
32 QgsDataSourceManagerDialog::QgsDataSourceManagerDialog( QgsBrowserModel *browserModel, QWidget *parent, QgsMapCanvas *canvas, Qt::WindowFlags fl )
33  : QgsOptionsDialogBase( QStringLiteral( "Data Source Manager" ), parent, fl )
34  , ui( new Ui::QgsDataSourceManagerDialog )
35  , mPreviousRow( -1 )
36  , mMapCanvas( canvas )
37 {
38  ui->setupUi( this );
39  ui->verticalLayout_2->setSpacing( 6 );
40  ui->verticalLayout_2->setMargin( 0 );
41  ui->verticalLayout_2->setContentsMargins( 0, 0, 0, 0 );
42 
43  mMessageBar = new QgsMessageBar( this );
44  mMessageBar->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed );
45  static_cast<QVBoxLayout *>( layout() )->insertWidget( 0, mMessageBar );
46 
47  // QgsOptionsDialogBase handles saving/restoring of geometry, splitter and current tab states,
48  // switching vertical tabs between icon/text to icon-only modes (splitter collapsed to left),
49  // and connecting QDialogButtonBox's accepted/rejected signals to dialog's accept/reject slots
50  initOptionsBase( false );
51 
52  // Bind list index to the stacked dialogs
53  connect( ui->mOptionsListWidget, &QListWidget::currentRowChanged, this, &QgsDataSourceManagerDialog::setCurrentPage );
54 
55  // BROWSER Add the browser widget to the first stacked widget page
56  mBrowserWidget = new QgsBrowserDockWidget( QStringLiteral( "Browser" ), browserModel, this );
57  mBrowserWidget->setFeatures( QDockWidget::NoDockWidgetFeatures );
58  ui->mOptionsStackedWidget->addWidget( mBrowserWidget );
59  mPageNames.append( QStringLiteral( "browser" ) );
60  // Forward all browser signals
62  connect( mBrowserWidget, &QgsBrowserDockWidget::openFile, this, &QgsDataSourceManagerDialog::openFile );
65 
66  // Add provider dialogs
67  const QList<QgsSourceSelectProvider *> sourceSelectProviders = QgsGui::sourceSelectProviderRegistry()->providers( );
68  for ( const auto &provider : sourceSelectProviders )
69  {
70  QgsAbstractDataSourceWidget *dlg = provider->createDataSourceWidget( this );
71  if ( !dlg )
72  {
73  QgsMessageLog::logMessage( tr( "Cannot get %1 select dialog from source select provider %2." ).arg( provider->name(), provider->providerKey() ), QStringLiteral( "DataSourceManager" ), Qgis::Critical );
74  continue;
75  }
76  addProviderDialog( dlg, provider->providerKey(), provider->text(), provider->icon( ), provider->toolTip( ) );
77  }
78 
79  restoreOptionsBaseUi( QStringLiteral( "Data Source Manager" ) );
80 }
81 
83 {
84  delete ui;
85 }
86 
87 void QgsDataSourceManagerDialog::openPage( const QString &pageName )
88 {
89  int pageIdx = mPageNames.indexOf( pageName );
90  if ( pageIdx != -1 )
91  {
92  QTimer::singleShot( 0, this, [ = ] { setCurrentPage( pageIdx ); } );
93  }
94 }
95 
97 {
98  return mMessageBar;
99 }
100 
102 {
103  mPreviousRow = ui->mOptionsStackedWidget->currentIndex();
104  ui->mOptionsStackedWidget->setCurrentIndex( index );
105  setWindowTitle( tr( "Data Source Manager | %1" ).arg( ui->mOptionsListWidget->currentItem()->text() ) );
106 }
107 
109 {
110  int prevPage = mPreviousRow != -1 ? mPreviousRow : 0;
111  setCurrentPage( prevPage );
112 }
113 
115 {
116  mBrowserWidget->refresh();
118 }
119 
120 void QgsDataSourceManagerDialog::rasterLayerAdded( const QString &uri, const QString &baseName, const QString &providerKey )
121 {
122  emit addRasterLayer( uri, baseName, providerKey );
123 }
124 
125 void QgsDataSourceManagerDialog::vectorLayerAdded( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey )
126 {
127  emit addVectorLayer( vectorLayerPath, baseName, providerKey );
128 }
129 
130 void QgsDataSourceManagerDialog::vectorLayersAdded( const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType )
131 {
132  emit addVectorLayers( layerQStringList, enc, dataSourceType );
133 }
134 
135 
136 void QgsDataSourceManagerDialog::addProviderDialog( QgsAbstractDataSourceWidget *dlg, const QString &providerKey, const QString &providerName, const QIcon &icon, const QString &toolTip )
137 {
138  mPageNames.append( providerKey );
139  ui->mOptionsStackedWidget->addWidget( dlg );
140  QListWidgetItem *layerItem = new QListWidgetItem( providerName, ui->mOptionsListWidget );
141  layerItem->setToolTip( toolTip.isEmpty() ? tr( "Add %1 layer" ).arg( providerName ) : toolTip );
142  layerItem->setIcon( icon );
143  // Set crs and extent from canvas
144  if ( mMapCanvas )
145  {
146  dlg->setMapCanvas( mMapCanvas );
147  }
148  connect( dlg, &QgsAbstractDataSourceWidget::rejected, this, &QgsDataSourceManagerDialog::reject );
149  connect( dlg, &QgsAbstractDataSourceWidget::accepted, this, &QgsDataSourceManagerDialog::accept );
150  makeConnections( dlg, providerKey );
151 }
152 
153 void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *dlg, const QString &providerKey )
154 {
155  // DB
156  connect( dlg, SIGNAL( addDatabaseLayers( QStringList const &, QString const & ) ),
157  this, SIGNAL( addDatabaseLayers( QStringList const &, QString const & ) ) );
158  connect( dlg, SIGNAL( progressMessage( QString ) ),
159  this, SIGNAL( showStatusMessage( QString ) ) );
160  // Vector
161  connect( dlg, &QgsAbstractDataSourceWidget::addVectorLayer, this, [ = ]( const QString & vectorLayerPath, const QString & baseName, const QString & specifiedProvider )
162  {
163  QString key = specifiedProvider.isEmpty() ? providerKey : specifiedProvider;
164  this->vectorLayerAdded( vectorLayerPath, baseName, key );
165  }
166  );
169  connect( dlg, SIGNAL( connectionsChanged() ), this, SIGNAL( connectionsChanged() ) );
170  // Raster
171  connect( dlg, SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ),
172  this, SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ) );
173  // Mesh
175 
176  // Virtual
177  connect( dlg, SIGNAL( replaceVectorLayer( QString, QString, QString, QString ) ),
178  this, SIGNAL( replaceSelectedVectorLayer( QString, QString, QString, QString ) ) );
179  // Common
180  connect( dlg, SIGNAL( connectionsChanged() ), this, SIGNAL( connectionsChanged() ) );
181  connect( this, SIGNAL( providerDialogsRefreshRequested() ), dlg, SLOT( refresh() ) );
182 }
183 
185 {
186  ui->mOptionsStackedWidget->currentWidget()->show();
188 }
void rasterLayerAdded(QString const &uri, QString const &baseName, QString const &providerKey)
A raster layer was added: for signal forwarding to QgisApp TODO: use this with an internal source sel...
void connectionsChanged()
Emitted when a connection has changed inside the provider dialogs This signal is normally forwarded t...
void showEvent(QShowEvent *event) override
Abstract base Data Source Widget to create connections and add layers This class provides common func...
QgsMessageBar * messageBar() const
Returns the dialog&#39;s message bar.
void refresh()
Refresh the browser view.
void initOptionsBase(bool restoreUi=true, const QString &title=QString())
Set up the base ui connections for vertical tabs.
QList< QgsSourceSelectProvider * > providers()
Gets list of available providers.
static QgsSourceSelectProviderRegistry * sourceSelectProviderRegistry()
Returns the global source select provider registry, used for managing all known source select widget ...
Definition: qgsgui.cpp:64
The QgsDataSourceManagerDialog class embeds the browser panel and all the provider dialogs...
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:45
void restoreOptionsBaseUi(const QString &title=QString())
Restore the base ui.
void addVectorLayer(const QString &vectorLayerPath, const QString &baseName, const QString &providerKey)
Emitted when a vector layer was selected for addition: for signal forwarding to QgisApp.
void providerDialogsRefreshRequested()
One or more provider connections have changed and the dialogs should be refreshed.
void setPreviousPage()
Reset current page to previously selected page.
void addMeshLayer(const QString &url, const QString &baseName, const QString &providerKey)
Emitted when a mesh layer has been selected for addition.
void handleDropUriList(const QgsMimeDataUtils::UriList &)
Emitted when drop uri list needs to be handled from the browser.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:73
void addMeshLayer(const QString &uri, const QString &baseName, const QString &providerKey)
Emitted when a mesh layer was selected for addition: for signal forwarding to QgisApp.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
void openPage(const QString &pageName)
Open a given page in the dialog.
void updateProjectHome()
Update project home directory.
void setMapCanvas(const QgsMapCanvas *mapCanvas)
Store a pointer to the map canvas to retrieve extent and CRS Used to select an appropriate CRS and po...
A base dialog for options and properties dialogs that offers vertical tabs.
void handleDropUriList(const QgsMimeDataUtils::UriList &)
Emitted when drop uri list needs to be handled.
void showEvent(QShowEvent *e) override
void addVectorLayer(const QString &uri, const QString &layerName, const QString &providerKey=QString())
Emitted when a vector layer has been selected for addition.
void addRasterLayer()
Emitted when the user wants to select a raster layer: for signal forwarding to QgisApp.
void vectorLayerAdded(const QString &vectorLayerPath, const QString &baseName, const QString &providerKey)
A vector layer was added: for signal forwarding to QgisApp.
The QgsBrowserDockWidget class.
void vectorLayersAdded(const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType)
One or more vector layer were added: for signal forwarding to QgisApp.
void replaceSelectedVectorLayer(const QString &oldId, const QString &uri, const QString &layerName, const QString &provider)
Replace the selected layer by a vector layer defined by uri, layer name, data source uri...
void updateProjectHome()
Update project home directory.
void showStatusMessage(const QString &message)
Emitted when a status message needs to be shown: for signal forwarding to QgisApp.
void addVectorLayers(const QStringList &layerList, const QString &encoding, const QString &dataSourceType)
Emitted when one or more OGR supported layers are selected for addition.
A model for showing available data sources and other items in a structured tree.
void openFile(const QString &fileName, const QString &fileTypeHint=QString())
Emitted when a file needs to be opened.
void openFile(const QString &fileName, const QString &fileTypeHint=QString())
Emitted when a file needs to be opened.
QgsDataSourceManagerDialog(QgsBrowserModel *browserModel, QWidget *parent=nullptr, QgsMapCanvas *canvas=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
QgsDataSourceManagerDialog constructor.
void connectionsChanged()
Connections changed in the browser.
void refresh()
Refresh browser view model (and view)
void addDatabaseLayers(const QStringList &layerPathList, const QString &providerKey)
Emitted when a DB layer was selected for addition: for signal forwarding to QgisApp.
void addVectorLayers(const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType)
Emitted when a one or more layer were selected for addition: for signal forwarding to QgisApp...
void setCurrentPage(int index)
Sync current page with the leftbar list.