mirror of
https://github.com/qgis/QGIS.git
synced 2025-06-19 00:02:48 -04:00
[FEATURE] add a map canvas magnifier
This commit is contained in:
parent
948c1f0298
commit
9a62613b6b
@ -14,6 +14,12 @@ class QgsDoubleSpinBox : QDoubleSpinBox
|
||||
|
||||
explicit QgsDoubleSpinBox( QWidget *parent /TransferThis/ = 0 );
|
||||
|
||||
/** Sets background color of QLineEdit widget within spin box
|
||||
* @param color the background color
|
||||
* @note added in QGIS 2.16
|
||||
*/
|
||||
void setBackgroundColor( const QColor *color = nullptr );
|
||||
|
||||
//! determines if the widget will show a clear button
|
||||
//! @note the clear button will set the widget to its minimum value
|
||||
void setShowClearButton( const bool showClearButton );
|
||||
|
@ -50,6 +50,15 @@ class QgsMapCanvas : QGraphicsView
|
||||
//! Destructor
|
||||
~QgsMapCanvas();
|
||||
|
||||
//! Sets the factor of magnification to apply to the map canvas. Indeed, we
|
||||
//! increase/decrease the DPI of the map settings according to this factor
|
||||
//! in order to render marker point, labels, ... bigger.
|
||||
//! @note added in 2.16
|
||||
void setMagnificationFactor( double level );
|
||||
|
||||
//! Returns the magnification factor
|
||||
double magnificationFactor() const;
|
||||
|
||||
void setLayerSet( QList<QgsMapCanvasLayer>& layers );
|
||||
|
||||
void setCurrentLayer( QgsMapLayer* layer );
|
||||
|
@ -51,6 +51,7 @@ SET(QGIS_APP_SRCS
|
||||
qgsrulebasedlabelingwidget.cpp
|
||||
qgssavestyletodbdialog.cpp
|
||||
qgsstatusbarcoordinateswidget.cpp
|
||||
qgsstatusbarmagnifierwidget.cpp
|
||||
qgsversioninfo.cpp
|
||||
qgswelcomepageitemsmodel.cpp
|
||||
qgswelcomepage.cpp
|
||||
@ -226,6 +227,7 @@ SET (QGIS_APP_MOC_HDRS
|
||||
qgssavestyletodbdialog.h
|
||||
qgsshortcutsmanager.h
|
||||
qgsstatusbarcoordinateswidget.h
|
||||
qgsstatusbarmagnifierwidget.h
|
||||
qgsversioninfo.h
|
||||
qgswelcomepageitemsmodel.h
|
||||
qgswelcomepage.h
|
||||
|
@ -123,6 +123,7 @@
|
||||
#include "qgscomposermanager.h"
|
||||
#include "qgscomposerview.h"
|
||||
#include "qgsstatusbarcoordinateswidget.h"
|
||||
#include "qgsstatusbarmagnifierwidget.h"
|
||||
#include "qgsconfigureshortcutsdialog.h"
|
||||
#include "qgscoordinatetransform.h"
|
||||
#include "qgscoordinateutils.h"
|
||||
@ -544,6 +545,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
|
||||
, mScaleLabel( nullptr )
|
||||
, mScaleEdit( nullptr )
|
||||
, mScaleEditValidator( nullptr )
|
||||
, mMagnifierWidget( nullptr )
|
||||
, mCoordsEdit( nullptr )
|
||||
, mRotationLabel( nullptr )
|
||||
, mRotationEdit( nullptr )
|
||||
@ -997,6 +999,7 @@ QgisApp::QgisApp()
|
||||
, mScaleLabel( nullptr )
|
||||
, mScaleEdit( nullptr )
|
||||
, mScaleEditValidator( nullptr )
|
||||
, mMagnifierWidget( nullptr )
|
||||
, mCoordsEdit( nullptr )
|
||||
, mRotationLabel( nullptr )
|
||||
, mRotationEdit( nullptr )
|
||||
@ -2095,6 +2098,13 @@ void QgisApp::createStatusBar()
|
||||
statusBar()->addPermanentWidget( mScaleEdit, 0 );
|
||||
connect( mScaleEdit, SIGNAL( scaleChanged( double ) ), this, SLOT( userScale() ) );
|
||||
|
||||
// zoom widget
|
||||
QSettings mySettings;
|
||||
mMagnifierWidget = new QgsStatusBarMagnifierWidget( statusBar(), mMapCanvas );
|
||||
mMagnifierWidget->setFont( myFont );
|
||||
mMagnifierWidget->setMagnificationLevel( mySettings.value( "/qgis/magnifier_level", 100 ).toInt() );
|
||||
statusBar()->addPermanentWidget( mMagnifierWidget, 0 );
|
||||
|
||||
if ( QgsMapCanvas::rotationEnabled() )
|
||||
{
|
||||
// add a widget to show/set current rotation
|
||||
@ -8478,6 +8488,8 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString& currentPage )
|
||||
layer->setLayerName( layer->originalName() );
|
||||
}
|
||||
|
||||
mMagnifierWidget->setMagnificationLevel( mySettings.value( "/qgis/magnifier_level" ).toInt() );
|
||||
|
||||
//update any open compositions so they reflect new composer settings
|
||||
//we have to push the changes to the compositions here, because compositions
|
||||
//have no access to qgisapp and accordingly can't listen in to changes
|
||||
|
@ -45,6 +45,7 @@ class QgsComposer;
|
||||
class QgsComposerManager;
|
||||
class QgsComposerView;
|
||||
class QgsStatusBarCoordinatesWidget;
|
||||
class QgsStatusBarMagnifierWidget;
|
||||
class QgsContrastEnhancement;
|
||||
class QgsCustomLayerOrderWidget;
|
||||
class QgsDoubleSpinBox;
|
||||
@ -1591,6 +1592,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
|
||||
//! The validator for the mScaleEdit
|
||||
QValidator * mScaleEditValidator;
|
||||
|
||||
//! zoom widget
|
||||
QgsStatusBarMagnifierWidget *mMagnifierWidget;
|
||||
|
||||
//! Widget that will live in the statusbar to display and edit coords
|
||||
QgsStatusBarCoordinatesWidget *mCoordsEdit;
|
||||
|
||||
|
@ -589,6 +589,13 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl )
|
||||
mSimplifyMaximumScaleComboBox->updateScales( myScalesList );
|
||||
mSimplifyMaximumScaleComboBox->setScale( 1.0 / mSettings->value( "/qgis/simplifyMaxScale", 1 ).toFloat() );
|
||||
|
||||
// Magnifier
|
||||
doubleSpinBoxMagnifierDefault->setRange( 100, 1000 );
|
||||
doubleSpinBoxMagnifierDefault->setSingleStep( 50 );
|
||||
doubleSpinBoxMagnifierDefault->setDecimals( 0 );
|
||||
doubleSpinBoxMagnifierDefault->setSuffix( "%" );
|
||||
doubleSpinBoxMagnifierDefault->setValue( mSettings->value( "/qgis/magnifier_level", 100 ).toInt() );
|
||||
|
||||
// Slightly awkard here at the settings value is true to use QImage,
|
||||
// but the checkbox is true to use QPixmap
|
||||
chkAddedVisibility->setChecked( mSettings->value( "/qgis/new_layers_visible", true ).toBool() );
|
||||
@ -1194,6 +1201,9 @@ void QgsOptions::saveOptions()
|
||||
mSettings->setValue( "/qgis/simplifyLocal", !mSimplifyDrawingAtProvider->isChecked() );
|
||||
mSettings->setValue( "/qgis/simplifyMaxScale", 1.0 / mSimplifyMaximumScaleComboBox->scale() );
|
||||
|
||||
// magnification
|
||||
mSettings->setValue( "/qgis/magnifier_level", doubleSpinBoxMagnifierDefault->value() );
|
||||
|
||||
// project
|
||||
mSettings->setValue( "/qgis/projOpenAtLaunch", mProjectOnLaunchCmbBx->currentIndex() );
|
||||
mSettings->setValue( "/qgis/projOpenAtLaunchPath", mProjectOnLaunchLineEdit->text() );
|
||||
|
114
src/app/qgsstatusbarmagnifierwidget.cpp
Normal file
114
src/app/qgsstatusbarmagnifierwidget.cpp
Normal file
@ -0,0 +1,114 @@
|
||||
/***************************************************************************
|
||||
qgsstatusbarmagnifierwidget.cpp
|
||||
begin : April 2016
|
||||
copyright : (C) 2016 Paul Blottiere, Oslandia
|
||||
email : paul dot blottiere at oslandia 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include <QFont>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
|
||||
#include <qgsapplication.h>
|
||||
#include "qgsstatusbarmagnifierwidget.h"
|
||||
#include "qgsmapcanvas.h"
|
||||
#include "qgsdoublespinbox.h"
|
||||
|
||||
QgsStatusBarMagnifierWidget::QgsStatusBarMagnifierWidget( QWidget* parent,
|
||||
QgsMapCanvas *canvas ) :
|
||||
QWidget( parent ),
|
||||
mCanvas( canvas ),
|
||||
mMagnifier( 100 ),
|
||||
mMagnifierMin( 100 ),
|
||||
mMagnifierMax( 1000 )
|
||||
{
|
||||
// label
|
||||
mLabel = new QLabel( this );
|
||||
mLabel->setMinimumWidth( 10 );
|
||||
mLabel->setMargin( 3 );
|
||||
mLabel->setAlignment( Qt::AlignCenter );
|
||||
mLabel->setFrameStyle( QFrame::NoFrame );
|
||||
mLabel->setText( tr( "Magnifier" ) );
|
||||
mLabel->setToolTip( tr( "Magnifier" ) );
|
||||
|
||||
mSpinBox = new QgsDoubleSpinBox( this );
|
||||
mSpinBox->setSuffix( "%" );
|
||||
mSpinBox->setClearValue( mMagnifierMin );
|
||||
mSpinBox->setKeyboardTracking( false );
|
||||
mSpinBox->setMaximumWidth( 120 );
|
||||
mSpinBox->setDecimals( 0 );
|
||||
mSpinBox->setRange( mMagnifierMin, mMagnifierMax );
|
||||
mSpinBox->setWrapping( false );
|
||||
mSpinBox->setSingleStep( 50 );
|
||||
mSpinBox->setToolTip( tr( "Magnifier level" ) );
|
||||
|
||||
connect( mSpinBox, SIGNAL( valueChanged( double ) ), this,
|
||||
SLOT( updateMagnifier() ) );
|
||||
|
||||
// layout
|
||||
mLayout = new QHBoxLayout( this );
|
||||
mLayout->addWidget( mLabel );
|
||||
mLayout->addWidget( mSpinBox );
|
||||
mLayout->setContentsMargins( 0, 0, 0, 0 );
|
||||
mLayout->setAlignment( Qt::AlignRight );
|
||||
mLayout->setSpacing( 0 );
|
||||
|
||||
setLayout( mLayout );
|
||||
|
||||
updateMagnifier();
|
||||
}
|
||||
|
||||
QgsStatusBarMagnifierWidget::~QgsStatusBarMagnifierWidget()
|
||||
{
|
||||
}
|
||||
|
||||
double QgsStatusBarMagnifierWidget::magnificationLevel()
|
||||
{
|
||||
return mMagnifier;
|
||||
}
|
||||
|
||||
void QgsStatusBarMagnifierWidget::setFont( const QFont& myFont )
|
||||
{
|
||||
mLabel->setFont( myFont );
|
||||
mSpinBox->setFont( myFont );
|
||||
}
|
||||
|
||||
bool QgsStatusBarMagnifierWidget::setMagnificationLevel( int level )
|
||||
{
|
||||
bool rc = false;
|
||||
|
||||
if ( level >= mMagnifierMin && level <= mMagnifierMax )
|
||||
{
|
||||
mSpinBox->setValue( level );
|
||||
rc = true;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void QgsStatusBarMagnifierWidget::updateMagnifier()
|
||||
{
|
||||
// get current data
|
||||
mMagnifier = mSpinBox->value();
|
||||
|
||||
// update background color
|
||||
QSettings mySettings;
|
||||
int value = mySettings.value( "/qgis/magnifier_level", 100 ).toInt();
|
||||
|
||||
if ( mMagnifier == value )
|
||||
mSpinBox->setBackgroundColor();
|
||||
else
|
||||
mSpinBox->setBackgroundColor( new QColor( 200, 200, 255 ) );
|
||||
|
||||
// update map canvas
|
||||
mCanvas->setMagnificationFactor( mMagnifier / double( mMagnifierMin ) );
|
||||
}
|
78
src/app/qgsstatusbarmagnifierwidget.h
Normal file
78
src/app/qgsstatusbarmagnifierwidget.h
Normal file
@ -0,0 +1,78 @@
|
||||
/***************************************************************************
|
||||
qgsstatusbarmagnifierwidget.h
|
||||
begin : April 2016
|
||||
copyright : (C) 2016 Paul Blottiere, Oslandia
|
||||
email : paul dot blottiere at oslandia 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSSTATUSBARMAGNIFIERWIDGET_H
|
||||
#define QGSSTATUSBARMAGNIFIERWIDGET_H
|
||||
|
||||
class QLabel;
|
||||
class QFont;
|
||||
class QHBoxLayout;
|
||||
class QgsMapCanvas;
|
||||
class QgsDoubleSpinBox;
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
/**
|
||||
* A widget which lets the user select the current level of magnification to
|
||||
* apply to the canvas.
|
||||
* @note added in 2.16
|
||||
*/
|
||||
class APP_EXPORT QgsStatusBarMagnifierWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
/** Constructor
|
||||
* @param parent is the parent widget
|
||||
* @param canvas the map canvas
|
||||
*/
|
||||
QgsStatusBarMagnifierWidget( QWidget* parent, QgsMapCanvas *canvas );
|
||||
|
||||
/** Destructor */
|
||||
virtual ~QgsStatusBarMagnifierWidget();
|
||||
|
||||
/** Set the font of the text
|
||||
* @param font the font to use
|
||||
*/
|
||||
void setFont( const QFont& font );
|
||||
|
||||
/** Returns the current magnification level
|
||||
* @return magnification level
|
||||
*/
|
||||
double magnificationLevel();
|
||||
|
||||
/** Set the magnification level
|
||||
* @param level the magnification level
|
||||
* @return true if the level is valid, false otherwise
|
||||
*/
|
||||
bool setMagnificationLevel( int level );
|
||||
|
||||
private slots:
|
||||
|
||||
void updateMagnifier();
|
||||
|
||||
private:
|
||||
QgsMapCanvas *mCanvas;
|
||||
QHBoxLayout *mLayout;
|
||||
QLabel *mLabel;
|
||||
QgsDoubleSpinBox *mSpinBox;
|
||||
int mMagnifier;
|
||||
int mMagnifierMin;
|
||||
int mMagnifierMax;
|
||||
};
|
||||
|
||||
#endif
|
@ -283,7 +283,6 @@ class CORE_EXPORT QgsMapSettings
|
||||
double mMapUnitsPerPixel;
|
||||
double mScale;
|
||||
|
||||
|
||||
// utiity stuff
|
||||
QgsScaleCalculator mScaleCalculator;
|
||||
QgsMapToPixel mMapToPixel;
|
||||
|
@ -46,6 +46,19 @@ QgsDoubleSpinBox::QgsDoubleSpinBox( QWidget *parent )
|
||||
connect( this, SIGNAL( valueChanged( double ) ), this, SLOT( changed( double ) ) );
|
||||
}
|
||||
|
||||
void QgsDoubleSpinBox::setBackgroundColor( const QColor *c )
|
||||
{
|
||||
if ( c )
|
||||
{
|
||||
QString rgb = QString( "rgb(%1, %2, %3)" ).arg( c->red() ).arg( c->green() ).arg( c->blue() );
|
||||
this->lineEdit()->setStyleSheet( QString( "background-color: %1" ).arg( rgb ) );
|
||||
}
|
||||
else
|
||||
this->lineEdit()->setStyleSheet( "" );
|
||||
|
||||
this->setStyleSheet( "" );
|
||||
}
|
||||
|
||||
void QgsDoubleSpinBox::setShowClearButton( const bool showClearButton )
|
||||
{
|
||||
mShowClearButton = showClearButton;
|
||||
|
@ -40,6 +40,12 @@ class GUI_EXPORT QgsDoubleSpinBox : public QDoubleSpinBox
|
||||
|
||||
explicit QgsDoubleSpinBox( QWidget *parent = nullptr );
|
||||
|
||||
/** Sets background color of QLineEdit widget within spin box
|
||||
* @param color the background color
|
||||
* @note added in QGIS 2.16
|
||||
*/
|
||||
void setBackgroundColor( const QColor *color = nullptr );
|
||||
|
||||
//! determines if the widget will show a clear button
|
||||
//! @note the clear button will set the widget to its minimum value
|
||||
void setShowClearButton( const bool showClearButton );
|
||||
@ -80,10 +86,11 @@ class GUI_EXPORT QgsDoubleSpinBox : public QDoubleSpinBox
|
||||
virtual double valueFromText( const QString & text ) const override;
|
||||
virtual QValidator::State validate( QString & input, int & pos ) const override;
|
||||
|
||||
void paintEvent( QPaintEvent* e ) override;
|
||||
|
||||
protected:
|
||||
virtual void resizeEvent( QResizeEvent* event ) override;
|
||||
virtual void changeEvent( QEvent* event ) override;
|
||||
virtual void paintEvent( QPaintEvent* event ) override;
|
||||
|
||||
private slots:
|
||||
void changed( double value );
|
||||
@ -92,6 +99,8 @@ class GUI_EXPORT QgsDoubleSpinBox : public QDoubleSpinBox
|
||||
int frameWidth() const;
|
||||
bool shouldShowClearForValue( const double value ) const;
|
||||
|
||||
void updateStyleSheet( const QColor& backgroundColor = QColor() );
|
||||
|
||||
bool mShowClearButton;
|
||||
ClearValueMode mClearValueMode;
|
||||
double mCustomClearValue;
|
||||
|
@ -189,6 +189,7 @@ void QgsMapCanvasRendererSync::onLayersC2R()
|
||||
QgsMapCanvas::QgsMapCanvas( QWidget * parent, const char *name )
|
||||
: QGraphicsView( parent )
|
||||
, mCanvasProperties( new CanvasProperties )
|
||||
, mMagnificationFactor( 1.0 )
|
||||
, mJob( nullptr )
|
||||
, mJobCancelled( false )
|
||||
, mLabelingResults( nullptr )
|
||||
@ -310,6 +311,16 @@ QgsMapCanvas::~QgsMapCanvas()
|
||||
|
||||
} // dtor
|
||||
|
||||
void QgsMapCanvas::setMagnificationFactor( double level )
|
||||
{
|
||||
QgsRectangle ext = extent();
|
||||
ext.scale( mMagnificationFactor / level );
|
||||
|
||||
mMagnificationFactor = level;
|
||||
mSettings.setExtent( ext );
|
||||
refresh();
|
||||
}
|
||||
|
||||
void QgsMapCanvas::enableAntiAliasing( bool theFlag )
|
||||
{
|
||||
mSettings.setFlag( QgsMapSettings::Antialiasing, theFlag );
|
||||
@ -678,13 +689,17 @@ void QgsMapCanvas::refreshMap()
|
||||
|
||||
mSettings.setExpressionContext( expressionContext );
|
||||
|
||||
// magnify level to use in renderers
|
||||
QgsMapSettings settings = mSettings;
|
||||
settings.setOutputDpi( settings.outputDpi() * mMagnificationFactor );
|
||||
|
||||
// create the renderer job
|
||||
Q_ASSERT( !mJob );
|
||||
mJobCancelled = false;
|
||||
if ( mUseParallelRendering )
|
||||
mJob = new QgsMapRendererParallelJob( mSettings );
|
||||
mJob = new QgsMapRendererParallelJob( settings );
|
||||
else
|
||||
mJob = new QgsMapRendererSequentialJob( mSettings );
|
||||
mJob = new QgsMapRendererSequentialJob( settings );
|
||||
connect( mJob, SIGNAL( finished() ), SLOT( rendererJobFinished() ) );
|
||||
mJob->setCache( mCache );
|
||||
|
||||
@ -757,7 +772,7 @@ void QgsMapCanvas::rendererJobFinished()
|
||||
|
||||
p.end();
|
||||
|
||||
mMap->setContent( img, imageRect( img, mJob->mapSettings() ) );
|
||||
mMap->setContent( img, imageRect( img, mSettings ) );
|
||||
}
|
||||
|
||||
// now we are in a slot called from mJob - do not delete it immediately
|
||||
@ -782,7 +797,7 @@ QgsRectangle QgsMapCanvas::imageRect( const QImage& img, const QgsMapSettings& m
|
||||
void QgsMapCanvas::mapUpdateTimeout()
|
||||
{
|
||||
const QImage& img = mJob->renderedImage();
|
||||
mMap->setContent( img, imageRect( img, mJob->mapSettings() ) );
|
||||
mMap->setContent( img, imageRect( img, mSettings ) );
|
||||
}
|
||||
|
||||
void QgsMapCanvas::stopRendering()
|
||||
|
@ -119,6 +119,15 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
|
||||
//! Destructor
|
||||
~QgsMapCanvas();
|
||||
|
||||
//! Sets the factor of magnification to apply to the map canvas. Indeed, we
|
||||
//! increase/decrease the DPI of the map settings according to this factor
|
||||
//! in order to render marker point, labels, ... bigger.
|
||||
//! @note added in 2.16
|
||||
void setMagnificationFactor( double level );
|
||||
|
||||
//! Returns the magnification factor
|
||||
double magnificationFactor() const { return mMagnificationFactor; };
|
||||
|
||||
void setLayerSet( QList<QgsMapCanvasLayer>& layers );
|
||||
|
||||
void setCurrentLayer( QgsMapLayer* layer );
|
||||
@ -722,6 +731,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
|
||||
//! Timer that periodically fires while map rendering is in progress to update the visible map
|
||||
QTimer mMapUpdateTimer;
|
||||
|
||||
//! magnification factor
|
||||
double mMagnificationFactor;
|
||||
|
||||
//! Job that takes care of map rendering in background
|
||||
QgsMapRendererQImageJob* mJob;
|
||||
|
||||
|
@ -2045,6 +2045,39 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelMagnifier">
|
||||
<property name="text">
|
||||
<string>Magnification level</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="doubleSpinBoxMagnifierDefault"/>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -17,7 +17,10 @@
|
||||
|
||||
#include <qgsapplication.h>
|
||||
#include <qgsmapcanvas.h>
|
||||
#include <qgsvectorlayer.h>
|
||||
#include <qgsmaprenderer.h>
|
||||
#include <qgsmaplayerregistry.h>
|
||||
#include <qgsrenderchecker.h>
|
||||
|
||||
namespace QTest
|
||||
{
|
||||
@ -43,6 +46,7 @@ class TestQgsMapCanvas : public QObject
|
||||
|
||||
void testMapRendererInteraction();
|
||||
void testPanByKeyboard();
|
||||
void testMagnification();
|
||||
|
||||
private:
|
||||
QgsMapCanvas* mCanvas;
|
||||
@ -53,6 +57,7 @@ class TestQgsMapCanvas : public QObject
|
||||
void TestQgsMapCanvas::initTestCase()
|
||||
{
|
||||
QgsApplication::init(); // init paths for CRS lookup
|
||||
QgsApplication::initQgis();
|
||||
|
||||
mCanvas = new QgsMapCanvas();
|
||||
}
|
||||
@ -154,6 +159,79 @@ void TestQgsMapCanvas::testPanByKeyboard()
|
||||
}
|
||||
}
|
||||
|
||||
void TestQgsMapCanvas::testMagnification()
|
||||
{
|
||||
// test directory
|
||||
QString testDataDir = QString( TEST_DATA_DIR ) + '/';
|
||||
QString controlImageDir = testDataDir + "control_images/expected_map_magnification/";
|
||||
|
||||
// prepare spy and unit testing stuff
|
||||
QgsRenderChecker checker;
|
||||
checker.setControlPathPrefix( "mapcanvas" );
|
||||
checker.setColorTolerance( 5 );
|
||||
|
||||
QSignalSpy spy( mCanvas, SIGNAL( mapCanvasRefreshed() ) );
|
||||
|
||||
QEventLoop loop;
|
||||
QObject::connect( mCanvas, SIGNAL( mapCanvasRefreshed() ), &loop, SLOT( quit() ) );
|
||||
|
||||
QTimer timer;
|
||||
QObject::connect( &timer, SIGNAL( timeout() ), &loop, SLOT( quit() ) );
|
||||
|
||||
QTemporaryFile tmpFile;
|
||||
tmpFile.setAutoRemove( false );
|
||||
tmpFile.open(); // fileName is not available until open
|
||||
QString tmpName = tmpFile.fileName();
|
||||
tmpFile.close();
|
||||
|
||||
// build vector layer
|
||||
QString myPointsFileName = testDataDir + "points.shp";
|
||||
QFileInfo myPointFileInfo( myPointsFileName );
|
||||
QgsVectorLayer *layer = new QgsVectorLayer( myPointFileInfo.filePath(),
|
||||
myPointFileInfo.completeBaseName(), "ogr" );
|
||||
|
||||
// prepare map canvas
|
||||
QList<QgsMapCanvasLayer> layers;
|
||||
layers.append( layer );
|
||||
mCanvas->setLayerSet( layers );
|
||||
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer *>() << layer );
|
||||
|
||||
mCanvas->setExtent( layer->extent() );
|
||||
|
||||
// refresh and wait for rendering
|
||||
mCanvas->refresh();
|
||||
timer.start( 3000 );
|
||||
loop.exec();
|
||||
QCOMPARE( spy.count(), 1 );
|
||||
spy.clear();
|
||||
|
||||
// control image with magnification factor 1.0
|
||||
mCanvas->saveAsImage( tmpName );
|
||||
|
||||
checker.setControlName( "expected_map_magnification" );
|
||||
checker.setRenderedImage( tmpName );
|
||||
checker.setSizeTolerance( 2, 2 );
|
||||
QCOMPARE( checker.compareImages( "map_magnification", 100 ), true );
|
||||
|
||||
// set magnification factor (auto refresh)
|
||||
mCanvas->setMagnificationFactor( 6.5 );
|
||||
QCOMPARE( mCanvas->magnificationFactor(), 6.5 );
|
||||
|
||||
// wait for rendering
|
||||
timer.start( 3000 );
|
||||
loop.exec();
|
||||
QCOMPARE( spy.count(), 1 );
|
||||
spy.clear();
|
||||
|
||||
// control image with magnification factor 6.5
|
||||
mCanvas->saveAsImage( tmpName );
|
||||
|
||||
checker.setRenderedImage( tmpName );
|
||||
checker.setControlName( "expected_map_magnification_6_5" );
|
||||
controlImageDir = testDataDir + "control_images/";
|
||||
checker.setSizeTolerance( 2, 2 );
|
||||
QCOMPARE( checker.compareImages( "map_magnification_6_5", 100 ), true );
|
||||
}
|
||||
|
||||
QTEST_MAIN( TestQgsMapCanvas )
|
||||
#include "testqgsmapcanvas.moc"
|
||||
|
BIN
tests/testdata/control_images/mapcanvas/expected_map_magnification/expected_map_magnification.png
vendored
Normal file
BIN
tests/testdata/control_images/mapcanvas/expected_map_magnification/expected_map_magnification.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
Loading…
x
Reference in New Issue
Block a user