Skip to content

Commit

Permalink
Merge pull request #30927 from m-kuhn/source_select_reset
Browse files Browse the repository at this point in the history
 Reset selection when data source select dialog is reopened
  • Loading branch information
m-kuhn committed Jul 26, 2019
2 parents 52373e2 + fa847d1 commit c08b757
Show file tree
Hide file tree
Showing 22 changed files with 148 additions and 62 deletions.
11 changes: 11 additions & 0 deletions python/gui/auto_generated/qgsabstractdatasourcewidget.sip.in
Expand Up @@ -48,6 +48,17 @@ The default implementation does nothing
Triggered when the add button is clicked, the add layer signal is emitted
Concrete classes should implement the right behavior depending on the layer
being added.
%End

virtual void reset();
%Docstring
Called when this source select widget is being shown in a "new and clean" dialog.

The data source manager recycles existing source select widgets but will call
this method on every reopening.
This should clear any selection that has previously been done.

.. versionadded:: 3.10
%End

signals:
Expand Down
5 changes: 3 additions & 2 deletions python/gui/auto_generated/qgsowssourceselect.sip.in
Expand Up @@ -38,14 +38,15 @@ layers from the WCS server to the map canvas.
Constructor
%End

public slots:

virtual void refresh();

%Docstring
Triggered when the provider's connections need to be refreshed
%End

virtual void reset();


protected slots:
void showError( const QString &title, const QString &format, const QString &error );
%Docstring
Expand Down
4 changes: 4 additions & 0 deletions src/app/qgisapp.cpp
Expand Up @@ -1892,6 +1892,10 @@ void QgisApp::dataSourceManager( const QString &pageName )
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::openFile, this, &QgisApp::openFile );

}
else
{
mDataSourceManagerDialog->reset();
}
// Try to open the dialog on a particular page
if ( ! pageName.isEmpty() )
{
Expand Down
8 changes: 8 additions & 0 deletions src/gui/qgsabstractdatasourcewidget.cpp
Expand Up @@ -61,3 +61,11 @@ void QgsAbstractDataSourceWidget::setMapCanvas( const QgsMapCanvas *mapCanvas )
mMapCanvas = mapCanvas;
}

void QgsAbstractDataSourceWidget::addButtonClicked()
{
}

void QgsAbstractDataSourceWidget::reset()
{
}

13 changes: 12 additions & 1 deletion src/gui/qgsabstractdatasourcewidget.h
Expand Up @@ -65,7 +65,18 @@ class GUI_EXPORT QgsAbstractDataSourceWidget : public QDialog
* Concrete classes should implement the right behavior depending on the layer
* being added.
*/
virtual void addButtonClicked() { }
virtual void addButtonClicked();

/**
* Called when this source select widget is being shown in a "new and clean" dialog.
*
* The data source manager recycles existing source select widgets but will call
* this method on every reopening.
* This should clear any selection that has previously been done.
*
* \since QGIS 3.10
*/
virtual void reset();

signals:

Expand Down
13 changes: 13 additions & 0 deletions src/gui/qgsdatasourcemanagerdialog.cpp
Expand Up @@ -118,6 +118,19 @@ void QgsDataSourceManagerDialog::refresh()
emit providerDialogsRefreshRequested();
}

void QgsDataSourceManagerDialog::reset()
{
int pageCount = ui->mOptionsStackedWidget->count();
for ( int i = 0; i < pageCount; ++i )
{
QWidget *widget = ui->mOptionsStackedWidget->widget( i );
QgsAbstractDataSourceWidget *dataSourceWidget = qobject_cast<QgsAbstractDataSourceWidget *>( widget );
if ( dataSourceWidget )
dataSourceWidget->reset();
}

}

void QgsDataSourceManagerDialog::rasterLayerAdded( const QString &uri, const QString &baseName, const QString &providerKey )
{
emit addRasterLayer( uri, baseName, providerKey );
Expand Down
12 changes: 11 additions & 1 deletion src/gui/qgsdatasourcemanagerdialog.h
Expand Up @@ -75,9 +75,10 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
//! Sync current page with the leftbar list
void setCurrentPage( int index );

// TODO: use this with an internal source select dialog instead of forwarding the whole raster selection to app

/**
* A raster layer was added: for signal forwarding to QgisApp
* TODO: use this with an internal source select dialog instead of forwarding the whole raster selection to app
*/
void rasterLayerAdded( QString const &uri, QString const &baseName, QString const &providerKey );
//! A vector layer was added: for signal forwarding to QgisApp
Expand All @@ -89,6 +90,15 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
//! Refresh the browser view
void refresh();

/**
* Resets the interface of the datasource manager after reopening the dialog.
*
* Will clear the selection of embedded all source selection widgets.
*
* \since QGIS 3.10
*/
void reset();

protected:
void showEvent( QShowEvent *event ) override;

Expand Down
5 changes: 5 additions & 0 deletions src/gui/qgsowssourceselect.cpp
Expand Up @@ -124,6 +124,11 @@ void QgsOWSSourceSelect::refresh()
populateConnectionList();
}

void QgsOWSSourceSelect::reset()
{
mLayersTreeWidget->clearSelection();
}

void QgsOWSSourceSelect::clearFormats()
{
mFormatComboBox->clear();
Expand Down
4 changes: 2 additions & 2 deletions src/gui/qgsowssourceselect.h
Expand Up @@ -63,11 +63,11 @@ class GUI_EXPORT QgsOWSSourceSelect : public QgsAbstractDataSourceWidget, protec
//! Constructor
QgsOWSSourceSelect( const QString &service, QWidget *parent SIP_TRANSFERTHIS = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None );

public slots:

//! Triggered when the provider's connections need to be refreshed
void refresh() override;

void reset() override;

protected slots:
//! show whatever error is exposed.
void showError( const QString &title, const QString &format, const QString &error );
Expand Down
23 changes: 9 additions & 14 deletions src/providers/delimitedtext/qgsdelimitedtextsourceselect.cpp
Expand Up @@ -36,8 +36,8 @@ const int MAX_SAMPLE_LENGTH = 200;

QgsDelimitedTextSourceSelect::QgsDelimitedTextSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
: QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
, mFile( new QgsDelimitedTextFile() )
, mPluginKey( QStringLiteral( "/Plugin-DelimitedText" ) )
, mFile( qgis::make_unique<QgsDelimitedTextFile>() )
, mSettingsKey( QStringLiteral( "/Plugin-DelimitedText" ) )
{

setupUi( this );
Expand Down Expand Up @@ -95,14 +95,9 @@ QgsDelimitedTextSourceSelect::QgsDelimitedTextSourceSelect( QWidget *parent, Qt:

QgsSettings settings;
mFileWidget->setDialogTitle( tr( "Choose a Delimited Text File to Open" ) );
mFileWidget->setFilter( tr( "Text files" ) + " (*.txt *.csv *.dat *.wkt);;" + tr( "All files" ) + " (* *.*)" );
mFileWidget->setSelectedFilter( settings.value( mPluginKey + "/file_filter", "" ).toString() );
connect( mFileWidget, &QgsFileWidget::fileChanged, this, [ = ]() { updateFileName(); } );
}

QgsDelimitedTextSourceSelect::~QgsDelimitedTextSourceSelect()
{
delete mFile;
mFileWidget->setFilter( tr( "Text files" ) + QStringLiteral( " (*.txt *.csv *.dat *.wkt);;" ) + tr( "All files" ) + QStringLiteral( " (* *.*)" ) );
mFileWidget->setSelectedFilter( settings.value( mSettingsKey + QStringLiteral( "/file_filter" ), QString() ).toString() );
connect( mFileWidget, &QgsFileWidget::fileChanged, this, &QgsDelimitedTextSourceSelect::updateFileName );
}

void QgsDelimitedTextSourceSelect::addButtonClicked()
Expand Down Expand Up @@ -256,7 +251,7 @@ void QgsDelimitedTextSourceSelect::loadSettings( const QString &subkey, bool loa

// at startup, fetch the last used delimiter and directory from
// settings
QString key = mPluginKey;
QString key = mSettingsKey;
if ( ! subkey.isEmpty() ) key.append( '/' ).append( subkey );

// and how to use the delimiter
Expand Down Expand Up @@ -317,7 +312,7 @@ void QgsDelimitedTextSourceSelect::loadSettings( const QString &subkey, bool loa
void QgsDelimitedTextSourceSelect::saveSettings( const QString &subkey, bool saveGeomSettings )
{
QgsSettings settings;
QString key = mPluginKey;
QString key = mSettingsKey;
if ( ! subkey.isEmpty() ) key.append( '/' ).append( subkey );
settings.setValue( key + "/encoding", cmbEncoding->currentText() );
settings.setValue( key + "/geometry", saveGeometry() );
Expand Down Expand Up @@ -649,15 +644,15 @@ bool QgsDelimitedTextSourceSelect::trySetXYField( QStringList &fields, QList<boo
void QgsDelimitedTextSourceSelect::updateFileName()
{
QgsSettings settings;
settings.setValue( mPluginKey + "/file_filter", mFileWidget->selectedFilter() );
settings.setValue( mSettingsKey + "/file_filter", mFileWidget->selectedFilter() );

// put a default layer name in the text entry
QString filename = mFileWidget->filePath();
QFileInfo finfo( filename );
if ( finfo.exists() )
{
QgsSettings settings;
settings.setValue( mPluginKey + "/text_path", finfo.path() );
settings.setValue( mSettingsKey + "/text_path", finfo.path() );
}

txtLayerName->setText( finfo.completeBaseName() );
Expand Down
9 changes: 3 additions & 6 deletions src/providers/delimitedtext/qgsdelimitedtextsourceselect.h
Expand Up @@ -20,10 +20,10 @@
#include "qgsguiutils.h"
#include "qgsproviderregistry.h"
#include "qgsabstractdatasourcewidget.h"
#include "qgsdelimitedtextfile.h"

class QButtonGroup;
class QgisInterface;
class QgsDelimitedTextFile;

/**
* \class QgsDelimitedTextSourceSelect
Expand All @@ -34,9 +34,6 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private

public:
QgsDelimitedTextSourceSelect( QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None );
~QgsDelimitedTextSourceSelect() override;

QStringList splitLine( QString line );

private:
bool loadDelimitedFileDefinition();
Expand All @@ -50,10 +47,10 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private
bool trySetXYField( QStringList &fields, QList<bool> &isValidNumber, const QString &xname, const QString &yname );

private:
QgsDelimitedTextFile *mFile = nullptr;
std::unique_ptr<QgsDelimitedTextFile> mFile;
int mExampleRowCount = 20;
int mBadRowCount = 0;
QString mPluginKey;
QString mSettingsKey;
QString mLastFileType;
QButtonGroup *bgFileFormat = nullptr;
QButtonGroup *bgGeomType = nullptr;
Expand Down
5 changes: 5 additions & 0 deletions src/providers/geonode/qgsgeonodesourceselect.cpp
Expand Up @@ -77,6 +77,11 @@ QgsGeoNodeSourceSelect::~QgsGeoNodeSourceSelect()
emit abortRequests();
}

void QgsGeoNodeSourceSelect::reset()
{
treeView->clearSelection();
}

void QgsGeoNodeSourceSelect::addConnectionsEntryList()
{
QgsGeoNodeNewConnection nc( this );
Expand Down
4 changes: 3 additions & 1 deletion src/providers/geonode/qgsgeonodesourceselect.h
Expand Up @@ -45,7 +45,9 @@ class QgsGeoNodeSourceSelect: public QgsAbstractDataSourceWidget, private Ui::Qg
QgsGeoNodeSourceSelect( QWidget *parent SIP_TRANSFERTHIS = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None );
~QgsGeoNodeSourceSelect() override;

public slots:
void reset() override;

private:

void addButtonClicked() override;

Expand Down
5 changes: 5 additions & 0 deletions src/providers/mssql/qgsmssqlsourceselect.cpp
Expand Up @@ -652,6 +652,11 @@ QString QgsMssqlSourceSelect::connectionInfo()
return mConnInfo;
}

void QgsMssqlSourceSelect::reset()
{
mTablesTreeView->clearSelection();
}

void QgsMssqlSourceSelect::refresh()
{
populateConnectionList();
Expand Down
2 changes: 2 additions & 0 deletions src/providers/mssql/qgsmssqlsourceselect.h
Expand Up @@ -79,6 +79,8 @@ class QgsMssqlSourceSelect : public QgsAbstractDataSourceWidget, private Ui::Qgs
//! Connection info (database, host, user, password)
QString connectionInfo();

void reset() override;

signals:
void addGeometryColumn( const QgsMssqlLayerProperty & );

Expand Down
27 changes: 15 additions & 12 deletions src/providers/postgres/qgspgsourceselect.cpp
Expand Up @@ -57,15 +57,14 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
if ( index.column() == QgsPgTableModel::DbtmType && index.data( Qt::UserRole + 1 ).toBool() )
{
QComboBox *cb = new QComboBox( parent );
Q_FOREACH ( QgsWkbTypes::Type type,
QList<QgsWkbTypes::Type>()
<< QgsWkbTypes::Point
<< QgsWkbTypes::LineString
<< QgsWkbTypes::Polygon
<< QgsWkbTypes::MultiPoint
<< QgsWkbTypes::MultiLineString
<< QgsWkbTypes::MultiPolygon
<< QgsWkbTypes::NoGeometry )
static const QList<QgsWkbTypes::Type> types { QgsWkbTypes::Point
, QgsWkbTypes::LineString
, QgsWkbTypes::Polygon
, QgsWkbTypes::MultiPoint
, QgsWkbTypes::MultiLineString
, QgsWkbTypes::MultiPolygon
, QgsWkbTypes::NoGeometry };
for ( QgsWkbTypes::Type type : types )
{
cb->addItem( QgsPgTableModel::iconForWkbType( type ), QgsPostgresConn::displayStringForWkbType( type ), type );
}
Expand All @@ -74,7 +73,7 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO

if ( index.column() == QgsPgTableModel::DbtmPkCol )
{
QStringList values = index.data( Qt::UserRole + 1 ).toStringList();
const QStringList values = index.data( Qt::UserRole + 1 ).toStringList();

if ( !values.isEmpty() )
{
Expand All @@ -84,8 +83,7 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
QStandardItemModel *model = new QStandardItemModel( values.size(), 1, cb );

int row = 0;
const auto constValues = values;
for ( const QString &value : constValues )
for ( const QString &value : values )
{
QStandardItem *item = new QStandardItem( value );
item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
Expand Down Expand Up @@ -585,6 +583,11 @@ void QgsPgSourceSelect::columnThreadFinished()
finishList();
}

void QgsPgSourceSelect::reset()
{
mTablesTreeView->clearSelection();
}

QStringList QgsPgSourceSelect::selectedTables()
{
return mSelectedTables;
Expand Down
2 changes: 2 additions & 0 deletions src/providers/postgres/qgspgsourceselect.h
Expand Up @@ -122,6 +122,8 @@ class QgsPgSourceSelect : public QgsAbstractDataSourceWidget, private Ui::QgsDbS

void columnThreadFinished();

void reset() override;

private:
typedef QPair<QString, QString> geomPair;
typedef QList<geomPair> geomCol;
Expand Down
5 changes: 5 additions & 0 deletions src/providers/wfs/qgswfssourceselect.cpp
Expand Up @@ -126,6 +126,11 @@ QgsWFSSourceSelect::~QgsWFSSourceSelect()
delete mBuildQueryButton;
}

void QgsWFSSourceSelect::reset()
{
treeView->clearSelection();
}

void QgsWFSSourceSelect::populateConnectionList()
{
QStringList keys = QgsWfsConnection::connectionList();
Expand Down
2 changes: 2 additions & 0 deletions src/providers/wfs/qgswfssourceselect.h
Expand Up @@ -67,6 +67,8 @@ class QgsWFSSourceSelect: public QgsAbstractDataSourceWidget, private Ui::QgsWFS
QgsWFSSourceSelect( QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None );
~QgsWFSSourceSelect() override;

void reset() override;

private:
QgsWFSSourceSelect(); //default constructor is forbidden
QgsProjectionSelectionDialog *mProjectionSelector = nullptr;
Expand Down
4 changes: 2 additions & 2 deletions src/providers/wms/qgswmsprovider.cpp
Expand Up @@ -956,9 +956,9 @@ QUrl QgsWmsProvider::createRequestUrlWMS( const QgsRectangle &viewExtent, int pi
++it2;
}

QString layers = visibleLayers.join( QStringLiteral( "," ) );
QString layers = visibleLayers.join( ',' );
layers = layers.isNull() ? QString() : layers;
QString styles = visibleStyles.join( QStringLiteral( "," ) );
QString styles = visibleStyles.join( ',' );
styles = styles.isNull() ? QString() : styles;

QgsDebugMsg( "Visible layer list of " + layers + " and style list of " + styles );
Expand Down

0 comments on commit c08b757

Please sign in to comment.