[SCM] qgis branch, master, updated. a2ee769957385f4e084c5e8b6ba178a8c877d1db

Juergen E. Fischer jef at norbit.de
Tue Mar 20 13:43:27 UTC 2012


The following commit has been merged in the master branch:
commit d8c8a6768f43614ac099a9a0dfeb610ed26527e2
Author: Etienne Tourigny <etourigny.dev at gmail.com>
Date:   Fri Mar 9 10:30:53 2012 -0300

    QgisApp::askUserForGDALSublayers : fix order of new layers in the layers dock ; add an option to load all sublayers of a GDAL raster with subdatasets

diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index dd6ee6c..5c28856 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -2262,15 +2262,23 @@ bool QgisApp::addVectorLayers( QStringList const & theLayerQStringList, const QS
   return true;
 } // QgisApp::addVectorLayer()
 
+// present a dialog to choose GDAL raster sublayers
 void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
 {
-  if ( !layer )
+  if ( !layer || layer->subLayers().size() < 1 )
     return;
 
   QStringList sublayers = layer->subLayers();
-
   QgsDebugMsg( "sublayers:\n  " + sublayers.join( "  \n" ) + "\n" );
 
+  // if promptLayers=Load all, load all sublayers without prompting
+  QSettings settings;
+  if ( settings.value( "/qgis/promptForRasterSublayers", 1 ).toInt() == 3 )
+  {
+    loadGDALSublayers( layer->source(), sublayers );
+    return;
+  }
+
   // We initialize a selection dialog and display it.
   QgsOGRSublayersDialog chooseSublayersDialog( this );
   chooseSublayersDialog.setWindowTitle( tr( "Select raster layers to add..." ) );
@@ -2285,19 +2293,11 @@ void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
 
   if ( chooseSublayersDialog.exec() )
   {
-    foreach( QString path, chooseSublayersDialog.getSelection() )
-    {
-      QString name = path;
-      name.replace( layer->source(), QFileInfo( layer->source() ).completeBaseName() );
-      QgsRasterLayer *rlayer = new QgsRasterLayer( path, name );
-      if ( rlayer && rlayer->isValid() )
-      {
-        addRasterLayer( rlayer );
-      }
-    }
+    loadGDALSublayers( layer->source(), chooseSublayersDialog.getSelection() );
   }
 }
 
+// should the GDAL sublayers dialog should be presented to the user?
 bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
 {
   // return false if layer is empty or raster has no sublayers
@@ -2306,13 +2306,35 @@ bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
 
   QSettings settings;
   int promptLayers = settings.value( "/qgis/promptForRasterSublayers", 1 ).toInt();
-  // 0 = always -> always ask (if there are existing sublayers)
-  // 1 = if needed -> ask if layer has no bands, but has sublayers
-  // 2 = never
 
-  return promptLayers == 0 || ( promptLayers == 1 && layer->bandCount() == 0 );
+  // return true if promptLayers=Always or if promptLayers!=Never and there are no bands
+  return promptLayers == 0 || ( promptLayers != 2 && layer->bandCount() == 0 );
 }
 
+// This method will load with GDAL the layers in parameter.
+// It is normally triggered by the sublayer selection dialog.
+void QgisApp::loadGDALSublayers( QString uri, QStringList list )
+{
+  QString path, name;
+  QgsRasterLayer *subLayer = NULL;
+
+  //add layers in reverse order so they appear in the right order in the layer dock
+  for ( int i = list.size() - 1; i >= 0 ; i-- )
+  {
+    path = list[i];
+    // shorten name by replacing complete path with filename
+    name = path;
+    name.replace( uri, QFileInfo( uri ).completeBaseName() );
+    subLayer = new QgsRasterLayer( path, name );
+    if ( subLayer )
+    {
+      if ( subLayer->isValid() )
+        addRasterLayer( subLayer );
+      else
+        delete subLayer;
+    }
+  }
+}
 
 // This method is the method that does the real job. If the layer given in
 // parameter is NULL, then the method tries to act on the activeLayer.
diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h
index c56828b..8b54096 100644
--- a/src/app/qgisapp.h
+++ b/src/app/qgisapp.h
@@ -422,6 +422,7 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
     void editPaste( QgsMapLayer * destinationLayer = 0 );
 
     void loadOGRSublayers( QString layertype, QString uri, QStringList list );
+    void loadGDALSublayers( QString uri, QStringList list );
 
     /**Deletes the selected attributes for the currently selected vector layer*/
     void deleteSelected( QgsMapLayer *layer = 0, QWidget* parent = 0 );
diff --git a/src/app/qgsoptions.cpp b/src/app/qgsoptions.cpp
index 40234f3..dc49ff8 100644
--- a/src/app/qgsoptions.cpp
+++ b/src/app/qgsoptions.cpp
@@ -185,10 +185,15 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
   spinBoxAttrTableRowCache->setValue( settings.value( "/qgis/attributeTableRowCache", 10000 ).toInt() );
 
   // set the prompt for raster sublayers
+  // 0 = Always -> always ask (if there are existing sublayers)
+  // 1 = If needed -> ask if layer has no bands, but has sublayers
+  // 2 = Never -> never prompt, will not load anything
+  // 4 = Load all -> never prompt, but load all sublayers
   cmbPromptRasterSublayers->clear();
   cmbPromptRasterSublayers->addItem( tr( "Always" ) );
   cmbPromptRasterSublayers->addItem( tr( "If needed" ) ); //this means, prompt if there are sublayers but no band in the main dataset
   cmbPromptRasterSublayers->addItem( tr( "Never" ) );
+  cmbPromptRasterSublayers->addItem( tr( "Load all" ) );
   cmbPromptRasterSublayers->setCurrentIndex( settings.value( "/qgis/promptForRasterSublayers", 0 ).toInt() );
 
   // set the display update threshold

-- 
The Quantum GIS in Debian project



More information about the Pkg-grass-devel mailing list