[QGIS Commit] r10065 - in trunk/qgis: . src/app src/providers/ogr src/ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Jan 31 11:04:02 EST 2009


Author: wonder
Date: 2009-01-31 11:04:02 -0500 (Sat, 31 Jan 2009)
New Revision: 10065

Added:
   trunk/qgis/src/app/qgsogrsublayersdialog.cpp
   trunk/qgis/src/app/qgsogrsublayersdialog.h
   trunk/qgis/src/ui/qgsogrsublayersdialogbase.ui
Modified:
   trunk/qgis/CONTRIBUTORS
   trunk/qgis/src/app/CMakeLists.txt
   trunk/qgis/src/app/qgisapp.cpp
   trunk/qgis/src/app/qgisapp.h
   trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
   trunk/qgis/src/providers/ogr/qgsogrprovider.h
Log:
Applied patch from ticket #767 by Florian El Ahdab.
Thanks for the contribution!

I've slightly modified the patch to simplify some pieces of code.


Modified: trunk/qgis/CONTRIBUTORS
===================================================================
--- trunk/qgis/CONTRIBUTORS	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/CONTRIBUTORS	2009-01-31 16:04:02 UTC (rev 10065)
@@ -11,6 +11,7 @@
 Christian Ferreira
 Faunalia (http://www.faunalia.it)
 Fernando Pacheco
+Florian El Ahdab
 Frank Warmerdam
 Hyao (IRC nickname)
 Jean-Denis Giguere 

Modified: trunk/qgis/src/app/CMakeLists.txt
===================================================================
--- trunk/qgis/src/app/CMakeLists.txt	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/src/app/CMakeLists.txt	2009-01-31 16:04:02 UTC (rev 10065)
@@ -39,6 +39,7 @@
   qgsmeasuretool.cpp
   qgsnewhttpconnection.cpp
   qgsnumericsortlistviewitem.cpp
+  qgsogrsublayersdialog.cpp
   qgsoptions.cpp
   qgspastetransformations.cpp
   qgspluginitem.cpp
@@ -113,6 +114,7 @@
   qgsmeasuredialog.h
   qgsnewhttpconnection.h
   qgsoptions.h
+  qgsogrsublayersdialog.h
   qgspastetransformations.h
   qgspluginmanager.h
   qgspythondialog.h

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/src/app/qgisapp.cpp	2009-01-31 16:04:02 UTC (rev 10065)
@@ -98,6 +98,7 @@
 #include "qgscursors.h"
 #include "qgscustomprojectiondialog.h"
 #include "qgsencodingfiledialog.h"
+#include "qgsogrsublayersdialog.h"
 #include "qgsexception.h"
 #include "qgsfeature.h"
 #include "qgsgeomtypedialog.h"
@@ -800,7 +801,7 @@
   mActionLayerSelectionSaveAs->setStatusTip( tr( "Save the selection as a shapefile" ) );
   connect( mActionLayerSelectionSaveAs, SIGNAL( triggered() ), this, SLOT( saveSelectionAsShapefile() ) );
   mActionLayerSelectionSaveAs->setEnabled( false );
-
+  
   mActionRemoveLayer = new QAction( getThemeIcon( "mActionRemoveLayer.png" ), tr( "Remove Layer" ), this );
   mActionRemoveLayer->setShortcut( tr( "Ctrl+D", "Remove a Layer" ) );
   mActionRemoveLayer->setStatusTip( tr( "Remove a Layer" ) );
@@ -2168,11 +2169,25 @@
     {
       layer->setProviderEncoding( enc );
 
-      // Register this layer with the layers registry
-      QgsMapLayerRegistry::instance()->addMapLayer( layer );
-      // notify the project we've made a change
-      QgsProject::instance()->dirty( true );
+      QStringList sublayers = layer->dataProvider()->subLayers();
 
+      // If the newly created layer has more than 1 layer of data available, we show the
+      // sublayers selection dialog so the user can select the sublayers to actually load.
+			if ( sublayers.count() > 1)
+			{
+        askUserForSublayers(layer);				
+
+        // The first layer loaded is not usefull in that case. The user can select it in 
+        // the list if he wants to load it.
+        delete layer;
+
+			}else  // there is 1 layer of data available
+      {
+        // Register this layer with the layers registry
+        QgsMapLayerRegistry::instance()->addMapLayer( layer );
+        // notify the project we've made a change
+        QgsProject::instance()->dirty( true );
+      }
     }
     else
     {
@@ -2203,8 +2218,60 @@
   return true;
 } // QgisApp::addVectorLayer()
 
+// 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. 
+void QgisApp::askUserForSublayers(QgsVectorLayer *layer)
+{
+  if (layer == NULL)
+  {
+    if (activeLayer() == NULL || activeLayer()->type() != QgsMapLayer::VectorLayer)
+      return;
+    
+    layer = (QgsVectorLayer*) activeLayer();
+    if (layer->dataProvider()->name() != "ogr")
+      return;
+  }
+  
+  QStringList sublayers = layer->dataProvider()->subLayers();
 
+  // We initialize a selection dialog and display it.
+  QgsOGRSublayersDialog chooseSublayersDialog( this );
+  chooseSublayersDialog.populateLayerTable( sublayers );
+  
+  if (chooseSublayersDialog.exec())
+  {
+    QString uri = layer->source();
+    if ( uri.contains('&', Qt::CaseSensitive) )
+    {
+      // If we get here, there are some options added to the filename.
+      // A valid uri is of the form: filename&option1=value1&option2=value2,...
+      // We want only the filename here, so we get the first part of the split.
+      QStringList theURIParts = uri.split("&");
+      uri = theURIParts.at( 0 );
+    }
+    
+    // the user has done his choice
+    loadOGRSublayers(uri, chooseSublayersDialog.getSelection());
+  }
+}
 
+// This method will load with OGR the layers  in parameter. 
+// This method has been conceived to use the new URI
+// format of the ogrprovider so as to give precisions about which
+// sublayer to load into QGIS. It is normally triggered by the
+// sublayer selection dialog.
+void QgisApp::loadOGRSublayers( QString uri, QStringList list)
+{
+  // The uri must contain the actual uri of the vectorLayer from which we are
+  // going to load the sublayers.
+  QString fileName = QFileInfo(uri).baseName();
+	for (int i = 0; i < list.size(); i++)
+	{
+		QString composedURI=uri+"&layername="+list.at(i);
+		QgsVectorLayer *layer=addVectorLayer(composedURI,fileName+":"+list.at(i),"ogr");
+	}
+}
+
 /** This helper checks to see whether the file name appears to be a valid vector file name */
 bool QgisApp::isValidVectorFileName( QString theFileNameQString )
 {

Modified: trunk/qgis/src/app/qgisapp.h
===================================================================
--- trunk/qgis/src/app/qgisapp.h	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/src/app/qgisapp.h	2009-01-31 16:04:02 UTC (rev 10065)
@@ -63,6 +63,7 @@
 #include "qgsconfig.h"
 #include "qgspoint.h"
 
+
 /*! \class QgisApp
  * \brief Main window for the Qgis application
  */
@@ -342,6 +343,8 @@
      */
     void editPaste( QgsMapLayer * destinationLayer = 0 );
 
+    void loadOGRSublayers( QString uri, QStringList list );
+
   protected:
 
     //! Handle state changes (WindowTitleChange)
@@ -594,6 +597,10 @@
     void bookmarkAdded();
 
   private:
+    /** This method will open a dialog so the user can select the sublayers
+    * to load
+    */
+    void askUserForSublayers(QgsVectorLayer *layer);
     /** Add a raster layer to the map (passed in as a ptr).
      * It won't force a refresh.
      */

Added: trunk/qgis/src/app/qgsogrsublayersdialog.cpp
===================================================================
--- trunk/qgis/src/app/qgsogrsublayersdialog.cpp	                        (rev 0)
+++ trunk/qgis/src/app/qgsogrsublayersdialog.cpp	2009-01-31 16:04:02 UTC (rev 10065)
@@ -0,0 +1,54 @@
+/***************************************************************************
+    qgsogrsublayersdialog.cpp  - dialog for selecting ogr sublayers
+    ---------------------
+    begin                : January 2009
+    copyright            : (C) 2009 by Florian El Ahdab
+    email                : felahdab at gmail dot com
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+/* $Id$ */
+
+#include "qgsogrsublayersdialog.h"
+
+#include <QTableWidgetItem>
+
+
+QgsOGRSublayersDialog::QgsOGRSublayersDialog( QWidget* parent, Qt::WFlags fl )
+    : QDialog( parent, fl )
+{
+  setupUi( this );
+  QStringList labels=QStringList() << "Layer ID" << "Layer name" << "Nb of features" << "Geometry type";
+	layersTable->setHeaderLabels(labels);
+}
+
+QgsOGRSublayersDialog::~QgsOGRSublayersDialog()
+{
+}
+
+QStringList QgsOGRSublayersDialog::getSelection()
+{
+  QStringList list=QStringList();
+  for (int i = 0; i < layersTable-> selectedItems().size(); i++)
+  {
+    QString theItem =layersTable-> selectedItems().at(i)->text(1);
+    list.append(theItem);
+  }
+  return list;
+}
+
+void QgsOGRSublayersDialog::populateLayerTable (QStringList theList)
+{
+	for (int i =0; i< theList.size(); i++){
+		QString ligne = theList.at(i);
+		QStringList elements = ligne.split(":");
+    QStringList item=QStringList();
+    item << elements.at(0) << elements.at(1) << elements.at(2) << elements.at(3);
+    layersTable -> addTopLevelItem(new QTreeWidgetItem(item));
+	}	
+}

Added: trunk/qgis/src/app/qgsogrsublayersdialog.h
===================================================================
--- trunk/qgis/src/app/qgsogrsublayersdialog.h	                        (rev 0)
+++ trunk/qgis/src/app/qgsogrsublayersdialog.h	2009-01-31 16:04:02 UTC (rev 10065)
@@ -0,0 +1,36 @@
+/***************************************************************************
+    qgsogrsublayersdialog.h  - dialog for selecting ogr sublayers
+    ---------------------
+    begin                : January 2009
+    copyright            : (C) 2009 by Florian El Ahdab
+    email                : felahdab at gmail dot com
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+/* $Id$ */
+
+#ifndef QGSOGRSUBLAYERSDIALOG_H
+#define QGSOGRSUBLAYERSDIALOG_H
+
+#include <QDialog>
+#include <ui_qgsogrsublayersdialogbase.h>
+
+
+
+class QgsOGRSublayersDialog : public QDialog, private Ui::QgsOGRSublayersDialogBase
+{
+    Q_OBJECT
+  public:
+    QgsOGRSublayersDialog( QWidget* parent = 0, Qt::WFlags fl = 0 );
+    ~QgsOGRSublayersDialog();
+		void populateLayerTable(QStringList theList);
+		QStringList getSelection();
+
+};
+
+#endif

Modified: trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
===================================================================
--- trunk/qgis/src/providers/ogr/qgsogrprovider.cpp	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/src/providers/ogr/qgsogrprovider.cpp	2009-01-31 16:04:02 UTC (rev 10065)
@@ -73,14 +73,61 @@
   // try to open for update, but disable error messages to avoid a
   // message if the file is read only, because we cope with that
   // ourselves.
+
+  // This part of the code parses the uri transmitted to the ogr provider to 
+  // get the options the client wants us to apply
+
+  QString mFilePath;
+  QString theLayerName;
+  int theLayerIndex=0;
+
+  // If there is no & in the uri, then the uri is just the filename. The loaded
+  // layer will be layer 0.
+  if ( ! uri.contains('&', Qt::CaseSensitive))
+  {
+    mFilePath = uri;
+  }
+  else
+  {
+  // If we get here, there are some options added to the filename. We must parse
+  // the different parts separated by &, and among each option, the name and the
+  // value around the =.
+  // A valid uri is of the form: filename&option1=value1&option2=value2,...
+
+ 	  QStringList theURIParts = uri.split("&");
+    mFilePath = theURIParts.at( 0 );
+
+    for (int i = 1 ; i < theURIParts.size(); i++ )
+    {
+      QStringList theInstruction = theURIParts.at( i ).split( "=" );
+      if ( theInstruction.at( 0 ) == QString( "layerid" ) )
+      {
+        bool ok;
+        theLayerIndex = theInstruction.at( 1 ).toInt( &ok );
+        if ( ! ok )
+        {
+          theLayerIndex = 0;
+        }
+      }
+      if ( theInstruction.at( 0 ) == QString( "layername" ) )
+      {
+        theLayerName = theInstruction.at( 1 );
+      }				
+    }
+  }
+
+  QgsDebugMsg("mFilePath: " + mFilePath);
+  QgsDebugMsg("theLayerIndex: "+theLayerIndex);
+  QgsDebugMsg("theLayerName: "+theLayerName);
+	
   CPLPushErrorHandler( CPLQuietErrorHandler );
-  ogrDataSource = OGROpen( QFile::encodeName( uri ).constData(), TRUE, &ogrDriver );
+  ogrDataSource = OGROpen( QFile::encodeName( mFilePath ).constData(), TRUE, &ogrDriver );
   CPLPopErrorHandler();
 
   if ( ogrDataSource == NULL )
   {
     // try to open read-only
-    ogrDataSource = OGROpen( QFile::encodeName( uri ).constData(), FALSE, &ogrDriver );
+    ogrDataSource = OGROpen( QFile::encodeName( mFilePath ).constData(), FALSE, &ogrDriver );
 
     //TODO Need to set a flag or something to indicate that the layer
     //TODO is in read-only mode, otherwise edit ops will fail
@@ -95,9 +142,18 @@
     valid = true;
 
     ogrDriverName = OGR_Dr_GetName( ogrDriver );
+		
+    // We get the layer which was requested by the uri. The layername
+    // has precedence over the layerid if both are given.
+    if ( theLayerName.isNull() )
+    {
+      ogrLayer = OGR_DS_GetLayer( ogrDataSource, theLayerIndex );
+    }
+    else
+    {
+      ogrLayer = OGR_DS_GetLayerByName( ogrDataSource, (char*)(theLayerName.toLocal8Bit().data()) );
+    }
 
-    ogrLayer = OGR_DS_GetLayer( ogrDataSource, 0 );
-
     // get the extent_ (envelope) of the layer
 
     QgsDebugMsg( "Starting get extent" );
@@ -145,6 +201,44 @@
   }
 }
 
+QStringList QgsOgrProvider::subLayers() const
+{
+  QStringList theList = QStringList();
+  if (! valid )
+  {
+    return theList;
+  }
+  for ( int i = 0; i < layerCount() ; i++ )
+  {  
+    QString theLayerName = QString(OGR_FD_GetName(OGR_L_GetLayerDefn(OGR_DS_GetLayer( ogrDataSource, i ))));
+    OGRwkbGeometryType layerGeomType = OGR_FD_GetGeomType(OGR_L_GetLayerDefn(OGR_DS_GetLayer( ogrDataSource, i )));
+
+    int theLayerFeatureCount=OGR_L_GetFeatureCount(OGR_DS_GetLayer( ogrDataSource, i ),1) ;
+
+    QString geom;
+    switch (layerGeomType)
+    {
+      case wkbUnknown:            geom = "Unknown"; break;
+      case wkbPoint:              geom="Point"; break;
+      case wkbLineString:         geom="LineString"; break;
+      case wkbPolygon:            geom="Polygon"; break;
+      case wkbMultiPoint:         geom="MultiPoint"; break;
+      case wkbMultiLineString:    geom="MultiLineString"; break;
+      case wkbGeometryCollection: geom = "GeometryCollection"; break;
+      case wkbNone:               geom = "None"; break;
+      case wkbPoint25D:           geom="Point25D"; break;
+      case wkbLineString25D:      geom="LineString25D"; break;
+      case wkbPolygon25D:         geom="Polygon25D"; break;
+      case wkbMultiPoint25D:      geom="MultiPoint25D"; break;
+      case wkbMultiLineString25D: geom="MultiLineString25D"; break;
+      case wkbMultiPolygon25D:    geom="MultiPolygon25D"; break;
+      default: geom="Unknown WKB: " + QString::number(layerGeomType);
+    }
+    theList.append(QString::number(i)+":"+ theLayerName+":"+QString::number(theLayerFeatureCount)+":"+geom);
+  }
+  return theList;
+}
+
 void QgsOgrProvider::setEncoding( const QString& e )
 {
   QgsVectorDataProvider::setEncoding( e );

Modified: trunk/qgis/src/providers/ogr/qgsogrprovider.h
===================================================================
--- trunk/qgis/src/providers/ogr/qgsogrprovider.h	2009-01-31 10:23:49 UTC (rev 10064)
+++ trunk/qgis/src/providers/ogr/qgsogrprovider.h	2009-01-31 16:04:02 UTC (rev 10065)
@@ -47,6 +47,13 @@
 
     virtual QgsCoordinateReferenceSystem crs();
 
+	   /**
+     * Sub-layers handled by this provider, in order from bottom to top
+     *
+     * Sub-layers are used when the provider's source can combine layers
+     * it knows about in some way before it hands them off to the provider.
+     */
+    virtual QStringList subLayers() const;
 
     /**
      *   Returns the permanent storage type for this layer as a friendly name.
@@ -181,14 +188,7 @@
      *  @param index the index of the attribute
      *  @param values reference to the list of unique values */
     virtual void uniqueValues( int index, QList<QVariant> &uniqueValues );
-
-  protected:
-    /** loads fields from input file to member attributeFields */
-    void loadFields();
-
-    /**Get an attribute associated with a feature*/
-    void getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature & f, int attindex );
-
+    
     /** return a provider name
 
     Essentially just returns the provider key.  Should be used to build file
@@ -219,7 +219,15 @@
      */
     QString description() const;
 
+  protected:
+    /** loads fields from input file to member attributeFields */
+    void loadFields();
 
+    /**Get an attribute associated with a feature*/
+    void getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature & f, int attindex );
+
+
+
   private:
     unsigned char *getGeometryPointer( OGRFeatureH fet );
 
@@ -247,7 +255,6 @@
 
     //! Selection rectangle
     OGRGeometryH mSelectionRectangle;
-
     /**Adds one feature*/
     bool addFeature( QgsFeature& f );
     /**Deletes one feature*/

Added: trunk/qgis/src/ui/qgsogrsublayersdialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsogrsublayersdialogbase.ui	                        (rev 0)
+++ trunk/qgis/src/ui/qgsogrsublayersdialogbase.ui	2009-01-31 16:04:02 UTC (rev 10065)
@@ -0,0 +1,144 @@
+<ui version="4.0" >
+ <class>QgsOGRSublayersDialogBase</class>
+ <widget class="QDialog" name="QgsOGRSublayersDialogBase" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>584</width>
+    <height>535</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Select OGR layers to load</string>
+  </property>
+  <property name="windowIcon" >
+   <iconset>../../../qgis_1.0.0/src/plugins/ogrsublayers</iconset>
+  </property>
+  <layout class="QGridLayout" >
+   <property name="leftMargin" >
+    <number>9</number>
+   </property>
+   <property name="topMargin" >
+    <number>9</number>
+   </property>
+   <property name="rightMargin" >
+    <number>9</number>
+   </property>
+   <property name="bottomMargin" >
+    <number>9</number>
+   </property>
+   <property name="horizontalSpacing" >
+    <number>6</number>
+   </property>
+   <property name="verticalSpacing" >
+    <number>6</number>
+   </property>
+   <item row="0" column="0" >
+    <widget class="QLabel" name="txtHeading" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="font" >
+      <font>
+       <family>Sans Serif</family>
+       <pointsize>24</pointsize>
+       <weight>75</weight>
+       <italic>false</italic>
+       <bold>true</bold>
+       <underline>false</underline>
+       <strikeout>false</strikeout>
+      </font>
+     </property>
+     <property name="text" >
+      <string>Sub layers list</string>
+     </property>
+     <property name="alignment" >
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="8" column="0" >
+    <widget class="QDialogButtonBox" name="buttonBox" >
+     <property name="orientation" >
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons" >
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" >
+    <widget class="QTextEdit" name="textEdit" >
+     <property name="html" >
+      <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';">This is the list of all layers available in the datasource of the active layer. You can select the layers to load. The layers will be loaded when you press "OK".&lt;/p>
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';">&lt;/p>
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';">The layer name is format dependant. Consult the OGR documentation or the documentation of your data format to determine the nature of the included information.&lt;/p>
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';">&lt;/p>
+&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';">&lt;span style=" font-weight:600;">Be advised: &lt;/span>selecting an already opened layer will not generate an error message and the layer will end up loaded twice!&lt;/p>&lt;/body>&lt;/html></string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" >
+    <widget class="QTreeWidget" name="layersTable" >
+     <property name="windowModality" >
+      <enum>Qt::NonModal</enum>
+     </property>
+     <property name="selectionMode" >
+      <enum>QAbstractItemView::ExtendedSelection</enum>
+     </property>
+     <property name="selectionBehavior" >
+      <enum>QAbstractItemView::SelectRows</enum>
+     </property>
+     <column>
+      <property name="text" >
+       <string>1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>QgsOGRSublayersDialogBase</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>446</x>
+     <y>508</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>351</x>
+     <y>473</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>QgsOGRSublayersDialogBase</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>541</x>
+     <y>507</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>503</x>
+     <y>434</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>



More information about the QGIS-commit mailing list