[QGIS Commit] r11831 - in trunk/qgis: python/core src/app src/core src/ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Oct 24 09:30:36 EDT 2009


Author: timlinux
Date: 2009-10-24 09:30:36 -0400 (Sat, 24 Oct 2009)
New Revision: 11831

Modified:
   trunk/qgis/python/core/qgsmaplayer.sip
   trunk/qgis/python/core/qgsmaplayerregistry.sip
   trunk/qgis/src/app/qgisapp.cpp
   trunk/qgis/src/app/qgsoptions.cpp
   trunk/qgis/src/app/qgsrasterlayerproperties.cpp
   trunk/qgis/src/app/qgsvectorlayerproperties.cpp
   trunk/qgis/src/core/qgsmaplayer.cpp
   trunk/qgis/src/core/qgsmaplayer.h
   trunk/qgis/src/core/qgsmaplayerregistry.cpp
   trunk/qgis/src/core/qgsmaplayerregistry.h
   trunk/qgis/src/core/qgsmaprenderer.cpp
   trunk/qgis/src/core/qgsmaprenderer.h
   trunk/qgis/src/core/qgsvectorlayer.cpp
   trunk/qgis/src/ui/qgsoptionsbase.ui
Log:
[FEATURE] Applied patch from #1974 to enable render caching capability in QGIS. This speeds up common operations such as layer re-ordering, changing symbology, WMS / WFS client, hiding / showing layers and opens the door for future enhancements such as threaded rendering and pre-compositing layer cache manipulation.

Modified: trunk/qgis/python/core/qgsmaplayer.sip
===================================================================
--- trunk/qgis/python/core/qgsmaplayer.sip	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/python/core/qgsmaplayer.sip	2009-10-24 13:30:36 UTC (rev 11831)
@@ -252,6 +252,13 @@
     /** Return pointer to layer's undo stack */
     QUndoStack* undoStack();
 
+    /** Get the QImage used for caching render operations
+     * @note This method was added in QGIS 1.4 **/
+    QImage * cacheImage() { return mpCacheImage; }
+    /** Set the QImage used for caching render operations 
+     * @note This method was added in QGIS 1.4 **/
+    void setCacheImage( QImage * thepImage ); 
+
 public slots:
 
     /** Event handler for when a coordinate transform fails due to bad vertex error */

Modified: trunk/qgis/python/core/qgsmaplayerregistry.sip
===================================================================
--- trunk/qgis/python/core/qgsmaplayerregistry.sip	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/python/core/qgsmaplayerregistry.sip	2009-10-24 13:30:36 UTC (rev 11831)
@@ -59,6 +59,14 @@
  */
  void removeAllMapLayers();
 
+ /* Clears all layer caches, resetting them to zero and 
+ * freeing up any memory they may have been using. Layer
+ * caches are used to speed up rendering in certain situations
+ * see ticket #1974 for more details.
+ * @note this method was added in QGIS 1.4
+ */
+ void clearAllLayerCaches();
+
 signals:
 
     /** emitted when a layer is removed from the registry

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/app/qgisapp.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -4476,6 +4476,9 @@
 
 void QgisApp::refreshMapCanvas()
 {
+  //clear all caches first
+  QgsMapLayerRegistry::instance()->clearAllLayerCaches();
+  //then refresh
   mMapCanvas->refresh();
 }
 

Modified: trunk/qgis/src/app/qgsoptions.cpp
===================================================================
--- trunk/qgis/src/app/qgsoptions.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/app/qgsoptions.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -149,6 +149,7 @@
 
   //set the state of the checkboxes
   chkAntiAliasing->setChecked( settings.value( "/qgis/enable_anti_aliasing", false ).toBool() );
+  chkUseRenderCaching->setChecked( settings.value( "/qgis/enable_render_caching", false ).toBool() );
 
   // Slightly awkard here at the settings value is true to use QImage,
   // but the checkbox is true to use QPixmap
@@ -365,6 +366,7 @@
   settings.setValue( "/qgis/addPostgisDC", cbxAddPostgisDC->isChecked() );
   settings.setValue( "/qgis/new_layers_visible", chkAddedVisibility->isChecked() );
   settings.setValue( "/qgis/enable_anti_aliasing", chkAntiAliasing->isChecked() );
+  settings.setValue( "/qgis/enable_render_caching", chkUseRenderCaching->isChecked() );
   settings.setValue( "/qgis/use_qimage_to_render", !( chkUseQPixmap->isChecked() ) );
   settings.setValue( "qgis/capitaliseLayerName", capitaliseCheckBox->isChecked() );
   settings.setValue( "qgis/askToSaveProjectChanges", chbAskToSaveProjectChanges->isChecked() );
@@ -530,7 +532,9 @@
   // used (we we can. but it then doesn't do anti-aliasing, and this
   // will confuse people).
   if ( chkAntiAliasing->isChecked() )
+  {
     chkUseQPixmap->setChecked( false );
+  }
 
 }
 
@@ -540,7 +544,9 @@
   // used (we we can. but it then doesn't do anti-aliasing, and this
   // will confuse people).
   if ( chkUseQPixmap->isChecked() )
+  {
     chkAntiAliasing->setChecked( false );
+  }
 
 }
 

Modified: trunk/qgis/src/app/qgsrasterlayerproperties.cpp
===================================================================
--- trunk/qgis/src/app/qgsrasterlayerproperties.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/app/qgsrasterlayerproperties.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -1439,6 +1439,9 @@
   // update symbology
   emit refreshLegend( mRasterLayer->getLayerID(), false );
 
+  //no need to delete the old one, maplayer will do it if needed
+  mRasterLayer->setCacheImage( 0 );
+
   //make sure the layer is redrawn
   mRasterLayer->triggerRepaint();
 

Modified: trunk/qgis/src/app/qgsvectorlayerproperties.cpp
===================================================================
--- trunk/qgis/src/app/qgsvectorlayerproperties.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/app/qgsvectorlayerproperties.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -658,6 +658,9 @@
   // update symbology
   emit refreshLegend( layer->getLayerID(), false );
 
+  //no need to delete the old one, maplayer will do it if needed
+  layer->setCacheImage( 0 );
+
   layer->triggerRepaint();
   // notify the project we've made a change
   QgsProject::instance()->dirty( true );

Modified: trunk/qgis/src/core/qgsmaplayer.cpp
===================================================================
--- trunk/qgis/src/core/qgsmaplayer.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaplayer.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -75,6 +75,7 @@
   mMinScale = 0;
   mMaxScale = 100000000;
   mScaleBasedVisibility = false;
+  mpCacheImage = 0;
 }
 
 
@@ -82,6 +83,10 @@
 QgsMapLayer::~QgsMapLayer()
 {
   delete mCRS;
+  if ( mpCacheImage ) 
+  { 
+    delete mpCacheImage; 
+  }  
 }
 
 QgsMapLayer::LayerType QgsMapLayer::type() const
@@ -729,3 +734,13 @@
 {
   return &mUndoStack;
 }
+
+void QgsMapLayer::setCacheImage( QImage * thepImage ) 
+{ 
+  QgsDebugMsg( "cache Image set!" );
+  if ( mpCacheImage ) 
+  { 
+    delete mpCacheImage; 
+  }  
+  mpCacheImage = thepImage; 
+}

Modified: trunk/qgis/src/core/qgsmaplayer.h
===================================================================
--- trunk/qgis/src/core/qgsmaplayer.h	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaplayer.h	2009-10-24 13:30:36 UTC (rev 11831)
@@ -24,6 +24,7 @@
 
 #include <QObject>
 #include <QUndoStack>
+#include <QImage>
 
 #include "qgsrectangle.h"
 
@@ -263,6 +264,13 @@
     /** Return pointer to layer's undo stack */
     QUndoStack* undoStack();
 
+    /** Get the QImage used for caching render operations
+     * @note This method was added in QGIS 1.4 **/
+    QImage * cacheImage() { return mpCacheImage; }
+    /** Set the QImage used for caching render operations 
+     * @note This method was added in QGIS 1.4 **/
+    void setCacheImage( QImage * thepImage ); 
+
   public slots:
 
     /** Event handler for when a coordinate transform fails due to bad vertex error */
@@ -360,8 +368,13 @@
     /** A flag that tells us whether to use the above vars to restrict layer visibility */
     bool mScaleBasedVisibility;
 
+    /** Collection of undoable operations for this layer. **/
     QUndoStack mUndoStack;
 
+    /**QImage for caching of rendering operations
+     * @note This property was added in QGIS 1.4 **/
+    QImage * mpCacheImage;
+
 };
 
 #endif

Modified: trunk/qgis/src/core/qgsmaplayerregistry.cpp
===================================================================
--- trunk/qgis/src/core/qgsmaplayerregistry.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaplayerregistry.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -118,6 +118,16 @@
 
 } // QgsMapLayerRegistry::removeAllMapLayers()
 
+//Added in QGIS 1.4
+void QgsMapLayerRegistry::clearAllLayerCaches()
+{
+  QMap<QString, QgsMapLayer *>::iterator it;
+  for ( it = mMapLayers.begin(); it != mMapLayers.end() ; ++it )
+  {
+    //the map layer will take care of deleting the QImage
+    it.value()->setCacheImage( 0 );
+  }
+} // QgsMapLayerRegistry::clearAllLayerCaches()
 
 QMap<QString, QgsMapLayer*> & QgsMapLayerRegistry::mapLayers()
 {

Modified: trunk/qgis/src/core/qgsmaplayerregistry.h
===================================================================
--- trunk/qgis/src/core/qgsmaplayerregistry.h	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaplayerregistry.h	2009-10-24 13:30:36 UTC (rev 11831)
@@ -82,6 +82,13 @@
     */
     void removeAllMapLayers();
 
+    /* Clears all layer caches, resetting them to zero and 
+     * freeing up any memory they may have been using. Layer
+     * caches are used to speed up rendering in certain situations
+     * see ticket #1974 for more details.
+     * @note this method was added in QGIS 1.4
+     */
+     void clearAllLayerCaches();
   signals:
 
     /** emitted when a layer is removed from the registry

Modified: trunk/qgis/src/core/qgsmaprenderer.cpp
===================================================================
--- trunk/qgis/src/core/qgsmaprenderer.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaprenderer.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -80,6 +80,8 @@
 
 bool QgsMapRenderer::setExtent( const QgsRectangle& extent )
 {
+  //remember the previous extent
+  mLastExtent = mExtent;
 
   // Don't allow zooms where the current extent is so small that it
   // can't be accurately represented using a double (which is what
@@ -207,6 +209,11 @@
 
 void QgsMapRenderer::render( QPainter* painter )
 {
+  //flag to see if the render context has changed 
+  //since the last time we rendered. If it hasnt changed we can
+  //take some shortcuts with rendering
+  bool mySameAsLastFlag = true;
+
   QgsDebugMsg( "========== Rendering ==========" );
 
   if ( mExtent.isEmpty() )
@@ -216,7 +223,9 @@
   }
 
   if ( mDrawing )
+  {
     return;
+  }
 
   QPaintDevice* thePaintDevice = painter->device();
   if ( !thePaintDevice )
@@ -251,10 +260,40 @@
     scaleFactor = sceneDpi / 25.4;
   }
   double rasterScaleFactor = ( thePaintDevice->logicalDpiX() + thePaintDevice->logicalDpiY() ) / 2.0 / sceneDpi;
-  mRenderContext.setScaleFactor( scaleFactor );
-  mRenderContext.setRasterScaleFactor( rasterScaleFactor );
-  mRenderContext.setRendererScale( mScale );
+  if ( mRenderContext.rasterScaleFactor() != rasterScaleFactor )
+  {
+    mRenderContext.setRasterScaleFactor( rasterScaleFactor );
+    mySameAsLastFlag = false;
+  }
+  if ( mRenderContext.scaleFactor() != scaleFactor )
+  {
+    mRenderContext.setScaleFactor( scaleFactor );
+    mySameAsLastFlag = false;
+  }
+  if ( mRenderContext.rendererScale() != mScale )
+  {
+    //add map scale to render context
+    mRenderContext.setRendererScale( mScale );
+    mySameAsLastFlag = false;
+  }
+  if ( mLastExtent != mExtent )
+  {
+    mLastExtent = mExtent;
+    mySameAsLastFlag = false;
+  }
 
+  // know we know if this render is just a repeat of the last time, we 
+  // can clear caches if it has changed
+  if ( !mySameAsLastFlag )
+  {
+      //clear the cache pixmap if we changed resolution / extent
+      QSettings mySettings;
+      if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() )
+      {
+        QgsMapLayerRegistry::instance()->clearAllLayerCaches();
+      }
+  }
+
   bool placeOverlays = false;
   QgsOverlayObjectPositionManager* overlayManager = overlayManagerFromSettings();
   QList<QgsVectorOverlay*> allOverlayList; //list of all overlays, used to draw them after layers have been rendered
@@ -263,9 +302,6 @@
     placeOverlays = true;
   }
 
-  //add map scale to render context
-  mRenderContext.setRendererScale( mScale );
-
   // render all layers in the stack, starting at the base
   QListIterator<QString> li( mLayerSet );
   li.toBack();
@@ -279,6 +315,10 @@
       break;
     }
 
+    // Store the painter in case we need to swap it out for the 
+    // cache painter
+    QPainter * mypContextPainter = mRenderContext.painter();
+
     QString layerId = li.previous();
 
     QgsDebugMsg( "Rendering at layer item " + layerId );
@@ -343,17 +383,6 @@
       }
 
 
-      if ( scaleRaster )
-      {
-        bk_mapToPixel = mRenderContext.mapToPixel();
-        rasterMapToPixel = mRenderContext.mapToPixel();
-        rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor );
-        rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor );
-        mRenderContext.setMapToPixel( rasterMapToPixel );
-        mRenderContext.painter()->save();
-        mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
-      }
-
       //create overlay objects for features within the view extent
       if ( ml->type() == QgsMapLayer::VectorLayer && overlayManager )
       {
@@ -377,11 +406,67 @@
         }
       }
 
+      // Force render of layers that are being edited
+      if ( ml->type() == QgsMapLayer::VectorLayer )
+      {
+        QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
+        if ( vl->isEditable() )
+        {
+          ml->setCacheImage( 0 );
+        }
+      }
+        
+      QSettings mySettings;
+      if ( ! split )//render caching does not yet cater for split extents
+      {
+        if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() )
+        {
+          if ( !mySameAsLastFlag || ml->cacheImage() == 0 ) 
+          {
+            QgsDebugMsg( "\n\n\nCaching enabled but layer redraw forced by extent change or empty cache\n\n\n" );
+            QImage * mypImage = new QImage( mRenderContext.painter()->device()->width(), 
+                mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 ); 
+            mypImage->fill( 0 );
+            ml->setCacheImage( mypImage ); //no need to delete the oldone, maplayer does it for you
+            QPainter * mypPainter = new QPainter( ml->cacheImage() );
+            if ( mySettings.value( "/qgis/enable_anti_aliasing", false ).toBool() )
+            {
+              mypPainter->setRenderHint( QPainter::Antialiasing );
+            }
+            mRenderContext.setPainter( mypPainter  );
+          }
+          else if ( mySameAsLastFlag )
+          {
+            //draw from cached image
+            QgsDebugMsg( "\n\n\nCaching enabled --- drawing layer from cached image\n\n\n" );
+            mypContextPainter->drawImage( 0,0, *(ml->cacheImage()) );
+            disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
+            //short circuit as there is nothing else to do...
+            continue;
+          }
+        }
+      }
+
+      if ( scaleRaster )
+      {
+        bk_mapToPixel = mRenderContext.mapToPixel();
+        rasterMapToPixel = mRenderContext.mapToPixel();
+        rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor );
+        rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor );
+        mRenderContext.setMapToPixel( rasterMapToPixel );
+        mRenderContext.painter()->save();
+        mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
+      }
+
+
       if ( !ml->draw( mRenderContext ) )
       {
         emit drawError( ml );
       }
-
+      else
+      {
+            QgsDebugMsg( "\n\n\nLayer rendered without issues\n\n\n" );
+      }
       if ( split )
       {
         mRenderContext.setExtent( r2 );
@@ -397,12 +482,24 @@
         mRenderContext.painter()->restore();
       }
 
+      if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() )
+      {
+        if ( !split )
+        {
+          // composite the cached image into our view and then clean up from caching
+          // by reinstating the painter as it was swapped out for caching renders
+          delete mRenderContext.painter();
+          mRenderContext.setPainter( mypContextPainter  );
+          //draw from cached image that we created further up
+          mypContextPainter->drawImage( 0,0, *(ml->cacheImage()) );
+        }
+      }
       disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
     }
-    else
+    else // layer not visible due to scale
     {
       QgsDebugMsg( "Layer not rendered because it is not within the defined "
-                   "visibility scale range" );
+          "visibility scale range" );
     }
 
   } // while (li.hasPrevious())

Modified: trunk/qgis/src/core/qgsmaprenderer.h
===================================================================
--- trunk/qgis/src/core/qgsmaprenderer.h	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsmaprenderer.h	2009-10-24 13:30:36 UTC (rev 11831)
@@ -199,6 +199,13 @@
 
     //! current extent to be drawn
     QgsRectangle mExtent;
+    //
+    /** Last extent to we drew so we know if we can 
+        used layer render caching or not. Note there are no
+        accessors for this as it is intended to internal
+        use only.
+        @note added in QGIS 1.4 */
+    QgsRectangle mLastExtent;
 
     //! indicates whether it's map image for overview
     bool mOverview;

Modified: trunk/qgis/src/core/qgsvectorlayer.cpp
===================================================================
--- trunk/qgis/src/core/qgsvectorlayer.cpp	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/core/qgsvectorlayer.cpp	2009-10-24 13:30:36 UTC (rev 11831)
@@ -2768,6 +2768,9 @@
 bool QgsVectorLayer::commitChanges()
 {
   bool success = true;
+  
+  //clear the cache image so markers dont appear anymore on next draw
+  setCacheImage( 0 );
 
   mCommitErrors.clear();
 

Modified: trunk/qgis/src/ui/qgsoptionsbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsoptionsbase.ui	2009-10-22 22:30:16 UTC (rev 11830)
+++ trunk/qgis/src/ui/qgsoptionsbase.ui	2009-10-24 13:30:36 UTC (rev 11831)
@@ -13,9 +13,7 @@
    <string>Options</string>
   </property>
   <property name="windowIcon" >
-   <iconset>
-    <normaloff/>
-   </iconset>
+   <iconset/>
   </property>
   <property name="sizeGripEnabled" >
    <bool>true</bool>
@@ -195,21 +193,21 @@
            </widget>
           </item>
           <item row="1" column="0" colspan="2" >
-           <spacer name="verticalSpacer">
-            <property name="orientation">
+           <spacer>
+            <property name="orientation" >
              <enum>Qt::Vertical</enum>
             </property>
-            <property name="sizeType">
+            <property name="sizeType" >
              <enum>QSizePolicy::Fixed</enum>
             </property>
-            <property name="sizeHint" stdset="0">
+            <property name="sizeHint" >
              <size>
               <width>20</width>
               <height>10</height>
              </size>
             </property>
            </spacer>
-          </item>          
+          </item>
           <item row="2" column="0" colspan="2" >
            <widget class="QCheckBox" name="capitaliseCheckBox" >
             <property name="text" >
@@ -321,6 +319,13 @@
             </property>
            </widget>
           </item>
+          <item row="3" column="0" colspan="2" >
+           <widget class="QCheckBox" name="chkUseRenderCaching" >
+            <property name="text" >
+             <string>Use render caching where possible to speed up redraws</string>
+            </property>
+           </widget>
+          </item>
          </layout>
         </widget>
        </item>
@@ -369,8 +374,8 @@
          </property>
          <property name="sizeHint" >
           <size>
-           <width>20</width>
-           <height>40</height>
+           <width>614</width>
+           <height>111</height>
           </size>
          </property>
         </spacer>
@@ -1308,28 +1313,43 @@
   </customwidget>
  </customwidgets>
  <tabstops>
+  <tabstop>tabWidget</tabstop>
   <tabstop>chbAskToSaveProjectChanges</tabstop>
   <tabstop>chbWarnOldProjectVersion</tabstop>
   <tabstop>pbnSelectionColour</tabstop>
   <tabstop>pbnCanvasColor</tabstop>
   <tabstop>cmbTheme</tabstop>
   <tabstop>capitaliseCheckBox</tabstop>
+  <tabstop>cbxLegendClassifiers</tabstop>
   <tabstop>cbxHideSplash</tabstop>
+  <tabstop>cbxIdentifyResultsDocked</tabstop>
+  <tabstop>cbxAttributeTableDocked</tabstop>
+  <tabstop>cbxAddPostgisDC</tabstop>
   <tabstop>chkAddedVisibility</tabstop>
   <tabstop>spinBoxUpdateThreshold</tabstop>
+  <tabstop>chkUseRenderCaching</tabstop>
   <tabstop>chkAntiAliasing</tabstop>
   <tabstop>chkUseQPixmap</tabstop>
+  <tabstop>cmbIdentifyMode</tabstop>
   <tabstop>spinBoxIdentifyValue</tabstop>
   <tabstop>cmbEllipsoid</tabstop>
   <tabstop>pbnMeasureColour</tabstop>
+  <tabstop>radMeters</tabstop>
+  <tabstop>radFeet</tabstop>
   <tabstop>cmbWheelAction</tabstop>
   <tabstop>spinZoomFactor</tabstop>
+  <tabstop>mOverlayAlgorithmComboBox</tabstop>
   <tabstop>mLineWidthSpinBox</tabstop>
   <tabstop>mLineColourToolButton</tabstop>
   <tabstop>mDefaultSnapModeComboBox</tabstop>
   <tabstop>mDefaultSnappingToleranceSpinBox</tabstop>
   <tabstop>mSearchRadiusVertexEditSpinBox</tabstop>
+  <tabstop>mDefaultSnappingToleranceComboBox</tabstop>
+  <tabstop>mSearchRadiusVertexEditComboBox</tabstop>
+  <tabstop>mMarkersOnlyForSelectedCheckBox</tabstop>
   <tabstop>mMarkerStyleComboBox</tabstop>
+  <tabstop>mMarkerSizeSpinBox</tabstop>
+  <tabstop>chkDisableAttributeValuesDlg</tabstop>
   <tabstop>radPromptForProjection</tabstop>
   <tabstop>radUseProjectProjection</tabstop>
   <tabstop>radUseGlobalProjection</tabstop>
@@ -1337,8 +1357,16 @@
   <tabstop>pbnSelectProjection</tabstop>
   <tabstop>grpLocale</tabstop>
   <tabstop>cboLocale</tabstop>
+  <tabstop>grpProxy</tabstop>
+  <tabstop>leProxyHost</tabstop>
+  <tabstop>leProxyPort</tabstop>
+  <tabstop>leProxyUser</tabstop>
+  <tabstop>leProxyPassword</tabstop>
+  <tabstop>mProxyTypeComboBox</tabstop>
+  <tabstop>mAddUrlPushButton</tabstop>
+  <tabstop>mRemoveUrlPushButton</tabstop>
+  <tabstop>mExcludeUrlListWidget</tabstop>
   <tabstop>buttonBox</tabstop>
-  <tabstop>tabWidget</tabstop>
  </tabstops>
  <resources/>
  <connections/>



More information about the QGIS-commit mailing list