qgis_rendercachepatch_v7_23Oct2009.diff
python/core/qgsmaplayer.sip (working copy) | ||
---|---|---|
252 | 252 |
/** Return pointer to layer's undo stack */ |
253 | 253 |
QUndoStack* undoStack(); |
254 | 254 | |
255 |
/** Get the QImage used for caching render operations |
|
256 |
* @note This method was added in QGIS 1.4 **/ |
|
257 |
QImage * cacheImage() { return mpCacheImage; } |
|
258 |
/** Set the QImage used for caching render operations |
|
259 |
* @note This method was added in QGIS 1.4 **/ |
|
260 |
void setCacheImage( QImage * thepImage ); |
|
261 | ||
255 | 262 |
public slots: |
256 | 263 | |
257 | 264 |
/** Event handler for when a coordinate transform fails due to bad vertex error */ |
python/core/qgsmaplayerregistry.sip (working copy) | ||
---|---|---|
59 | 59 |
*/ |
60 | 60 |
void removeAllMapLayers(); |
61 | 61 | |
62 |
/* Clears all layer caches, resetting them to zero and |
|
63 |
* freeing up any memory they may have been using. Layer |
|
64 |
* caches are used to speed up rendering in certain situations |
|
65 |
* see ticket #1974 for more details. |
|
66 |
* @note this method was added in QGIS 1.4 |
|
67 |
*/ |
|
68 |
void clearAllLayerCaches(); |
|
69 | ||
62 | 70 |
signals: |
63 | 71 | |
64 | 72 |
/** emitted when a layer is removed from the registry |
src/app/qgsoptions.cpp (working copy) | ||
---|---|---|
149 | 149 | |
150 | 150 |
//set the state of the checkboxes |
151 | 151 |
chkAntiAliasing->setChecked( settings.value( "/qgis/enable_anti_aliasing", false ).toBool() ); |
152 |
chkUseRenderCaching->setChecked( settings.value( "/qgis/enable_render_caching", false ).toBool() ); |
|
152 | 153 | |
153 | 154 |
// Slightly awkard here at the settings value is true to use QImage, |
154 | 155 |
// but the checkbox is true to use QPixmap |
... | ... | |
365 | 366 |
settings.setValue( "/qgis/addPostgisDC", cbxAddPostgisDC->isChecked() ); |
366 | 367 |
settings.setValue( "/qgis/new_layers_visible", chkAddedVisibility->isChecked() ); |
367 | 368 |
settings.setValue( "/qgis/enable_anti_aliasing", chkAntiAliasing->isChecked() ); |
369 |
settings.setValue( "/qgis/enable_render_caching", chkUseRenderCaching->isChecked() ); |
|
368 | 370 |
settings.setValue( "/qgis/use_qimage_to_render", !( chkUseQPixmap->isChecked() ) ); |
369 | 371 |
settings.setValue( "qgis/capitaliseLayerName", capitaliseCheckBox->isChecked() ); |
370 | 372 |
settings.setValue( "qgis/askToSaveProjectChanges", chbAskToSaveProjectChanges->isChecked() ); |
... | ... | |
530 | 532 |
// used (we we can. but it then doesn't do anti-aliasing, and this |
531 | 533 |
// will confuse people). |
532 | 534 |
if ( chkAntiAliasing->isChecked() ) |
535 |
{ |
|
533 | 536 |
chkUseQPixmap->setChecked( false ); |
537 |
} |
|
534 | 538 | |
535 | 539 |
} |
536 | 540 | |
... | ... | |
540 | 544 |
// used (we we can. but it then doesn't do anti-aliasing, and this |
541 | 545 |
// will confuse people). |
542 | 546 |
if ( chkUseQPixmap->isChecked() ) |
547 |
{ |
|
543 | 548 |
chkAntiAliasing->setChecked( false ); |
549 |
} |
|
544 | 550 | |
545 | 551 |
} |
546 | 552 |
src/app/qgsvectorlayerproperties.cpp (working copy) | ||
---|---|---|
658 | 658 |
// update symbology |
659 | 659 |
emit refreshLegend( layer->getLayerID(), false ); |
660 | 660 | |
661 |
if ( layer->cacheImage() ) |
|
662 |
{ |
|
663 |
//no need to delete the old one, maplayer will do it if needed |
|
664 |
layer->setCacheImage( 0 ); |
|
665 |
} |
|
661 | 666 |
layer->triggerRepaint(); |
662 | 667 |
// notify the project we've made a change |
663 | 668 |
QgsProject::instance()->dirty( true ); |
src/app/qgisapp.cpp (working copy) | ||
---|---|---|
4476 | 4476 | |
4477 | 4477 |
void QgisApp::refreshMapCanvas() |
4478 | 4478 |
{ |
4479 |
//clear all caches first |
|
4480 |
QgsMapLayerRegistry::instance()->clearAllLayerCaches(); |
|
4481 |
//then refresh |
|
4479 | 4482 |
mMapCanvas->refresh(); |
4480 | 4483 |
} |
4481 | 4484 |
src/core/qgsvectorlayer.cpp (working copy) | ||
---|---|---|
2768 | 2768 |
bool QgsVectorLayer::commitChanges() |
2769 | 2769 |
{ |
2770 | 2770 |
bool success = true; |
2771 |
|
|
2772 |
//clear the cache image so markers dont appear anymore on next draw |
|
2773 |
setCacheImage( 0 ); |
|
2771 | 2774 | |
2772 | 2775 |
mCommitErrors.clear(); |
2773 | 2776 |
src/core/qgsmaprenderer.h (working copy) | ||
---|---|---|
199 | 199 | |
200 | 200 |
//! current extent to be drawn |
201 | 201 |
QgsRectangle mExtent; |
202 |
// |
|
203 |
/** Last extent to we drew so we know if we can |
|
204 |
used layer render caching or not. Note there are no |
|
205 |
accessors for this as it is intended to internal |
|
206 |
use only. |
|
207 |
@note added in QGIS 1.4 */ |
|
208 |
QgsRectangle mLastExtent; |
|
202 | 209 | |
203 | 210 |
//! indicates whether it's map image for overview |
204 | 211 |
bool mOverview; |
src/core/qgsmaplayer.cpp (working copy) | ||
---|---|---|
75 | 75 |
mMinScale = 0; |
76 | 76 |
mMaxScale = 100000000; |
77 | 77 |
mScaleBasedVisibility = false; |
78 |
mpCacheImage = 0; |
|
78 | 79 |
} |
79 | 80 | |
80 | 81 | |
... | ... | |
82 | 83 |
QgsMapLayer::~QgsMapLayer() |
83 | 84 |
{ |
84 | 85 |
delete mCRS; |
86 |
if ( mpCacheImage ) |
|
87 |
{ |
|
88 |
delete mpCacheImage; |
|
89 |
} |
|
85 | 90 |
} |
86 | 91 | |
87 | 92 |
QgsMapLayer::LayerType QgsMapLayer::type() const |
... | ... | |
729 | 734 |
{ |
730 | 735 |
return &mUndoStack; |
731 | 736 |
} |
737 | ||
738 |
void QgsMapLayer::setCacheImage( QImage * thepImage ) |
|
739 |
{ |
|
740 |
QgsDebugMsg( "cache Image set!" ); |
|
741 |
if ( mpCacheImage ) |
|
742 |
{ |
|
743 |
delete mpCacheImage; |
|
744 |
} |
|
745 |
mpCacheImage = thepImage; |
|
746 |
} |
src/core/qgsmaprenderer.cpp (working copy) | ||
---|---|---|
80 | 80 | |
81 | 81 |
bool QgsMapRenderer::setExtent( const QgsRectangle& extent ) |
82 | 82 |
{ |
83 |
//remember the previous extent |
|
84 |
mLastExtent = mExtent; |
|
83 | 85 | |
84 | 86 |
// Don't allow zooms where the current extent is so small that it |
85 | 87 |
// can't be accurately represented using a double (which is what |
... | ... | |
207 | 209 | |
208 | 210 |
void QgsMapRenderer::render( QPainter* painter ) |
209 | 211 |
{ |
212 |
//flag to see if the render context has changed |
|
213 |
//since the last time we rendered. If it hasnt changed we can |
|
214 |
//take some shortcuts with rendering |
|
215 |
bool mySameAsLastFlag = true; |
|
216 | ||
210 | 217 |
QgsDebugMsg( "========== Rendering ==========" ); |
211 | 218 | |
212 | 219 |
if ( mExtent.isEmpty() ) |
... | ... | |
216 | 223 |
} |
217 | 224 | |
218 | 225 |
if ( mDrawing ) |
226 |
{ |
|
219 | 227 |
return; |
228 |
} |
|
220 | 229 | |
221 | 230 |
QPaintDevice* thePaintDevice = painter->device(); |
222 | 231 |
if ( !thePaintDevice ) |
... | ... | |
251 | 260 |
scaleFactor = sceneDpi / 25.4; |
252 | 261 |
} |
253 | 262 |
double rasterScaleFactor = ( thePaintDevice->logicalDpiX() + thePaintDevice->logicalDpiY() ) / 2.0 / sceneDpi; |
254 |
mRenderContext.setScaleFactor( scaleFactor ); |
|
255 |
mRenderContext.setRasterScaleFactor( rasterScaleFactor ); |
|
256 |
mRenderContext.setRendererScale( mScale ); |
|
263 |
if ( mRenderContext.rasterScaleFactor() != rasterScaleFactor ) |
|
264 |
{ |
|
265 |
mRenderContext.setRasterScaleFactor( rasterScaleFactor ); |
|
266 |
mySameAsLastFlag = false; |
|
267 |
} |
|
268 |
if ( mRenderContext.scaleFactor() != scaleFactor ) |
|
269 |
{ |
|
270 |
mRenderContext.setScaleFactor( scaleFactor ); |
|
271 |
mySameAsLastFlag = false; |
|
272 |
} |
|
273 |
if ( mRenderContext.rendererScale() != mScale ) |
|
274 |
{ |
|
275 |
//add map scale to render context |
|
276 |
mRenderContext.setRendererScale( mScale ); |
|
277 |
mySameAsLastFlag = false; |
|
278 |
} |
|
279 |
if ( mLastExtent != mExtent ) |
|
280 |
{ |
|
281 |
mLastExtent = mExtent; |
|
282 |
mySameAsLastFlag = false; |
|
283 |
} |
|
257 | 284 | |
285 |
// know we know if this render is just a repeat of the last time, we |
|
286 |
// can clear caches if it has changed |
|
287 |
if ( !mySameAsLastFlag ) |
|
288 |
{ |
|
289 |
//clear the cache pixmap if we changed resolution / extent |
|
290 |
QSettings mySettings; |
|
291 |
if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() ) |
|
292 |
{ |
|
293 |
QgsMapLayerRegistry::instance()->clearAllLayerCaches(); |
|
294 |
} |
|
295 |
} |
|
296 | ||
258 | 297 |
bool placeOverlays = false; |
259 | 298 |
QgsOverlayObjectPositionManager* overlayManager = overlayManagerFromSettings(); |
260 | 299 |
QList<QgsVectorOverlay*> allOverlayList; //list of all overlays, used to draw them after layers have been rendered |
... | ... | |
263 | 302 |
placeOverlays = true; |
264 | 303 |
} |
265 | 304 | |
266 |
//add map scale to render context |
|
267 |
mRenderContext.setRendererScale( mScale ); |
|
268 | ||
269 | 305 |
// render all layers in the stack, starting at the base |
270 | 306 |
QListIterator<QString> li( mLayerSet ); |
271 | 307 |
li.toBack(); |
... | ... | |
279 | 315 |
break; |
280 | 316 |
} |
281 | 317 | |
318 |
// Store the painter in case we need to swap it out for the |
|
319 |
// cache painter |
|
320 |
QPainter * mypContextPainter = mRenderContext.painter(); |
|
321 | ||
282 | 322 |
QString layerId = li.previous(); |
283 | 323 | |
284 | 324 |
QgsDebugMsg( "Rendering at layer item " + layerId ); |
... | ... | |
343 | 383 |
} |
344 | 384 | |
345 | 385 | |
346 |
if ( scaleRaster ) |
|
347 |
{ |
|
348 |
bk_mapToPixel = mRenderContext.mapToPixel(); |
|
349 |
rasterMapToPixel = mRenderContext.mapToPixel(); |
|
350 |
rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor ); |
|
351 |
rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor ); |
|
352 |
mRenderContext.setMapToPixel( rasterMapToPixel ); |
|
353 |
mRenderContext.painter()->save(); |
|
354 |
mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor ); |
|
355 |
} |
|
356 | ||
357 | 386 |
//create overlay objects for features within the view extent |
358 | 387 |
if ( ml->type() == QgsMapLayer::VectorLayer && overlayManager ) |
359 | 388 |
{ |
... | ... | |
377 | 406 |
} |
378 | 407 |
} |
379 | 408 | |
409 |
// Force render of layers that are being edited |
|
410 |
if ( ml->type() == QgsMapLayer::VectorLayer ) |
|
411 |
{ |
|
412 |
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml ); |
|
413 |
if ( vl->isEditable() ) |
|
414 |
{ |
|
415 |
ml->setCacheImage( 0 ); |
|
416 |
} |
|
417 |
} |
|
418 |
|
|
419 |
QSettings mySettings; |
|
420 |
if ( ! split )//render caching does not yet cater for split extents |
|
421 |
{ |
|
422 |
if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() ) |
|
423 |
{ |
|
424 |
if ( !mySameAsLastFlag || ml->cacheImage() == 0 ) |
|
425 |
{ |
|
426 |
QgsDebugMsg( "\n\n\nCaching enabled but layer redraw forced by extent change or empty cache\n\n\n" ); |
|
427 |
QImage * mypImage = new QImage( mRenderContext.painter()->device()->width(), |
|
428 |
mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 ); |
|
429 |
mypImage->fill( 0 ); |
|
430 |
ml->setCacheImage( mypImage ); //no need to delete the oldone, maplayer does it for you |
|
431 |
QPainter * mypPainter = new QPainter( ml->cacheImage() ); |
|
432 |
if ( mySettings.value( "/qgis/enable_anti_aliasing", false ).toBool() ) |
|
433 |
{ |
|
434 |
mypPainter->setRenderHint( QPainter::Antialiasing ); |
|
435 |
} |
|
436 |
mRenderContext.setPainter( mypPainter ); |
|
437 |
} |
|
438 |
else if ( mySameAsLastFlag ) |
|
439 |
{ |
|
440 |
//draw from cached image |
|
441 |
QgsDebugMsg( "\n\n\nCaching enabled --- drawing layer from cached image\n\n\n" ); |
|
442 |
mypContextPainter->drawImage( 0,0, *(ml->cacheImage()) ); |
|
443 |
disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) ); |
|
444 |
//short circuit as there is nothing else to do... |
|
445 |
continue; |
|
446 |
} |
|
447 |
} |
|
448 |
} |
|
449 | ||
450 |
if ( scaleRaster ) |
|
451 |
{ |
|
452 |
bk_mapToPixel = mRenderContext.mapToPixel(); |
|
453 |
rasterMapToPixel = mRenderContext.mapToPixel(); |
|
454 |
rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor ); |
|
455 |
rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor ); |
|
456 |
mRenderContext.setMapToPixel( rasterMapToPixel ); |
|
457 |
mRenderContext.painter()->save(); |
|
458 |
mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor ); |
|
459 |
} |
|
460 | ||
461 | ||
380 | 462 |
if ( !ml->draw( mRenderContext ) ) |
381 | 463 |
{ |
382 | 464 |
emit drawError( ml ); |
383 | 465 |
} |
384 | ||
466 |
else |
|
467 |
{ |
|
468 |
QgsDebugMsg( "\n\n\nLayer rendered without issues\n\n\n" ); |
|
469 |
} |
|
385 | 470 |
if ( split ) |
386 | 471 |
{ |
387 | 472 |
mRenderContext.setExtent( r2 ); |
... | ... | |
397 | 482 |
mRenderContext.painter()->restore(); |
398 | 483 |
} |
399 | 484 | |
485 |
if ( mySettings.value ( "/qgis/enable_render_caching", false ).toBool() ) |
|
486 |
{ |
|
487 |
if ( !split ) |
|
488 |
{ |
|
489 |
// composite the cached image into our view and then clean up from caching |
|
490 |
// by reinstating the painter as it was swapped out for caching renders |
|
491 |
delete mRenderContext.painter(); |
|
492 |
mRenderContext.setPainter( mypContextPainter ); |
|
493 |
//draw from cached image that we created further up |
|
494 |
mypContextPainter->drawImage( 0,0, *(ml->cacheImage()) ); |
|
495 |
} |
|
496 |
} |
|
400 | 497 |
disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) ); |
401 | 498 |
} |
402 |
else |
|
499 |
else // layer not visible due to scale
|
|
403 | 500 |
{ |
404 | 501 |
QgsDebugMsg( "Layer not rendered because it is not within the defined " |
405 |
"visibility scale range" );
|
|
502 |
"visibility scale range" ); |
|
406 | 503 |
} |
407 | 504 | |
408 | 505 |
} // while (li.hasPrevious()) |
src/core/qgsmaplayerregistry.cpp (working copy) | ||
---|---|---|
118 | 118 | |
119 | 119 |
} // QgsMapLayerRegistry::removeAllMapLayers() |
120 | 120 | |
121 |
//Added in QGIS 1.4 |
|
122 |
void QgsMapLayerRegistry::clearAllLayerCaches() |
|
123 |
{ |
|
124 |
QMap<QString, QgsMapLayer *>::iterator it; |
|
125 |
for ( it = mMapLayers.begin(); it != mMapLayers.end() ; ++it ) |
|
126 |
{ |
|
127 |
//the map layer will take care of deleting the QImage |
|
128 |
it.value()->setCacheImage( 0 ); |
|
129 |
} |
|
130 |
} // QgsMapLayerRegistry::clearAllLayerCaches() |
|
121 | 131 | |
122 | 132 |
QMap<QString, QgsMapLayer*> & QgsMapLayerRegistry::mapLayers() |
123 | 133 |
{ |
src/core/qgsmaplayerregistry.h (working copy) | ||
---|---|---|
82 | 82 |
*/ |
83 | 83 |
void removeAllMapLayers(); |
84 | 84 | |
85 |
/* Clears all layer caches, resetting them to zero and |
|
86 |
* freeing up any memory they may have been using. Layer |
|
87 |
* caches are used to speed up rendering in certain situations |
|
88 |
* see ticket #1974 for more details. |
|
89 |
* @note this method was added in QGIS 1.4 |
|
90 |
*/ |
|
91 |
void clearAllLayerCaches(); |
|
85 | 92 |
signals: |
86 | 93 | |
87 | 94 |
/** emitted when a layer is removed from the registry |
src/core/qgsmaplayer.h (working copy) | ||
---|---|---|
24 | 24 | |
25 | 25 |
#include <QObject> |
26 | 26 |
#include <QUndoStack> |
27 |
#include <QImage> |
|
27 | 28 | |
28 | 29 |
#include "qgsrectangle.h" |
29 | 30 | |
... | ... | |
263 | 264 |
/** Return pointer to layer's undo stack */ |
264 | 265 |
QUndoStack* undoStack(); |
265 | 266 | |
267 |
/** Get the QImage used for caching render operations |
|
268 |
* @note This method was added in QGIS 1.4 **/ |
|
269 |
QImage * cacheImage() { return mpCacheImage; } |
|
270 |
/** Set the QImage used for caching render operations |
|
271 |
* @note This method was added in QGIS 1.4 **/ |
|
272 |
void setCacheImage( QImage * thepImage ); |
|
273 | ||
266 | 274 |
public slots: |
267 | 275 | |
268 | 276 |
/** Event handler for when a coordinate transform fails due to bad vertex error */ |
... | ... | |
360 | 368 |
/** A flag that tells us whether to use the above vars to restrict layer visibility */ |
361 | 369 |
bool mScaleBasedVisibility; |
362 | 370 | |
371 |
/** Collection of undoable operations for this layer. **/ |
|
363 | 372 |
QUndoStack mUndoStack; |
364 | 373 | |
374 |
/**QImage for caching of rendering operations |
|
375 |
* @note This property was added in QGIS 1.4 **/ |
|
376 |
QImage * mpCacheImage; |
|
377 | ||
365 | 378 |
}; |
366 | 379 | |
367 | 380 |
#endif |
src/ui/qgsoptionsbase.ui (working copy) | ||
---|---|---|
13 | 13 |
<string>Options</string> |
14 | 14 |
</property> |
15 | 15 |
<property name="windowIcon" > |
16 |
<iconset> |
|
17 |
<normaloff/> |
|
18 |
</iconset> |
|
16 |
<iconset/> |
|
19 | 17 |
</property> |
20 | 18 |
<property name="sizeGripEnabled" > |
21 | 19 |
<bool>true</bool> |
... | ... | |
195 | 193 |
</widget> |
196 | 194 |
</item> |
197 | 195 |
<item row="1" column="0" colspan="2" > |
198 |
<spacer name="verticalSpacer">
|
|
199 |
<property name="orientation"> |
|
196 |
<spacer> |
|
197 |
<property name="orientation" >
|
|
200 | 198 |
<enum>Qt::Vertical</enum> |
201 | 199 |
</property> |
202 |
<property name="sizeType"> |
|
200 |
<property name="sizeType" >
|
|
203 | 201 |
<enum>QSizePolicy::Fixed</enum> |
204 | 202 |
</property> |
205 |
<property name="sizeHint" stdset="0">
|
|
203 |
<property name="sizeHint" > |
|
206 | 204 |
<size> |
207 | 205 |
<width>20</width> |
208 | 206 |
<height>10</height> |
209 | 207 |
</size> |
210 | 208 |
</property> |
211 | 209 |
</spacer> |
212 |
</item>
|
|
210 |
</item> |
|
213 | 211 |
<item row="2" column="0" colspan="2" > |
214 | 212 |
<widget class="QCheckBox" name="capitaliseCheckBox" > |
215 | 213 |
<property name="text" > |
... | ... | |
321 | 319 |
</property> |
322 | 320 |
</widget> |
323 | 321 |
</item> |
322 |
<item row="3" column="0" colspan="2" > |
|
323 |
<widget class="QCheckBox" name="chkUseRenderCaching" > |
|
324 |
<property name="text" > |
|
325 |
<string>Use render caching where possible to speed up redraws</string> |
|
326 |
</property> |
|
327 |
</widget> |
|
328 |
</item> |
|
324 | 329 |
</layout> |
325 | 330 |
</widget> |
326 | 331 |
</item> |
... | ... | |
369 | 374 |
</property> |
370 | 375 |
<property name="sizeHint" > |
371 | 376 |
<size> |
372 |
<width>20</width>
|
|
373 |
<height>40</height>
|
|
377 |
<width>614</width>
|
|
378 |
<height>111</height>
|
|
374 | 379 |
</size> |
375 | 380 |
</property> |
376 | 381 |
</spacer> |
... | ... | |
1308 | 1313 |
</customwidget> |
1309 | 1314 |
</customwidgets> |
1310 | 1315 |
<tabstops> |
1316 |
<tabstop>tabWidget</tabstop> |
|
1311 | 1317 |
<tabstop>chbAskToSaveProjectChanges</tabstop> |
1312 | 1318 |
<tabstop>chbWarnOldProjectVersion</tabstop> |
1313 | 1319 |
<tabstop>pbnSelectionColour</tabstop> |
1314 | 1320 |
<tabstop>pbnCanvasColor</tabstop> |
1315 | 1321 |
<tabstop>cmbTheme</tabstop> |
1316 | 1322 |
<tabstop>capitaliseCheckBox</tabstop> |
1323 |
<tabstop>cbxLegendClassifiers</tabstop> |
|
1317 | 1324 |
<tabstop>cbxHideSplash</tabstop> |
1325 |
<tabstop>cbxIdentifyResultsDocked</tabstop> |
|
1326 |
<tabstop>cbxAttributeTableDocked</tabstop> |
|
1327 |
<tabstop>cbxAddPostgisDC</tabstop> |
|
1318 | 1328 |
<tabstop>chkAddedVisibility</tabstop> |
1319 | 1329 |
<tabstop>spinBoxUpdateThreshold</tabstop> |
1330 |
<tabstop>chkUseRenderCaching</tabstop> |
|
1320 | 1331 |
<tabstop>chkAntiAliasing</tabstop> |
1321 | 1332 |
<tabstop>chkUseQPixmap</tabstop> |
1333 |
<tabstop>cmbIdentifyMode</tabstop> |
|
1322 | 1334 |
<tabstop>spinBoxIdentifyValue</tabstop> |
1323 | 1335 |
<tabstop>cmbEllipsoid</tabstop> |
1324 | 1336 |
<tabstop>pbnMeasureColour</tabstop> |
1337 |
<tabstop>radMeters</tabstop> |
|
1338 |
<tabstop>radFeet</tabstop> |
|
1325 | 1339 |
<tabstop>cmbWheelAction</tabstop> |
1326 | 1340 |
<tabstop>spinZoomFactor</tabstop> |
1341 |
<tabstop>mOverlayAlgorithmComboBox</tabstop> |
|
1327 | 1342 |
<tabstop>mLineWidthSpinBox</tabstop> |
1328 | 1343 |
<tabstop>mLineColourToolButton</tabstop> |
1329 | 1344 |
<tabstop>mDefaultSnapModeComboBox</tabstop> |
1330 | 1345 |
<tabstop>mDefaultSnappingToleranceSpinBox</tabstop> |
1331 | 1346 |
<tabstop>mSearchRadiusVertexEditSpinBox</tabstop> |
1347 |
<tabstop>mDefaultSnappingToleranceComboBox</tabstop> |
|
1348 |
<tabstop>mSearchRadiusVertexEditComboBox</tabstop> |
|
1349 |
<tabstop>mMarkersOnlyForSelectedCheckBox</tabstop> |
|
1332 | 1350 |
<tabstop>mMarkerStyleComboBox</tabstop> |
1351 |
<tabstop>mMarkerSizeSpinBox</tabstop> |
|
1352 |
<tabstop>chkDisableAttributeValuesDlg</tabstop> |
|
1333 | 1353 |
<tabstop>radPromptForProjection</tabstop> |
1334 | 1354 |
<tabstop>radUseProjectProjection</tabstop> |
1335 | 1355 |
<tabstop>radUseGlobalProjection</tabstop> |
... | ... | |
1337 | 1357 |
<tabstop>pbnSelectProjection</tabstop> |
1338 | 1358 |
<tabstop>grpLocale</tabstop> |
1339 | 1359 |
<tabstop>cboLocale</tabstop> |
1360 |
<tabstop>grpProxy</tabstop> |
|
1361 |
<tabstop>leProxyHost</tabstop> |
|
1362 |
<tabstop>leProxyPort</tabstop> |
|
1363 |
<tabstop>leProxyUser</tabstop> |
|
1364 |
<tabstop>leProxyPassword</tabstop> |
|
1365 |
<tabstop>mProxyTypeComboBox</tabstop> |
|
1366 |
<tabstop>mAddUrlPushButton</tabstop> |
|
1367 |
<tabstop>mRemoveUrlPushButton</tabstop> |
|
1368 |
<tabstop>mExcludeUrlListWidget</tabstop> |
|
1340 | 1369 |
<tabstop>buttonBox</tabstop> |
1341 |
<tabstop>tabWidget</tabstop> |
|
1342 | 1370 |
</tabstops> |
1343 | 1371 |
<resources/> |
1344 | 1372 |
<connections/> |