Skip to content

Commit b9baf2e

Browse files
committed
Merge pull request #3131 from 3nids/lockscale
allow to lock scale to use magnification to zoom in/out
2 parents bae8a0e + c3e7a56 commit b9baf2e

19 files changed

+634
-288
lines changed

python/core/qgsmaprenderer.sip

+1-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class QgsMapRenderer : QObject
184184
//! sets whether map image will be for overview
185185
void enableOverviewMode( bool isOverview = true );
186186

187-
void setOutputSize( QSize size, int dpi );
187+
void setOutputSize( QSize size, double dpi );
188188
void setOutputSize( QSizeF size, double dpi );
189189

190190
//!accessor for output dpi

python/core/qgsmapsettings.sip

+11-6
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@ class QgsMapSettings
3535

3636
//! Return DPI used for conversion between real world units (e.g. mm) and pixels
3737
//! Default value is 96
38-
int outputDpi() const;
38+
double outputDpi() const;
3939
//! Set DPI used for conversion between real world units (e.g. mm) and pixels
40-
void setOutputDpi( int dpi );
40+
void setOutputDpi( double dpi );
4141

42-
//! Set the magnification factor.
43-
//! @note added in 2.16
44-
void setMagnificationFactor( double factor );
45-
//! Return the magnification factor.
42+
43+
/**
44+
* @brief setMagnificationFactor set the magnification factor
45+
* @param factor the factor of magnification
46+
* @note added in 2.16
47+
*/
48+
void setMagnificationFactor( double factor );
49+
50+
//! Return the magnification factor.
4651
//! @note added in 2.16
4752
double magnificationFactor() const;
4853

python/gui/qgsmapcanvas.sip

+4
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,12 @@ class QgsMapCanvas : QGraphicsView
279279
QgsMapLayer* currentLayer();
280280

281281
//! set wheel action and zoom factor (should be greater than 1)
282+
//! @deprecated
282283
void setWheelAction( WheelAction action, double factor = 2 );
283284

285+
//! set the wheel zoom factor
286+
void setWheelFactor( double factor );
287+
284288
//! Zoom in with fixed factor
285289
void zoomIn();
286290

src/app/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ SET(QGIS_APP_SRCS
5252
qgssavestyletodbdialog.cpp
5353
qgsstatusbarcoordinateswidget.cpp
5454
qgsstatusbarmagnifierwidget.cpp
55+
qgsstatusbarscalewidget.cpp
5556
qgsversioninfo.cpp
5657
qgswelcomepageitemsmodel.cpp
5758
qgswelcomepage.cpp
@@ -231,6 +232,7 @@ SET (QGIS_APP_MOC_HDRS
231232
qgsshortcutsmanager.h
232233
qgsstatusbarcoordinateswidget.h
233234
qgsstatusbarmagnifierwidget.h
235+
qgsstatusbarscalewidget.h
234236
qgsversioninfo.h
235237
qgswelcomepageitemsmodel.h
236238
qgswelcomepage.h

src/app/qgisapp.cpp

+29-60
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,6 @@
122122
#include "qgscomposer.h"
123123
#include "qgscomposermanager.h"
124124
#include "qgscomposerview.h"
125-
#include "qgsstatusbarcoordinateswidget.h"
126-
#include "qgsstatusbarmagnifierwidget.h"
127125
#include "qgsconfigureshortcutsdialog.h"
128126
#include "qgscoordinatetransform.h"
129127
#include "qgscoordinateutils.h"
@@ -207,17 +205,19 @@
207205
#include "qgsrasterrenderer.h"
208206
#include "qgsrasterlayersaveasdialog.h"
209207
#include "qgsrectangle.h"
210-
#include "qgsscalecombobox.h"
211208
#include "qgsscalevisibilitydialog.h"
212209
#include "qgsgroupwmsdatadialog.h"
213210
#include "qgsshortcutsmanager.h"
214211
#include "qgssinglebandgrayrenderer.h"
215212
#include "qgssnappingdialog.h"
216213
#include "qgssponsors.h"
217214
#include "qgsstatisticalsummarydockwidget.h"
218-
#include "qgssymbolv2selectordialog.h"
215+
#include "qgsstatusbarcoordinateswidget.h"
216+
#include "qgsstatusbarmagnifierwidget.h"
217+
#include "qgsstatusbarscalewidget.h"
219218
#include "qgsstylev2.h"
220219
#include "qgssvgannotationitem.h"
220+
#include "qgssymbolv2selectordialog.h"
221221
#include "qgstextannotationitem.h"
222222
#include "qgstipgui.h"
223223
#include "qgsundowidget.h"
@@ -543,9 +543,7 @@ QgisApp *QgisApp::smInstance = nullptr;
543543
QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCheck, QWidget * parent, Qt::WindowFlags fl )
544544
: QMainWindow( parent, fl )
545545
, mNonEditMapTool( nullptr )
546-
, mScaleLabel( nullptr )
547-
, mScaleEdit( nullptr )
548-
, mScaleEditValidator( nullptr )
546+
, mScaleWidget( nullptr )
549547
, mMagnifierWidget( nullptr )
550548
, mCoordsEdit( nullptr )
551549
, mRotationLabel( nullptr )
@@ -1001,9 +999,7 @@ QgisApp::QgisApp()
1001999
, mpGpsDock( nullptr )
10021000
, mLogDock( nullptr )
10031001
, mNonEditMapTool( nullptr )
1004-
, mScaleLabel( nullptr )
1005-
, mScaleEdit( nullptr )
1006-
, mScaleEditValidator( nullptr )
1002+
, mScaleWidget( nullptr )
10071003
, mMagnifierWidget( nullptr )
10081004
, mCoordsEdit( nullptr )
10091005
, mRotationLabel( nullptr )
@@ -2138,38 +2134,17 @@ void QgisApp::createStatusBar()
21382134
mCoordsEdit->setFont( myFont );
21392135
statusBar()->addPermanentWidget( mCoordsEdit, 0 );
21402136

2141-
// add a label to show current scale
2142-
mScaleLabel = new QLabel( QString(), statusBar() );
2143-
mScaleLabel->setObjectName( "mScaleLable" );
2144-
mScaleLabel->setFont( myFont );
2145-
mScaleLabel->setMinimumWidth( 10 );
2146-
//mScaleLabel->setMaximumHeight( 20 );
2147-
mScaleLabel->setMargin( 3 );
2148-
mScaleLabel->setAlignment( Qt::AlignCenter );
2149-
mScaleLabel->setFrameStyle( QFrame::NoFrame );
2150-
mScaleLabel->setText( tr( "Scale" ) );
2151-
mScaleLabel->setToolTip( tr( "Current map scale" ) );
2152-
statusBar()->addPermanentWidget( mScaleLabel, 0 );
2153-
2154-
mScaleEdit = new QgsScaleComboBox( statusBar() );
2155-
mScaleEdit->setObjectName( "mScaleEdit" );
2156-
mScaleEdit->setFont( myFont );
2157-
// seems setFont() change font only for popup not for line edit,
2158-
// so we need to set font for it separately
2159-
mScaleEdit->lineEdit()->setFont( myFont );
2160-
mScaleEdit->setMinimumWidth( 10 );
2161-
mScaleEdit->setContentsMargins( 0, 0, 0, 0 );
2162-
mScaleEdit->setWhatsThis( tr( "Displays the current map scale" ) );
2163-
mScaleEdit->setToolTip( tr( "Current map scale (formatted as x:y)" ) );
2164-
2165-
statusBar()->addPermanentWidget( mScaleEdit, 0 );
2166-
connect( mScaleEdit, SIGNAL( scaleChanged( double ) ), this, SLOT( userScale() ) );
2137+
mScaleWidget = new QgsStatusBarScaleWidget( mMapCanvas, statusBar() );
2138+
mScaleWidget->setFont( myFont );
2139+
connect( mScaleWidget, SIGNAL( scaleLockChanged( bool ) ), mMapCanvas, SLOT( setScaleLocked( bool ) ) );
2140+
statusBar()->addPermanentWidget( mScaleWidget, 0 );
21672141

21682142
// zoom widget
2169-
QSettings mySettings;
2170-
mMagnifierWidget = new QgsStatusBarMagnifierWidget( statusBar(), mMapCanvas );
2143+
mMagnifierWidget = new QgsStatusBarMagnifierWidget( statusBar() );
21712144
mMagnifierWidget->setFont( myFont );
2172-
mMagnifierWidget->setMagnificationLevel( mySettings.value( "/qgis/magnifier_level", 100 ).toInt() );
2145+
connect( mMapCanvas, SIGNAL( magnificationChanged( double ) ), mMagnifierWidget, SLOT( updateMagnification( double ) ) );
2146+
connect( mMagnifierWidget, SIGNAL( magnificationChanged( double ) ), mMapCanvas, SLOT( setMagnificationFactor( double ) ) );
2147+
mMagnifierWidget->updateMagnification( QSettings().value( "/qgis/magnifier_factor_default", 1.0 ).toDouble() );
21732148
statusBar()->addPermanentWidget( mMagnifierWidget, 0 );
21742149

21752150
if ( QgsMapCanvas::rotationEnabled() )
@@ -2227,7 +2202,7 @@ void QgisApp::createStatusBar()
22272202
mOnTheFlyProjectionStatusButton->setObjectName( "mOntheFlyProjectionStatusButton" );
22282203
// Maintain uniform widget height in status bar by setting button height same as labels
22292204
// For Qt/Mac 3.3, the default toolbutton height is 30 and labels were expanding to match
2230-
mOnTheFlyProjectionStatusButton->setMaximumHeight( mScaleLabel->height() );
2205+
mOnTheFlyProjectionStatusButton->setMaximumHeight( mScaleWidget->height() );
22312206
mOnTheFlyProjectionStatusButton->setIcon( QgsApplication::getThemeIcon( "mIconProjectionEnabled.png" ) );
22322207
mOnTheFlyProjectionStatusButton->setWhatsThis( tr( "This icon shows whether "
22332208
"on the fly coordinate reference system transformation is enabled or not. "
@@ -2247,7 +2222,7 @@ void QgisApp::createStatusBar()
22472222
mMessageButton->setWhatsThis( tr( "Messages" ) );
22482223
mMessageButton->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
22492224
mMessageButton->setObjectName( "mMessageLogViewerButton" );
2250-
mMessageButton->setMaximumHeight( mScaleLabel->height() );
2225+
mMessageButton->setMaximumHeight( mScaleWidget->height() );
22512226
mMessageButton->setCheckable( true );
22522227
statusBar()->addPermanentWidget( mMessageButton, 0 );
22532228
}
@@ -2716,9 +2691,8 @@ void QgisApp::createOverview()
27162691
// Anti Aliasing enabled by default as of QGIS 1.7
27172692
mMapCanvas->enableAntiAliasing( mySettings.value( "/qgis/enable_anti_aliasing", true ).toBool() );
27182693

2719-
int action = mySettings.value( "/qgis/wheel_action", 2 ).toInt();
27202694
double zoomFactor = mySettings.value( "/qgis/zoom_factor", 2 ).toDouble();
2721-
mMapCanvas->setWheelAction( static_cast< QgsMapCanvas::WheelAction >( action ), zoomFactor );
2695+
mMapCanvas->setWheelFactor( zoomFactor );
27222696

27232697
mMapCanvas->setCachingEnabled( mySettings.value( "/qgis/enable_render_caching", true ).toBool() );
27242698

@@ -4198,7 +4172,7 @@ void QgisApp::fileNew( bool thePromptToSaveFlag, bool forceBlank )
41984172
mMapCanvas->refresh();
41994173
mMapCanvas->clearExtentHistory();
42004174
mMapCanvas->setRotation( 0.0 );
4201-
mScaleEdit->updateScales();
4175+
mScaleWidget->updateScales();
42024176

42034177
// set project CRS
42044178
QString defCrs = settings.value( "/Projections/projectDefaultCrs", GEO_EPSG_CRS_AUTHID ).toString();
@@ -4648,7 +4622,7 @@ bool QgisApp::addProject( const QString& projectFile )
46484622
bool projectScales = QgsProject::instance()->readBoolEntry( "Scales", "/useProjectScales" );
46494623
if ( projectScales )
46504624
{
4651-
mScaleEdit->updateScales( QgsProject::instance()->readListEntry( "Scales", "/ScalesList" ) );
4625+
mScaleWidget->updateScales( QgsProject::instance()->readListEntry( "Scales", "/ScalesList" ) );
46524626
}
46534627

46544628
mMapCanvas->updateScale();
@@ -7906,21 +7880,15 @@ void QgisApp::saveLastMousePosition( const QgsPoint & p )
79067880
void QgisApp::showScale( double theScale )
79077881
{
79087882
// Why has MapCanvas the scale inverted?
7909-
mScaleEdit->setScale( 1.0 / theScale );
7883+
mScaleWidget->setScale( 1.0 / theScale );
79107884

79117885
// Not sure if the lines below do anything meaningful /Homann
7912-
if ( mScaleEdit->width() > mScaleEdit->minimumWidth() )
7886+
if ( mScaleWidget->width() > mScaleWidget->minimumWidth() )
79137887
{
7914-
mScaleEdit->setMinimumWidth( mScaleEdit->width() );
7888+
mScaleWidget->setMinimumWidth( mScaleWidget->width() );
79157889
}
79167890
}
79177891

7918-
void QgisApp::userScale()
7919-
{
7920-
// Why has MapCanvas the scale inverted?
7921-
mMapCanvas->zoomScale( 1.0 / mScaleEdit->scale() );
7922-
}
7923-
79247892

79257893
void QgisApp::userRotation()
79267894
{
@@ -8596,9 +8564,8 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString& currentPage )
85968564

85978565
mMapCanvas->enableAntiAliasing( mySettings.value( "/qgis/enable_anti_aliasing" ).toBool() );
85988566

8599-
int action = mySettings.value( "/qgis/wheel_action", 2 ).toInt();
86008567
double zoomFactor = mySettings.value( "/qgis/zoom_factor", 2 ).toDouble();
8601-
mMapCanvas->setWheelAction( static_cast< QgsMapCanvas::WheelAction >( action ), zoomFactor );
8568+
mMapCanvas->setWheelFactor( zoomFactor );
86028569

86038570
mMapCanvas->setCachingEnabled( mySettings.value( "/qgis/enable_render_caching", true ).toBool() );
86048571

@@ -8613,8 +8580,6 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString& currentPage )
86138580
layer->setLayerName( layer->originalName() );
86148581
}
86158582

8616-
mMagnifierWidget->setMagnificationLevel( mySettings.value( "/qgis/magnifier_level" ).toInt() );
8617-
86188583
//update any open compositions so they reflect new composer settings
86198584
//we have to push the changes to the compositions here, because compositions
86208585
//have no access to qgisapp and accordingly can't listen in to changes
@@ -8633,7 +8598,7 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString& currentPage )
86338598

86348599
if ( oldScales != mySettings.value( "Map/scales", PROJECT_SCALES ).toString() )
86358600
{
8636-
mScaleEdit->updateScales();
8601+
mScaleWidget->updateScales();
86378602
}
86388603

86398604
qobject_cast<QgsMeasureTool*>( mMapTools.mMeasureDist )->updateSettings();
@@ -8645,6 +8610,10 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString& currentPage )
86458610

86468611
mMapCanvas->setSegmentationTolerance( mySettings.value( "/qgis/segmentationTolerance", "0.01745" ).toDouble() );
86478612
mMapCanvas->setSegmentationToleranceType( QgsAbstractGeometryV2::SegmentationToleranceType( mySettings.value( "/qgis/segmentationToleranceType", "0" ).toInt() ) );
8613+
8614+
double factor = mySettings.value( "/qgis/magnifier_factor_default", 1.0 ).toDouble();
8615+
mMagnifierWidget->setDefaultFactor( factor );
8616+
mMagnifierWidget->updateMagnification( factor );
86488617
}
86498618

86508619
delete optionsDialog;
@@ -9964,7 +9933,7 @@ void QgisApp::projectProperties()
99649933
connect( pp, SIGNAL( displayPrecisionChanged() ), this,
99659934
SLOT( updateMouseCoordinatePrecision() ) );
99669935

9967-
connect( pp, SIGNAL( scalesChanged( const QStringList & ) ), mScaleEdit,
9936+
connect( pp, SIGNAL( scalesChanged( const QStringList & ) ), mScaleWidget,
99689937
SLOT( updateScales( const QStringList & ) ) );
99699938
QApplication::restoreOverrideCursor();
99709939

src/app/qgisapp.h

+2-10
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class QgsComposerManager;
4646
class QgsComposerView;
4747
class QgsStatusBarCoordinatesWidget;
4848
class QgsStatusBarMagnifierWidget;
49+
class QgsStatusBarScaleWidget;
4950
class QgsContrastEnhancement;
5051
class QgsCustomLayerOrderWidget;
5152
class QgsDoubleSpinBox;
@@ -90,8 +91,6 @@ class QgsDecorationItem;
9091
class QgsMessageLogViewer;
9192
class QgsMessageBar;
9293

93-
class QgsScaleComboBox;
94-
9594
class QgsDataItem;
9695
class QgsTileScaleWidget;
9796

@@ -736,8 +735,6 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
736735
void saveLastMousePosition( const QgsPoint & );
737736
//! Slot to show current map scale;
738737
void showScale( double theScale );
739-
//! Slot to handle user scale input;
740-
void userScale();
741738
//! Slot to handle user rotation input;
742739
//! @note added in 2.8
743740
void userRotation();
@@ -1589,12 +1586,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
15891586

15901587
QgsMapTool *mNonEditMapTool;
15911588

1592-
//! Widget that will live on the statusbar to display "scale 1:"
1593-
QLabel *mScaleLabel;
1594-
//! Widget that will live on the statusbar to display scale value
1595-
QgsScaleComboBox *mScaleEdit;
1596-
//! The validator for the mScaleEdit
1597-
QValidator * mScaleEditValidator;
1589+
QgsStatusBarScaleWidget* mScaleWidget;
15981590

15991591
//! zoom widget
16001592
QgsStatusBarMagnifierWidget *mMagnifierWidget;

src/app/qgsoptions.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,14 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl )
607607
mSimplifyMaximumScaleComboBox->setScale( 1.0 / mSettings->value( "/qgis/simplifyMaxScale", 1 ).toFloat() );
608608

609609
// Magnifier
610-
doubleSpinBoxMagnifierDefault->setRange( 100, 1000 );
610+
double magnifierMin = 100 * mSettings->value( "/qgis/magnifier_factor_min", 0.1 ).toDouble();
611+
double magnifierMax = 100 * mSettings->value( "/qgis/magnifier_factor_max", 10 ).toDouble();
612+
double magnifierVal = 100 * mSettings->value( "/qgis/magnifier_factor_default", 1.0 ).toDouble();
613+
doubleSpinBoxMagnifierDefault->setRange( magnifierMin, magnifierMax );
611614
doubleSpinBoxMagnifierDefault->setSingleStep( 50 );
612615
doubleSpinBoxMagnifierDefault->setDecimals( 0 );
613616
doubleSpinBoxMagnifierDefault->setSuffix( "%" );
614-
doubleSpinBoxMagnifierDefault->setValue( mSettings->value( "/qgis/magnifier_level", 100 ).toInt() );
617+
doubleSpinBoxMagnifierDefault->setValue( magnifierVal );
615618

616619
// Default local simplification algorithm
617620
mSimplifyAlgorithmComboBox->addItem( tr( "Distance" ), ( int )QgsVectorSimplifyMethod::Distance );
@@ -731,7 +734,6 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl )
731734
}
732735
leTemplateFolder->setText( templateDirName );
733736

734-
cmbWheelAction->setCurrentIndex( mSettings->value( "/qgis/wheel_action", 2 ).toInt() );
735737
spinZoomFactor->setValue( mSettings->value( "/qgis/zoom_factor", 2 ).toDouble() );
736738

737739
// predefined scales for scale combobox
@@ -1224,7 +1226,7 @@ void QgsOptions::saveOptions()
12241226
mSettings->setValue( "/qgis/simplifyMaxScale", 1.0 / mSimplifyMaximumScaleComboBox->scale() );
12251227

12261228
// magnification
1227-
mSettings->setValue( "/qgis/magnifier_level", doubleSpinBoxMagnifierDefault->value() );
1229+
mSettings->setValue( "/qgis/magnifier_factor_default", doubleSpinBoxMagnifierDefault->value() / 100 );
12281230

12291231
//curve segmentation
12301232
int segmentationType = mToleranceTypeComboBox->itemData( mToleranceTypeComboBox->currentIndex() ).toInt();
@@ -1341,7 +1343,6 @@ void QgsOptions::saveOptions()
13411343
mSettings->setValue( "/qgis/default_measure_color_green", myColor.green() );
13421344
mSettings->setValue( "/qgis/default_measure_color_blue", myColor.blue() );
13431345

1344-
mSettings->setValue( "/qgis/wheel_action", cmbWheelAction->currentIndex() );
13451346
mSettings->setValue( "/qgis/zoom_factor", spinZoomFactor->value() );
13461347

13471348
//digitizing

0 commit comments

Comments
 (0)