[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