Skip to content

Commit 8ff229e

Browse files
suricactusnyalldawson
authored andcommittedMay 17, 2020
Add the filename to the "Select Layers to Add.."
1 parent 6c5cb2e commit 8ff229e

File tree

7 files changed

+226
-95
lines changed

7 files changed

+226
-95
lines changed
 

‎python/gui/auto_generated/qgssublayersdialog.sip.in

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ class QgsSublayersDialog : QDialog
1616
%End
1717
public:
1818

19+
enum PromptMode
20+
{
21+
22+
PromptAlways,
23+
24+
PromptIfNeeded,
25+
26+
PromptNever,
27+
28+
PromptLoadAll
29+
};
30+
1931
enum ProviderType
2032
{
2133
Ogr,
@@ -35,12 +47,20 @@ class QgsSublayersDialog : QDialog
3547

3648
typedef QList<QgsSublayersDialog::LayerDefinition> LayerDefinitionList;
3749

50+
3851
QgsSublayersDialog( ProviderType providerType,
3952
const QString &name,
4053
QWidget *parent /TransferThis/ = 0,
41-
Qt::WindowFlags fl = 0 );
54+
Qt::WindowFlags fl = 0,
55+
const QString &providerSource = QString() );
4256
%Docstring
43-
Constructor for QgsSublayersDialog
57+
Construct a new QgsSublayersDialog object - a dialog to select which sub layers to be imported from a file (e.g. from geopackage or zipfile)
58+
59+
@param providerType provider type
60+
@param name provider type name
61+
@param parent parent widget of the dialog
62+
@param fl window flags
63+
@param providerSource full file name
4464
%End
4565

4666
~QgsSublayersDialog();
@@ -93,6 +113,7 @@ Returns column with count or -1
93113

94114
protected:
95115

116+
96117
};
97118

98119
/************************************************************************

‎src/app/qgisapp.cpp

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5603,7 +5603,7 @@ bool QgisApp::askUserForZipItemLayers( const QString &path )
56035603
QVector<QgsDataItem *> childItems;
56045604
QgsZipItem *zipItem = nullptr;
56055605
QgsSettings settings;
5606-
int promptLayers = settings.value( QStringLiteral( "qgis/promptForRasterSublayers" ), 1 ).toInt();
5606+
QgsSublayersDialog::PromptMode promptLayers = settings.enumValue( QStringLiteral( "qgis/promptForSublayers" ), QgsSublayersDialog::PromptAlways );
56075607

56085608
QgsDebugMsg( "askUserForZipItemLayers( " + path + ')' );
56095609

@@ -5628,20 +5628,20 @@ bool QgisApp::askUserForZipItemLayers( const QString &path )
56285628
}
56295629

56305630
// if promptLayers=Load all, load all layers without prompting
5631-
if ( promptLayers == 3 )
5631+
if ( promptLayers == QgsSublayersDialog::PromptLoadAll )
56325632
{
56335633
childItems = zipItem->children();
56345634
}
56355635
// exit if promptLayers=Never
5636-
else if ( promptLayers == 2 )
5636+
else if ( promptLayers == QgsSublayersDialog::PromptNever )
56375637
{
56385638
delete zipItem;
56395639
return false;
56405640
}
56415641
else
56425642
{
56435643
// We initialize a selection dialog and display it.
5644-
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Vsifile, QStringLiteral( "vsi" ), this );
5644+
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Vsifile, QStringLiteral( "vsi" ), this, nullptr, path );
56455645
QgsSublayersDialog::LayerDefinitionList layers;
56465646

56475647
for ( int i = 0; i < zipItem->children().size(); i++ )
@@ -5725,14 +5725,14 @@ QList< QgsMapLayer * > QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
57255725

57265726
// if promptLayers=Load all, load all sublayers without prompting
57275727
QgsSettings settings;
5728-
if ( settings.value( QStringLiteral( "qgis/promptForRasterSublayers" ), 1 ).toInt() == 3 )
5728+
if ( settings.enumValue( QStringLiteral( "qgis/promptForSublayers" ), QgsSublayersDialog::PromptAlways ) == QgsSublayersDialog::PromptLoadAll )
57295729
{
57305730
result.append( loadGDALSublayers( layer->source(), sublayers ) );
57315731
return result;
57325732
}
57335733

57345734
// We initialize a selection dialog and display it.
5735-
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Gdal, QStringLiteral( "gdal" ), this );
5735+
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Gdal, QStringLiteral( "gdal" ), this, nullptr, layer->dataProvider()->dataSourceUri() );
57365736
chooseSublayersDialog.setShowAddToGroupCheckbox( true );
57375737

57385738
QgsSublayersDialog::LayerDefinitionList layers;
@@ -5849,13 +5849,11 @@ bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
58495849
return false;
58505850

58515851
QgsSettings settings;
5852-
int promptLayers = settings.value( QStringLiteral( "qgis/promptForRasterSublayers" ), 1 ).toInt();
5853-
// 0 = Always -> always ask (if there are existing sublayers)
5854-
// 1 = If needed -> ask if layer has no bands, but has sublayers
5855-
// 2 = Never -> never prompt, will not load anything
5856-
// 3 = Load all -> never prompt, but load all sublayers
5852+
QgsSublayersDialog::PromptMode promptLayers = settings.enumValue( QStringLiteral( "qgis/promptForSublayers" ), QgsSublayersDialog::PromptAlways );
58575853

5858-
return promptLayers == 0 || promptLayers == 3 || ( promptLayers == 1 && layer->bandCount() == 0 );
5854+
return promptLayers == QgsSublayersDialog::PromptAlways ||
5855+
promptLayers == QgsSublayersDialog::PromptLoadAll ||
5856+
( promptLayers == QgsSublayersDialog::PromptIfNeeded && layer->bandCount() == 0 );
58595857
}
58605858

58615859
// This method will load with GDAL the layers in parameter.
@@ -5955,7 +5953,7 @@ QList<QgsMapLayer *> QgisApp::askUserForOGRSublayers( QgsVectorLayer *layer )
59555953
// Check if the current layer uri contains the
59565954

59575955
// We initialize a selection dialog and display it.
5958-
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Ogr, QStringLiteral( "ogr" ), this );
5956+
QgsSublayersDialog chooseSublayersDialog( QgsSublayersDialog::Ogr, QStringLiteral( "ogr" ), this, nullptr, layer->dataProvider()->dataSourceUri() );
59595957
chooseSublayersDialog.setShowAddToGroupCheckbox( true );
59605958
chooseSublayersDialog.populateLayerTable( list );
59615959

@@ -5992,10 +5990,9 @@ QList<QgsMapLayer *> QgisApp::askUserForOGRSublayers( QgsVectorLayer *layer )
59925990
}
59935991

59945992
QgsDebugMsg( "Creating new vector layer using " + composedURI );
5995-
QString name = fileName + " " + def.layerName;
59965993
QgsVectorLayer::LayerOptions options { QgsProject::instance()->transformContext() };
59975994
options.loadDefaultStyle = false;
5998-
QgsVectorLayer *layer = new QgsVectorLayer( composedURI, name, QStringLiteral( "ogr" ), options );
5995+
QgsVectorLayer *layer = new QgsVectorLayer( composedURI, def.layerName, QStringLiteral( "ogr" ), options );
59995996
if ( layer && layer->isValid() )
60005997
{
60015998
result << layer;

‎src/app/qgsoptions.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include "qgswelcomepage.h"
5959
#include "qgsnewsfeedparser.h"
6060
#include "qgsbearingnumericformat.h"
61+
#include "qgssublayersdialog.h"
6162

6263
#ifdef HAVE_OPENCL
6364
#include "qgsopenclutils.h"
@@ -419,17 +420,12 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
419420
spinBoxAttrTableRowCache->setValue( mSettings->value( QStringLiteral( "/qgis/attributeTableRowCache" ), 10000 ).toInt() );
420421
spinBoxAttrTableRowCache->setSpecialValueText( tr( "All" ) );
421422

422-
// set the prompt for raster sublayers
423-
// 0 = Always -> always ask (if there are existing sublayers)
424-
// 1 = If needed -> ask if layer has no bands, but has sublayers
425-
// 2 = Never -> never prompt, will not load anything
426-
// 3 = Load all -> never prompt, but load all sublayers
427-
cmbPromptRasterSublayers->clear();
428-
cmbPromptRasterSublayers->addItem( tr( "Always" ) );
429-
cmbPromptRasterSublayers->addItem( tr( "If needed" ) ); //this means, prompt if there are sublayers but no band in the main dataset
430-
cmbPromptRasterSublayers->addItem( tr( "Never" ) );
431-
cmbPromptRasterSublayers->addItem( tr( "Load all" ) );
432-
cmbPromptRasterSublayers->setCurrentIndex( mSettings->value( QStringLiteral( "/qgis/promptForRasterSublayers" ), 0 ).toInt() );
423+
cmbPromptSublayers->clear();
424+
cmbPromptSublayers->addItem( tr( "Always" ), QgsSublayersDialog::PromptAlways );
425+
cmbPromptSublayers->addItem( tr( "If needed" ), QgsSublayersDialog::PromptIfNeeded ); //this means, prompt if there are sublayers but no band in the main dataset
426+
cmbPromptSublayers->addItem( tr( "Never" ), QgsSublayersDialog::PromptNever );
427+
cmbPromptSublayers->addItem( tr( "Load all" ), QgsSublayersDialog::PromptLoadAll ); // check if this is true
428+
cmbPromptSublayers->setCurrentIndex( cmbPromptSublayers->findData( mSettings->enumValue( QStringLiteral( "/qgis/promptForSublayers" ), QgsSublayersDialog::PromptAlways ) ) );
433429

434430
// Scan for valid items in the browser dock
435431
cmbScanItemsInBrowser->clear();
@@ -1494,7 +1490,8 @@ void QgsOptions::saveOptions()
14941490
mSettings->setEnumValue( QStringLiteral( "/qgis/attributeTableBehavior" ), ( QgsAttributeTableFilterModel::FilterMode )cmbAttrTableBehavior->currentData().toInt() );
14951491
mSettings->setValue( QStringLiteral( "/qgis/attributeTableView" ), mAttrTableViewComboBox->currentData() );
14961492
mSettings->setValue( QStringLiteral( "/qgis/attributeTableRowCache" ), spinBoxAttrTableRowCache->value() );
1497-
mSettings->setValue( QStringLiteral( "/qgis/promptForRasterSublayers" ), cmbPromptRasterSublayers->currentIndex() );
1493+
mSettings->setEnumValue( QStringLiteral( "/qgis/promptForSublayers" ), ( QgsSublayersDialog::PromptMode )cmbPromptSublayers->currentData().toInt() );
1494+
14981495
mSettings->setValue( QStringLiteral( "/qgis/scanItemsInBrowser2" ),
14991496
cmbScanItemsInBrowser->currentData().toString() );
15001497
mSettings->setValue( QStringLiteral( "/qgis/scanZipInBrowser2" ),

‎src/gui/qgssublayersdialog.cpp

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "qgslogger.h"
1818
#include "qgssettings.h"
1919
#include "qgsgui.h"
20+
#include "qgsproviderregistry.h"
2021

2122
#include <QTableWidgetItem>
2223
#include <QPushButton>
@@ -42,50 +43,62 @@ class SubLayerItem : public QTreeWidgetItem
4243
};
4344
//! @endcond
4445

45-
QgsSublayersDialog::QgsSublayersDialog( ProviderType providerType, const QString &name,
46-
QWidget *parent, Qt::WindowFlags fl )
46+
QgsSublayersDialog::QgsSublayersDialog( ProviderType providerType,
47+
const QString &name,
48+
QWidget *parent,
49+
Qt::WindowFlags fl,
50+
const QString &providerSource )
4751
: QDialog( parent, fl )
4852
, mName( name )
4953
{
5054
setupUi( this );
5155
QgsGui::enableAutoGeometryRestore( this );
5256

57+
QString title;
5358
switch ( providerType )
5459
{
5560
case QgsSublayersDialog::Ogr :
56-
setWindowTitle( tr( "Select Vector Layers to Add…" ) );
61+
title = tr( "Select Vector Layers to Add…" );
5762
layersTable->setHeaderLabels( QStringList() << tr( "Layer ID" ) << tr( "Layer name" )
5863
<< tr( "Number of features" ) << tr( "Geometry type" ) << tr( "Description" ) );
5964
mShowCount = true;
6065
mShowType = true;
6166
mShowDescription = true;
6267
break;
6368
case QgsSublayersDialog::Gdal:
64-
setWindowTitle( tr( "Select Raster Layers to Add…" ) );
69+
title = tr( "Select Raster Layers to Add…" );
6570
layersTable->setHeaderLabels( QStringList() << tr( "Layer ID" ) << tr( "Layer name" ) );
6671
break;
6772
case QgsSublayersDialog::Mdal:
68-
setWindowTitle( tr( "Select Mesh Layers to Add…" ) );
73+
title = tr( "Select Mesh Layers to Add…" );
6974
layersTable->setHeaderLabels( QStringList() << tr( "Layer ID" ) << tr( "Mesh name" ) );
7075
break;
7176
default:
72-
setWindowTitle( tr( "Select Layers to Add…" ) );
77+
title = tr( "Select Layers to Add…" );
7378
layersTable->setHeaderLabels( QStringList() << tr( "Layer ID" ) << tr( "Layer name" )
7479
<< tr( "Type" ) );
7580
mShowType = true;
76-
break;
7781
}
7882

83+
QString fileFullPath = providerType == QgsSublayersDialog::Vsifile
84+
? providerSource
85+
: QgsProviderRegistry::instance()->decodeUri( name, providerSource )
86+
.value( QStringLiteral( "path" ) )
87+
.toString();
88+
QString filename = QFileInfo( fileFullPath ).fileName();
89+
90+
setWindowTitle( filename.isEmpty() ? title : QStringLiteral( "%1 | %2" ).arg( title, filename ) );
91+
txtFilePath->setText( QDir::toNativeSeparators( QFileInfo( fileFullPath ).canonicalFilePath() ) );
92+
93+
if ( filename.isEmpty() )
94+
txtFilePath->setVisible( false );
95+
7996
// add a "Select All" button - would be nicer with an icon
80-
QPushButton *button = new QPushButton( tr( "Select All" ) );
81-
buttonBox->addButton( button, QDialogButtonBox::ActionRole );
82-
connect( button, &QAbstractButton::pressed, layersTable, &QTreeView::selectAll );
83-
// connect( pbnSelectNone, SIGNAL( pressed() ), SLOT( layersTable->selectNone() ) );
97+
connect( btnSelectAll, &QAbstractButton::pressed, layersTable, &QTreeView::selectAll );
98+
connect( btnDeselectAll, &QAbstractButton::pressed, this, &QgsSublayersDialog::btnDeselectAll_pressed );
99+
connect( layersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsSublayersDialog::layersTable_selectionChanged );
84100

85-
// Checkbox about adding sublayers to a group
86-
mCheckboxAddToGroup = new QCheckBox( tr( "Add layers to a group" ), this );
87-
buttonBox->addButton( mCheckboxAddToGroup, QDialogButtonBox::ActionRole );
88-
mCheckboxAddToGroup->setVisible( false );
101+
mCbxAddToGroup->setVisible( false );
89102
}
90103

91104
QgsSublayersDialog::~QgsSublayersDialog()
@@ -172,27 +185,23 @@ void QgsSublayersDialog::populateLayerTable( const QgsSublayersDialog::LayerDefi
172185
int QgsSublayersDialog::exec()
173186
{
174187
QgsSettings settings;
175-
QString promptLayers = settings.value( QStringLiteral( "qgis/promptForSublayers" ), 1 ).toString();
188+
PromptMode promptLayers = settings.enumValue( QStringLiteral( "qgis/promptForSublayers" ), PromptAlways );
176189

177190
// make sure three are sublayers to choose
178191
if ( layersTable->topLevelItemCount() == 0 )
179192
return QDialog::Rejected;
180193

194+
layersTable->selectAll();
195+
181196
// check promptForSublayers settings - perhaps this should be in QgsDataSource instead?
182-
if ( promptLayers == QLatin1String( "no" ) )
197+
if ( promptLayers == PromptNever )
183198
return QDialog::Rejected;
184-
else if ( promptLayers == QLatin1String( "all" ) )
185-
{
186-
layersTable->selectAll();
199+
else if ( promptLayers == PromptLoadAll )
187200
return QDialog::Accepted;
188-
}
189201

190202
// if there is only 1 sublayer (probably the main layer), just select that one and return
191203
if ( layersTable->topLevelItemCount() == 1 )
192-
{
193-
layersTable->selectAll();
194204
return QDialog::Accepted;
195-
}
196205

197206
layersTable->sortByColumn( 1, Qt::AscendingOrder );
198207
layersTable->setSortingEnabled( true );
@@ -210,16 +219,26 @@ int QgsSublayersDialog::exec()
210219
// Checkbox about adding sublayers to a group
211220
if ( mShowAddToGroupCheckbox )
212221
{
213-
mCheckboxAddToGroup->setVisible( true );
222+
mCbxAddToGroup->setVisible( true );
214223
bool addToGroup = settings.value( QStringLiteral( "/qgis/openSublayersInGroup" ), false ).toBool();
215-
mCheckboxAddToGroup->setChecked( addToGroup );
224+
mCbxAddToGroup->setChecked( addToGroup );
216225
}
217226

218227
int ret = QDialog::exec();
219228
if ( overrideCursor )
220229
QApplication::setOverrideCursor( cursor );
221230

222231
if ( mShowAddToGroupCheckbox )
223-
settings.setValue( QStringLiteral( "/qgis/openSublayersInGroup" ), mCheckboxAddToGroup->isChecked() );
232+
settings.setValue( QStringLiteral( "/qgis/openSublayersInGroup" ), mCbxAddToGroup->isChecked() );
224233
return ret;
225234
}
235+
236+
void QgsSublayersDialog::layersTable_selectionChanged( const QItemSelection &, const QItemSelection & )
237+
{
238+
buttonBox->button( QDialogButtonBox::Ok )->setEnabled( layersTable->selectedItems().length() > 0 );
239+
}
240+
241+
void QgsSublayersDialog::btnDeselectAll_pressed()
242+
{
243+
layersTable->selectionModel()->clear();
244+
}

0 commit comments

Comments
 (0)
Please sign in to comment.