Skip to content

Commit 73afb0f

Browse files
committed
apply #5041 (slighly modified)
1 parent 4c0dd44 commit 73afb0f

9 files changed

+189
-66
lines changed

src/app/ogr/qgsogrsublayersdialog.cpp

+12-12
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,10 @@ QgsOGRSublayersDialog::QgsOGRSublayersDialog( QWidget* parent, Qt::WFlags fl )
2424
{
2525
setupUi( this );
2626

27+
layersTable->setHeaderLabels( QStringList() << tr( "Layer ID" ) << tr( "Layer name" ) << tr( "Nb of features" ) << tr( "Geometry type" ) );
28+
2729
QSettings settings;
2830
restoreGeometry( settings.value( "/Windows/OGRSubLayers/geometry" ).toByteArray() );
29-
30-
QStringList labels = QStringList() << tr( "Layer ID" ) << tr( "Layer name" ) << tr( "Nb of features" ) << tr( "Geometry type" );
31-
layersTable->setHeaderLabels( labels );
3231
}
3332

3433
QgsOGRSublayersDialog::~QgsOGRSublayersDialog()
@@ -39,23 +38,24 @@ QgsOGRSublayersDialog::~QgsOGRSublayersDialog()
3938

4039
QStringList QgsOGRSublayersDialog::getSelection()
4140
{
42-
QStringList list = QStringList();
41+
QStringList list;
4342
for ( int i = 0; i < layersTable->selectedItems().size(); i++ )
4443
{
45-
QString theItem = layersTable->selectedItems().at( i )->text( 1 );
46-
list.append( theItem );
44+
list << layersTable->selectedItems().at( i )->text( 1 );
4745
}
4846
return list;
4947
}
5048

5149
void QgsOGRSublayersDialog::populateLayerTable( QStringList theList, QString delim )
5250
{
53-
for ( int i = 0; i < theList.size(); i++ )
51+
foreach( QString item, theList )
5452
{
55-
QString line = theList.at( i );
56-
QStringList elements = line.split( delim );
57-
QStringList item = QStringList();
58-
item << elements.at( 0 ) << elements.at( 1 ) << elements.at( 2 ) << elements.at( 3 );
59-
layersTable->addTopLevelItem( new QTreeWidgetItem( item ) );
53+
layersTable->addTopLevelItem( new QTreeWidgetItem( item.split( delim ) ) );
6054
}
55+
56+
// resize columns
57+
for ( int i = 0; i < layersTable->columnCount(); i++ )
58+
layersTable->resizeColumnToContents( i );
59+
60+
layersTable->setColumnWidth( 1, layersTable->columnWidth( 1 ) + 10 );
6161
}

src/app/qgisapp.cpp

+46-8
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
#include "ogr/qgsopenvectorlayerdialog.h"
178178
#include "ogr/qgsvectorlayersaveasdialog.h"
179179
//
180-
// Gdal/Ogr includes
180+
// GDAL/OGR includes
181181
//
182182
#include <ogr_api.h>
183183

@@ -2135,7 +2135,6 @@ void QgisApp::addVectorLayer()
21352135

21362136
bool QgisApp::addVectorLayers( QStringList const & theLayerQStringList, const QString& enc, const QString dataSourceType )
21372137
{
2138-
21392138
foreach( QString src, theLayerQStringList )
21402139
{
21412140
src = src.trimmed();
@@ -2270,11 +2269,27 @@ void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
22702269
}
22712270
}
22722271

2272+
bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
2273+
{
2274+
// return false if layer is empty or raster has no sublayers
2275+
if ( !layer || layer->subLayers().size() < 1 )
2276+
return false;
2277+
2278+
QSettings settings;
2279+
int promptLayers = settings.value( "/qgis/promptForRasterSublayers", "if_need" ).toInt();
2280+
// 0 = always -> always ask (if there are existing sublayers)
2281+
// 1 = if needed -> ask if layer has no bands, but has sublayers
2282+
// 2 = never
2283+
2284+
return promptLayers == 0 || ( promptLayers == 1 && layer->bandCount() == 0 );
2285+
}
2286+
2287+
22732288
// This method is the method that does the real job. If the layer given in
22742289
// parameter is NULL, then the method tries to act on the activeLayer.
22752290
void QgisApp::askUserForOGRSublayers( QgsVectorLayer *layer )
22762291
{
2277-
if ( layer == NULL )
2292+
if ( !layer )
22782293
{
22792294
layer = qobject_cast<QgsVectorLayer *>( activeLayer() );
22802295
if ( !layer || layer->dataProvider()->name() != "ogr" )
@@ -6472,7 +6487,24 @@ QgsRasterLayer* QgisApp::addRasterLayer( QString const & rasterFile, QString con
64726487
QgsRasterLayer *layer =
64736488
new QgsRasterLayer( rasterFile, baseName ); // fi.completeBaseName());
64746489

6475-
if ( !addRasterLayer( layer ) )
6490+
bool ok = false;
6491+
6492+
if ( shouldAskUserForGDALSublayers( layer ) )
6493+
{
6494+
askUserForGDALSublayers( layer );
6495+
ok = true;
6496+
6497+
// The first layer loaded is not useful in that case. The user can select it in
6498+
// the list if he wants to load it.
6499+
delete layer;
6500+
layer = 0;
6501+
}
6502+
else
6503+
{
6504+
ok = addRasterLayer( layer );
6505+
}
6506+
6507+
if ( !ok )
64766508
{
64776509
mMapCanvas->freeze( false );
64786510
QApplication::restoreOverrideCursor();
@@ -6556,7 +6588,15 @@ QgsRasterLayer* QgisApp::addRasterLayer(
65566588

65576589
QgsDebugMsg( "Constructed new layer." );
65586590

6559-
if ( layer && layer->isValid() )
6591+
if ( layer && shouldAskUserForGDALSublayers( layer ) )
6592+
{
6593+
askUserForGDALSublayers( layer );
6594+
6595+
// The first layer loaded is not useful in that case. The user can select it in
6596+
// the list if he wants to load it.
6597+
delete layer;
6598+
}
6599+
else if ( layer && layer->isValid() )
65606600
{
65616601
addRasterLayer( layer );
65626602

@@ -6582,7 +6622,6 @@ QgsRasterLayer* QgisApp::addRasterLayer(
65826622
} // QgisApp::addRasterLayer
65836623

65846624

6585-
65866625
//create a raster layer object and delegate to addRasterLayer(QgsRasterLayer *)
65876626
bool QgisApp::addRasterLayers( QStringList const &theFileNameQStringList, bool guiWarning )
65886627
{
@@ -6627,9 +6666,8 @@ bool QgisApp::addRasterLayers( QStringList const &theFileNameQStringList, bool g
66276666

66286667
// create the layer
66296668
QgsRasterLayer *layer = new QgsRasterLayer( *myIterator, myBaseNameQString );
6630-
QStringList sublayers = layer->subLayers();
66316669

6632-
if ( sublayers.size() > 0 )
6670+
if ( shouldAskUserForGDALSublayers( layer ) )
66336671
{
66346672
askUserForGDALSublayers( layer );
66356673

src/app/qgisapp.h

+1
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
877877
private:
878878
/** This method will open a dialog so the user can select the sublayers to load
879879
*/
880+
bool shouldAskUserForGDALSublayers( QgsRasterLayer *layer );
880881
void askUserForOGRSublayers( QgsVectorLayer *layer );
881882
void askUserForGDALSublayers( QgsRasterLayer *layer );
882883
/** Add a raster layer to the map (passed in as a ptr).

src/app/qgsbrowserdockwidget.cpp

+2-12
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void QgsBrowserDockWidget::itemClicked( const QModelIndex& index )
129129
QgsMapLayer* layer = NULL;
130130
if ( type == QgsMapLayer::VectorLayer )
131131
{
132-
layer = new QgsVectorLayer( uri, layerItem->name(), providerKey );
132+
layer = QgisApp::instance()->addVectorLayer( uri, layerItem->name(), providerKey );
133133
}
134134
if ( type == QgsMapLayer::RasterLayer )
135135
{
@@ -159,18 +159,8 @@ void QgsBrowserDockWidget::itemClicked( const QModelIndex& index )
159159
QgsDebugMsg( "rasterLayerPath = " + rasterLayerPath );
160160
QgsDebugMsg( "layers = " + layers.join( " " ) );
161161

162-
layer = new QgsRasterLayer( 0, rasterLayerPath, layerItem->name(), providerKey, layers, styles, format, crs );
162+
layer = QgisApp::instance()->addRasterLayer( rasterLayerPath, layerItem->name(), providerKey, layers, styles, format, crs );
163163
}
164-
165-
if ( !layer || !layer->isValid() )
166-
{
167-
qDebug( "No layer" );
168-
delete layer;
169-
return;
170-
}
171-
172-
// add layer to the application
173-
QgsMapLayerRegistry::instance()->addMapLayer( layer );
174164
}
175165

176166
void QgsBrowserDockWidget::showContextMenu( const QPoint & pt )

src/app/qgsoptions.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
184184

185185
spinBoxAttrTableRowCache->setValue( settings.value( "/qgis/attributeTableRowCache", 10000 ).toInt() );
186186

187+
// set the prompt for raster sublayers
188+
cmbPromptRasterSublayers->clear();
189+
cmbPromptRasterSublayers->addItem( tr( "Always" ) );
190+
cmbPromptRasterSublayers->addItem( tr( "If needed" ) ); //this means, prompt if there are sublayers but no band in the main dataset
191+
cmbPromptRasterSublayers->addItem( tr( "Never" ) );
192+
cmbPromptRasterSublayers->setCurrentIndex( settings.value( "/qgis/promptForRasterSublayers", 0 ).toInt() );
193+
187194
// set the display update threshold
188195
spinBoxUpdateThreshold->setValue( settings.value( "/Map/updateThreshold" ).toInt() );
189196
//set the default projection behaviour radio buttongs
@@ -600,6 +607,7 @@ void QgsOptions::saveOptions()
600607
settings.setValue( "/qgis/dockAttributeTable", cbxAttributeTableDocked->isChecked() );
601608
settings.setValue( "/qgis/attributeTableBehaviour", cmbAttrTableBehaviour->currentIndex() );
602609
settings.setValue( "/qgis/attributeTableRowCache", spinBoxAttrTableRowCache->value() );
610+
settings.setValue( "/qgis/promptForRasterSublayers", cmbPromptRasterSublayers->currentIndex() );
603611
settings.setValue( "/qgis/dockIdentifyResults", cbxIdentifyResultsDocked->isChecked() );
604612
settings.setValue( "/qgis/dockSnapping", cbxSnappingOptionsDocked->isChecked() );
605613
settings.setValue( "/qgis/addPostgisDC", cbxAddPostgisDC->isChecked() );

src/providers/gdal/qgsgdaldataitems.cpp

+23-1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
101101
if ( !hDS )
102102
return 0;
103103

104+
QStringList sublayers = QgsGdalProvider::subLayers( hDS );
105+
104106
GDALClose( hDS );
105107

106108
QgsDebugMsg( "GdalDataset opened " + thePath );
@@ -109,8 +111,28 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
109111
QString uri = thePath;
110112

111113
QgsLayerItem * item = new QgsGdalLayerItem( parentItem, name, thePath, uri );
114+
115+
QgsDataItem * childItem = NULL;
116+
GDALDatasetH hChildDS = NULL;
117+
118+
if ( item && sublayers.count() > 1 )
119+
{
120+
QgsDebugMsg( QString( "dataItem() got %1 sublayers" ).arg( sublayers.count() ) );
121+
for ( int i = 0; i < sublayers.count(); i++ )
122+
{
123+
hChildDS = GDALOpen( TO8F( sublayers[i] ), GA_ReadOnly );
124+
if ( hChildDS )
125+
{
126+
GDALClose( hChildDS );
127+
QgsDebugMsg( QString( "add child #%1 - %2" ).arg( i ).arg( sublayers[i] ) );
128+
childItem = new QgsGdalLayerItem( item, sublayers[i], thePath + "/" + sublayers[i], sublayers[i] );
129+
if ( childItem )
130+
item->addChildItem( childItem );
131+
}
132+
}
133+
}
134+
112135
return item;
113136
}
114137
return 0;
115138
}
116-

0 commit comments

Comments
 (0)