[QGIS Commit] r13204 - in trunk/qgis/python/plugins/fTools: . icons/default tools

svn_qgis at osgeo.org svn_qgis at osgeo.org
Tue Mar 30 16:37:56 EDT 2010


Author: cfarmer
Date: 2010-03-30 16:37:55 -0400 (Tue, 30 Mar 2010)
New Revision: 13204

Added:
   trunk/qgis/python/plugins/fTools/icons/default/merge_shapes.png
   trunk/qgis/python/plugins/fTools/tools/doMergeShapes.py
   trunk/qgis/python/plugins/fTools/tools/frmMergeShapes.ui
Modified:
   trunk/qgis/python/plugins/fTools/fTools.py
   trunk/qgis/python/plugins/fTools/resources.qrc
Log:
Adds 'merge shapes' tool to fTools (vector tools). Thanks to Alexander Bruy for the patch.

Modified: trunk/qgis/python/plugins/fTools/fTools.py
===================================================================
--- trunk/qgis/python/plugins/fTools/fTools.py	2010-03-30 14:35:07 UTC (rev 13203)
+++ trunk/qgis/python/plugins/fTools/fTools.py	2010-03-30 20:37:55 UTC (rev 13204)
@@ -1,5 +1,6 @@
+# -*- coding: utf-8 -*-
 #-----------------------------------------------------------
-# 
+#
 # fTools
 # Copyright (C) 2009  Carson Farmer
 # EMAIL: carson.farmer (at) gmail.com
@@ -7,27 +8,27 @@
 #
 # A collection of data management and analysis tools for vector data
 #
-# Geoprocessing functions adapted from 'Geoprocessing Plugin', 
+# Geoprocessing functions adapted from 'Geoprocessing Plugin',
 # (C) 2008 by Dr. Horst Duester, Stefan Ziegler
 #
 #-----------------------------------------------------------
-# 
+#
 # licensed under the terms of GNU GPL 2
-# 
+#
 # 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.
-# 
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License along
 # with this program; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-# 
+#
 #---------------------------------------------------------------------
 
 from PyQt4.QtCore import *
@@ -44,7 +45,8 @@
 # TODO: Eliminate the following modules in favour of above multi-function formats
 import doIntersectLines, doJoinAttributes, doSelectByLocation, doVectorSplit, doMeanCoords
 import doPointDistance, doPointsInPolygon, doRandom, doRandPoints, doRegPoints, doDefineProj
-import doReProject, doSpatialJoin, doSubsetSelect, doSumLines, doVectorGrid, doAbout
+import doReProject, doSpatialJoin, doSubsetSelect, doSumLines, doVectorGrid, doMergeShapes
+import doAbout
 
 class fToolsPlugin:
   def __init__( self,iface ):
@@ -53,7 +55,7 @@
       self.QgisVersion = unicode( QGis.QGIS_VERSION_INT )
     except:
       self.QgisVersion = unicode( QGis.qgisVersion )[ 0 ]
-      
+
   def getThemeIcon( self, icon ):
     settings = QSettings()
     pluginPath = QString( os.path.dirname( __file__ ) )
@@ -65,7 +67,7 @@
       return QIcon( ":" + defaultPath )
     else:
       return QIcon()
-      
+
   def updateThemeIcons( self, theme ):
     self.analysisMenu.setIcon( QIcon( self.getThemeIcon( "analysis.png" ) ) )
     self.distMatrix.setIcon( QIcon( self.getThemeIcon( "matrix.png" ) ) )
@@ -75,13 +77,13 @@
     self.listUnique.setIcon( QIcon( self.getThemeIcon( "unique.png" ) ) )
     self.nearestNeigh.setIcon( QIcon( self.getThemeIcon( "neighbour.png" ) ) )
     self.meanCoords.setIcon( QIcon( self.getThemeIcon( "mean.png" ) ) )
-    self.intLines.setIcon( QIcon( self.getThemeIcon( "intersections.png" ) ) ) 
+    self.intLines.setIcon( QIcon( self.getThemeIcon( "intersections.png" ) ) )
 
     self.researchMenu.setIcon( QIcon( self.getThemeIcon( "sampling.png" ) ) )
-    self.randSel.setIcon( QIcon( self.getThemeIcon( "random_selection.png" ) ) ) 
-    self.randSub.setIcon( QIcon( self.getThemeIcon( "sub_selection.png" ) ) ) 
-    self.randPoints.setIcon( QIcon( self.getThemeIcon( "random_points.png" ) ) ) 
-    self.regPoints.setIcon( QIcon( self.getThemeIcon( "regular_points.png" ) ) ) 
+    self.randSel.setIcon( QIcon( self.getThemeIcon( "random_selection.png" ) ) )
+    self.randSub.setIcon( QIcon( self.getThemeIcon( "sub_selection.png" ) ) )
+    self.randPoints.setIcon( QIcon( self.getThemeIcon( "random_points.png" ) ) )
+    self.regPoints.setIcon( QIcon( self.getThemeIcon( "regular_points.png" ) ) )
     self.vectGrid.setIcon( QIcon( self.getThemeIcon( "vector_grid.png" ) ) )
     self.selectLocation.setIcon( QIcon( self.getThemeIcon( "select_location.png" ) ) )
     self.layerExtent.setIcon( QIcon( self.getThemeIcon( "layer_extent.png" ) ) )
@@ -104,27 +106,28 @@
     self.extNodes.setIcon( QIcon( self.getThemeIcon( "extract_nodes.png") ) )
     self.simplify.setIcon( QIcon( self.getThemeIcon( "simplify.png") ) )
     self.multiToSingle.setIcon( QIcon( self.getThemeIcon( "multi_to_single.png") ) )
-    self.singleToMulti.setIcon( QIcon( self.getThemeIcon( "single_to_multi.png") ) ) 
+    self.singleToMulti.setIcon( QIcon( self.getThemeIcon( "single_to_multi.png") ) )
     self.polysToLines.setIcon( QIcon( self.getThemeIcon( "to_lines.png") ) )
-    
+
     self.dataManageMenu.setIcon( QIcon( self.getThemeIcon( "management.png") ) )
     self.project.setIcon( QIcon( self.getThemeIcon( "export_projection.png") ) )
-    self.define.setIcon( QIcon( self.getThemeIcon( "define_projection.png" ) ) ) 
-    self.joinAttr.setIcon( QIcon( self.getThemeIcon( "join_attributes.png" ) ) ) 
+    self.define.setIcon( QIcon( self.getThemeIcon( "define_projection.png" ) ) )
+    self.joinAttr.setIcon( QIcon( self.getThemeIcon( "join_attributes.png" ) ) )
     self.spatJoin.setIcon( QIcon( self.getThemeIcon( "join_location.png" ) ) )
     self.splitVect.setIcon( QIcon( self.getThemeIcon( "split_layer.png" ) ) )
+    self.mergeShapes.setIcon( QIcon( self.getThemeIcon( "merge_shapes.png" ) ) )
     self.ftools_aboot.setIcon( QIcon( self.getThemeIcon( "ftools_logo.png" ) ) )
 
   def initGui( self ):
     if int( self.QgisVersion ) < 1:
-      QMessageBox.warning( self.iface.getMainWindow(), "fTools", 
+      QMessageBox.warning( self.iface.getMainWindow(), "fTools",
       QCoreApplication.translate( "fTools", "Quantum GIS version detected: " ) +unicode( self.QgisVersion )+".xx\n"
       + QCoreApplication.translate( "fTools", "This version of fTools requires at least QGIS version 1.0.0\nPlugin will not be enabled." ) )
       return None
     QObject.connect( self.iface, SIGNAL( "currentThemeChanged ( QString )" ), self.updateThemeIcons )
     self.menu = QMenu()
     self.menu.setTitle( QCoreApplication.translate( "fTools", "&Vector" ) )
-    
+
     self.analysisMenu = QMenu( QCoreApplication.translate( "fTools", "&Analysis Tools" ) )
     self.distMatrix = QAction( QCoreApplication.translate( "fTools", "Distance matrix" ),self.iface.mainWindow( ) )
     self.sumLines = QAction( QCoreApplication.translate( "fTools", "Sum line lengths" ), self.iface.mainWindow() )
@@ -145,7 +148,7 @@
     self.vectGrid = QAction( QCoreApplication.translate( "fTools", "Vector grid" ), self.iface.mainWindow() )
     self.selectLocation = QAction( QCoreApplication.translate( "fTools", "Select by location" ), self.iface.mainWindow() )
     self.layerExtent = QAction( QCoreApplication.translate( "fTools", "Polygon from layer extent" ), self.iface.mainWindow() )
-    self.researchMenu.addActions( [ self.randSel, self.randSub, self.randPoints, 
+    self.researchMenu.addActions( [ self.randSel, self.randSub, self.randPoints,
     self.regPoints, self.vectGrid, self.selectLocation, self.layerExtent ] )
 
     self.geoMenu = QMenu( QCoreApplication.translate( "fTools", "&Geoprocessing Tools" ) )
@@ -157,7 +160,7 @@
     self.clip = QAction( QCoreApplication.translate( "fTools", "Clip" ),self.iface.mainWindow() )
     self.dissolve = QAction( QCoreApplication.translate( "fTools", "Dissolve" ),self.iface.mainWindow() )
     self.erase = QAction( QCoreApplication.translate( "fTools", "Difference" ),self.iface.mainWindow() )
-    self.geoMenu.addActions( [ self.minConvex, self.dynaBuffer, self.intersect, 
+    self.geoMenu.addActions( [ self.minConvex, self.dynaBuffer, self.intersect,
     self.union, self.symDifference, self.clip, self.erase, self.dissolve ] )
 
     self.conversionMenu = QMenu( QCoreApplication.translate( "fTools", "G&eometry Tools" ) )
@@ -170,7 +173,7 @@
     self.multiToSingle = QAction( QCoreApplication.translate( "fTools", "Multipart to singleparts" ),self.iface.mainWindow() )
     self.singleToMulti = QAction( QCoreApplication.translate( "fTools", "Singleparts to multipart" ),self.iface.mainWindow() )
     self.polysToLines = QAction( QCoreApplication.translate( "fTools", "Polygons to lines" ),self.iface.mainWindow() )
-    self.conversionMenu.addActions( [ self.checkGeom, self.compGeo, self.centroids, self.delaunay, 
+    self.conversionMenu.addActions( [ self.checkGeom, self.compGeo, self.centroids, self.delaunay,
     self.simplify, self.multiToSingle, self.singleToMulti, self.polysToLines, self.extNodes] )
 
     self.dataManageMenu = QMenu( QCoreApplication.translate( "fTools", "&Data Management Tools") )
@@ -179,10 +182,11 @@
     self.joinAttr = QAction( QCoreApplication.translate( "fTools", "Join attributes" ), self.iface.mainWindow() )
     self.spatJoin = QAction( QCoreApplication.translate( "fTools", "Join attributes by location" ), self.iface.mainWindow() )
     self.splitVect = QAction( QCoreApplication.translate( "fTools", "Split vector layer" ), self.iface.mainWindow() )
-    self.dataManageMenu.addActions( [ self.project, self.define, self.joinAttr, self.spatJoin, self.splitVect ] )
+    self.mergeShapes = QAction( QCoreApplication.translate( "fTools", "Merge shapefiles to one" ), self.iface.mainWindow() )
+    self.dataManageMenu.addActions( [ self.project, self.define, self.joinAttr, self.spatJoin, self.splitVect, self.mergeShapes ] )
     self.ftools_aboot = QAction( QCoreApplication.translate( "fTools", "fTools Information" ), self.iface.mainWindow() )
     self.updateThemeIcons( "theme" )
-    
+
     self.menu.addMenu( self.analysisMenu )
     self.menu.addMenu( self.researchMenu )
     self.menu.addMenu( self.geoMenu )
@@ -195,7 +199,7 @@
     actions = menu_bar.actions()
     lastAction = actions[ len( actions ) - 1 ]
     menu_bar.insertMenu( lastAction, self.menu )
-        
+
     QObject.connect( self.distMatrix, SIGNAL("triggered()"), self.dodistMatrix )
     QObject.connect( self.sumLines, SIGNAL("triggered()"), self.dosumLines )
     QObject.connect( self.pointsPoly, SIGNAL("triggered()"), self.dopointsPoly )
@@ -237,6 +241,7 @@
     QObject.connect( self.joinAttr, SIGNAL("triggered()"), self.dojoinAttr )
     QObject.connect( self.spatJoin, SIGNAL("triggered()"), self.dospatJoin )
     QObject.connect( self.splitVect, SIGNAL("triggered()"), self.dosplitVect )
+    QObject.connect( self.mergeShapes, SIGNAL( "triggered()" ), self.doMergeShapes )
 
     QObject.connect( self.ftools_aboot, SIGNAL("triggered()"), self.doaboot )
 
@@ -314,11 +319,11 @@
   def docentroids( self ):
     d = doGeometry.GeometryDialog( self.iface, 7 )
     d.exec_()
-    
+
   def dodelaunay( self ):
     d = doGeometry.GeometryDialog( self.iface, 8 )
     d.exec_()
-    
+
   def doextent( self ):
     d = doGeometry.GeometryDialog( self.iface, 9 )
     d.exec_()
@@ -391,6 +396,10 @@
     d = doSpatialJoin.Dialog( self.iface )
     d.exec_()
 
+  def doMergeShapes( self ):
+    d = doMergeShapes.Dialog( self.iface )
+    d.exec_()
+
   def doaboot( self ):
     d = doAbout.Dialog( self.iface )
     d.exec_()

Added: trunk/qgis/python/plugins/fTools/icons/default/merge_shapes.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/python/plugins/fTools/icons/default/merge_shapes.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: trunk/qgis/python/plugins/fTools/resources.qrc
===================================================================
--- trunk/qgis/python/plugins/fTools/resources.qrc	2010-03-30 14:35:07 UTC (rev 13203)
+++ trunk/qgis/python/plugins/fTools/resources.qrc	2010-03-30 20:37:55 UTC (rev 13204)
@@ -41,6 +41,7 @@
         <file>icons/default/sum_lines.png</file>
         <file>icons/default/vector_grid.png</file>
         <file>icons/default/split_layer.png</file>
+        <file>icons/default/merge_shapes.png</file>
 		<file>icons/default/neighbour.png</file>
 		<file>icons/default/delaunay.png</file>
 		<file>icons/default/layer_extent.png</file>

Added: trunk/qgis/python/plugins/fTools/tools/doMergeShapes.py
===================================================================
--- trunk/qgis/python/plugins/fTools/tools/doMergeShapes.py	                        (rev 0)
+++ trunk/qgis/python/plugins/fTools/tools/doMergeShapes.py	2010-03-30 20:37:55 UTC (rev 13204)
@@ -0,0 +1,185 @@
+# -*- coding: utf-8 -*-
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from qgis.core import *
+from qgis.gui import *
+
+import ftools_utils
+
+from ui_frmMergeShapes import Ui_Dialog
+
+class Dialog( QDialog, Ui_Dialog ):
+  def __init__( self, iface ):
+    QDialog.__init__( self )
+    self.setupUi( self )
+    self.iface = iface
+
+    self.mergeThread = None
+
+    self.btnOk = self.buttonBox.button( QDialogButtonBox.Ok )
+    self.btnClose = self.buttonBox.button( QDialogButtonBox.Close )
+
+    QObject.connect( self.btnSelectDir, SIGNAL( "clicked()" ), self.inputDir )
+    QObject.connect( self.btnSelectFile, SIGNAL( "clicked()" ), self.outFile )
+
+  def inputDir( self ):
+    inDir = QFileDialog.getExistingDirectory( self,
+              self.tr( "Select directory with shapefiles to merge" ),
+              "." )
+
+    if inDir.isEmpty():
+      return
+
+    workDir = QDir( inDir )
+    workDir.setFilter( QDir.Files | QDir.NoSymLinks | QDir.NoDotAndDotDot )
+    nameFilter = QStringList() << "*.shp" << "*.SHP"
+    workDir.setNameFilters( nameFilter )
+    self.inputFiles = workDir.entryList()
+    if self.inputFiles.count() == 0:
+      QMessageBox.warning( self, self.tr( "No images found" ),
+        self.tr( "There are no shapefiles in this directory. Please select another one." ) )
+      self.inputFiles = None
+      return
+
+    self.progressFiles.setRange( 0, self.inputFiles.count() )
+    self.leInputDir.setText( inDir )
+
+  def outFile( self ):
+    ( self.outFileName, self.encoding ) = ftools_utils.saveDialog( self )
+    if self.outFileName is None or self.encoding is None:
+      return
+    self.leOutShape.setText( self.outFileName )
+
+  def reject( self ):
+    QDialog.reject( self )
+
+  def accept( self ):
+    outFile = QFile( self.outFileName )
+    if outFile.exists():
+      if not QgsVectorFileWriter.deleteShapeFile( self.outFileName ):
+        QMessageBox.warning( self, self.tr( "Delete error" ), self.tr( "Can't delete file %1" ).arg( outFileName ) )
+        return
+
+    baseDir = self.leInputDir.text()
+
+    QApplication.setOverrideCursor( QCursor( Qt.WaitCursor ) )
+    self.btnOk.setEnabled( False )
+
+    self.mergeThread = ShapeMergeThread( baseDir, self.inputFiles, self.outFileName, self.encoding )
+    QObject.connect( self.mergeThread, SIGNAL( "rangeChanged( PyQt_PyObject )" ), self.setProgressRange )
+    QObject.connect( self.mergeThread, SIGNAL( "featureProcessed()" ), self.featureProcessed )
+    QObject.connect( self.mergeThread, SIGNAL( "shapeProcessed()" ), self.shapeProcessed )
+    QObject.connect( self.mergeThread, SIGNAL( "processingFinished()" ), self.processingFinished )
+    QObject.connect( self.mergeThread, SIGNAL( "processingInterrupted()" ), self.processingInterrupted )
+
+    self.btnClose.setText( self.tr( "Cancel" ) )
+    QObject.disconnect( self.buttonBox, SIGNAL( "rejected()" ), self.reject )
+    QObject.connect( self.btnClose, SIGNAL( "clicked()" ), self.stopProcessing )
+
+    self.mergeThread.start()
+
+  def setProgressRange( self, max ):
+    self.progressFeatures.setRange( 0, max )
+
+  def featureProcessed( self ):
+    self.progressFeatures.setValue( self.progressFeatures.value() + 1 )
+
+  def shapeProcessed( self ):
+    self.progressFiles.setValue( self.progressFiles.value() + 1 )
+
+  def processingFinished( self ):
+    self.stopProcessing()
+
+    if self.chkAddToCanvas.isChecked():
+      if not ftools_utils.addShapeToCanvas( unicode( self.outFileName ) ):
+        QMessageBox.warning( self, self.tr( "Merging" ), self.tr( "Error loading output shapefile:\n%1" ).arg( unicode( self.outFileName ) ) )
+
+    self.restoreGui()
+
+  def processingInterrupted( self ):
+    self.restoreGui()
+
+  def stopProcessing( self ):
+    if self.mergeThread != None:
+      self.mergeThread.stop()
+      self.mergeThread = None
+
+  def restoreGui( self ):
+    self.progressFeatures.setValue( 0 )
+    self.progressFiles.setValue( 0 )
+    QApplication.restoreOverrideCursor()
+    QObject.connect( self.buttonBox, SIGNAL( "rejected()" ), self.reject )
+    self.btnClose.setText( self.tr( "Close" ) )
+    self.btnOk.setEnabled( True )
+
+class ShapeMergeThread( QThread ):
+  def __init__( self, dir, shapes, outputFileName, outputEncoding ):
+    QThread.__init__( self, QThread.currentThread() )
+    self.baseDir = dir
+    self.shapes = shapes
+    self.outputFileName = outputFileName
+    self.outputEncoding = outputEncoding
+
+    self.mutex = QMutex()
+    self.stopMe = 0
+
+  def run( self ):
+    self.mutex.lock()
+    self.stopMe = 0
+    self.mutex.unlock()
+
+    interrupted = False
+
+    # get information about shapefiles
+    layerPath = QFileInfo( self.baseDir + "/" + self.shapes[ 0 ] ).absoluteFilePath()
+    newLayer = QgsVectorLayer( layerPath, QFileInfo( layerPath ).baseName(), "ogr" )
+    self.crs = newLayer.srs()
+    self.geom = newLayer.wkbType()
+    vprovider = newLayer.dataProvider()
+    self.fields = vprovider.fields()
+
+    writer = QgsVectorFileWriter( self.outputFileName, self.outputEncoding,
+             self.fields, self.geom, self.crs )
+
+    for fileName in self.shapes:
+      layerPath = QFileInfo( self.baseDir + "/" + fileName ).absoluteFilePath()
+      newLayer = QgsVectorLayer( layerPath, QFileInfo( layerPath ).baseName(), "ogr" )
+      vprovider = newLayer.dataProvider()
+      allAttrs = vprovider.attributeIndexes()
+      vprovider.select( allAttrs )
+      nFeat = vprovider.featureCount()
+      self.emit( SIGNAL( "rangeChanged( PyQt_PyObject )" ), nFeat )
+      inFeat = QgsFeature()
+      outFeat = QgsFeature()
+      inGeom = QgsGeometry()
+      while vprovider.nextFeature( inFeat ):
+        atMap = inFeat.attributeMap()
+        inGeom = QgsGeometry( inFeat.geometry() )
+        outFeat.setGeometry( inGeom )
+        outFeat.setAttributeMap( atMap )
+        writer.addFeature( outFeat )
+        self.emit( SIGNAL( "featureProcessed()" ) )
+
+      self.emit( SIGNAL( "shapeProcessed()" ) )
+      self.mutex.lock()
+      s = self.stopMe
+      self.mutex.unlock()
+      if s == 1:
+        interrupted = True
+        break
+
+    del writer
+
+    if not interrupted:
+      self.emit( SIGNAL( "processingFinished()" ) )
+    else:
+      self.emit( SIGNAL( "processingInterrupted()" ) )
+
+  def stop( self ):
+    self.mutex.lock()
+    self.stopMe = 1
+    self.mutex.unlock()
+
+    QThread.wait( self )

Added: trunk/qgis/python/plugins/fTools/tools/frmMergeShapes.ui
===================================================================
--- trunk/qgis/python/plugins/fTools/tools/frmMergeShapes.ui	                        (rev 0)
+++ trunk/qgis/python/plugins/fTools/tools/frmMergeShapes.ui	2010-03-30 20:37:55 UTC (rev 13204)
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>377</width>
+    <height>246</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Merge shapefiles</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Input directory</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLineEdit" name="leInputDir"/>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnSelectDir">
+       <property name="text">
+        <string>Browse</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Output shapefile</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLineEdit" name="leOutShape"/>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnSelectFile">
+       <property name="text">
+        <string>Browse</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="chkAddToCanvas">
+     <property name="text">
+      <string>Add result to map canvas</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QProgressBar" name="progressFeatures">
+     <property name="value">
+      <number>0</number>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QProgressBar" name="progressFiles">
+     <property name="value">
+      <number>0</number>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Dialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>



More information about the QGIS-commit mailing list