From 5176ecf597a510cb5f32973fa3723532cbbc52fe Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Mon, 27 Feb 2017 14:36:15 +0100 Subject: [PATCH] [needs-docs] keyboard shortcut to toggle snapping (S) Pressing the key "S" will toggle snapping. This helps to quickly enable/disable snapping while digitizing. --- python/core/qgsproject.sip | 2 +- python/core/qgssnappingutils.sip | 8 +++++++- scripts/sipdiff | 2 +- src/app/qgisapp.cpp | 17 ++++++++++++----- src/core/qgsproject.cpp | 10 +++++----- src/core/qgsproject.h | 16 ++++++++-------- src/core/qgssnappingutils.cpp | 9 ++++++++- src/core/qgssnappingutils.h | 12 ++++++++++-- 8 files changed, 52 insertions(+), 24 deletions(-) diff --git a/python/core/qgsproject.sip b/python/core/qgsproject.sip index 4733e8d4618c..5fa78efb17aa 100644 --- a/python/core/qgsproject.sip +++ b/python/core/qgsproject.sip @@ -539,7 +539,7 @@ class QgsProject : QObject, QgsExpressionContextGenerator void homePathChanged(); //! emitted whenever the configuration for snapping has changed - void snappingConfigChanged(); + void snappingConfigChanged( const QgsSnappingConfig& config ); /** Emitted whenever the expression variables stored in the project have been changed. * @note added in QGIS 3.0 diff --git a/python/core/qgssnappingutils.sip b/python/core/qgssnappingutils.sip index 8048001177c7..d07173d3d0f9 100644 --- a/python/core/qgssnappingutils.sip +++ b/python/core/qgssnappingutils.sip @@ -89,16 +89,22 @@ class QgsSnappingUtils : QObject */ QgsSnappingConfig config() const; + public slots: /** * The snapping configuration controls the behavior of this object */ void setConfig( const QgsSnappingConfig& snappingConfig ); + /** + * Toggles the state of snapping + */ + void toggleEnabled(); + signals: /** * Emitted when the snapping settings object changes. */ - void configChanged(); + void configChanged( const QgsSnappingConfig& snappingConfig ); protected: //! Called when starting to index - can be overridden and e.g. progress dialog can be provided diff --git a/scripts/sipdiff b/scripts/sipdiff index 482a1e47843d..a1106e700648 100755 --- a/scripts/sipdiff +++ b/scripts/sipdiff @@ -53,7 +53,7 @@ for file in $*; do ${GP}sed -i -r '/^\s*Q_(OBJECT|ENUMS|PROPERTY).*?$/d' $tempfile # Remove function definition in header - ${GP}sed -i -r 's/^(\s*)?(virtual |static )?(inline )?(void|bool|int|double|Q\w+)(\s+[^ ]*?\(.*?\)( const)?)\s*\{.*?\}$/\1\2\4\5;/g' $tempfile + ${GP}sed -i -r 's/^(\s*)?(virtual |static )?(inline )?(void|bool|int|double|Q\w+)(\*?)(\s+[^ ]*?\(.*?\)( const)?)\s*\{.*?\}$/\1\2\4\5\6;/g' $tempfile # Remove nullptr ${GP}sed -i 's/nullptr/0/g' $tempfile diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index a1dc07094c75..72988f74caf7 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -772,7 +772,9 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh startProfile( QStringLiteral( "Snapping utils" ) ); mSnappingUtils = new QgsMapCanvasSnappingUtils( mMapCanvas, this ); mMapCanvas->setSnappingUtils( mSnappingUtils ); - connect( QgsProject::instance(), &QgsProject::snappingConfigChanged, this, &QgisApp::onSnappingConfigChanged ); + connect( QgsProject::instance(), &QgsProject::snappingConfigChanged, mSnappingUtils, &QgsSnappingUtils::setConfig ); + connect( mSnappingUtils, &QgsSnappingUtils::configChanged, QgsProject::instance(), &QgsProject::setSnappingConfig ); + endProfile(); @@ -1077,21 +1079,26 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh QShortcut* zoomInShortCut = new QShortcut( QKeySequence( tr( "Ctrl++" ) ), this ); connect( zoomInShortCut, &QShortcut::activated, mMapCanvas, &QgsMapCanvas::zoomIn ); zoomInShortCut->setObjectName( QStringLiteral( "ZoomInToCanvas" ) ); - zoomInShortCut->setWhatsThis( QStringLiteral( "Zoom in to canvas" ) ); + zoomInShortCut->setWhatsThis( tr( "Zoom in to canvas" ) ); QShortcut* zoomShortCut2 = new QShortcut( QKeySequence( tr( "Ctrl+=" ) ), this ); connect( zoomShortCut2, &QShortcut::activated, mMapCanvas, &QgsMapCanvas::zoomIn ); zoomShortCut2->setObjectName( QStringLiteral( "ZoomInToCanvas2" ) ); - zoomShortCut2->setWhatsThis( QStringLiteral( "Zoom in to canvas (secondary)" ) ); + zoomShortCut2->setWhatsThis( tr( "Zoom in to canvas (secondary)" ) ); QShortcut* zoomOutShortCut = new QShortcut( QKeySequence( tr( "Ctrl+-" ) ), this ); connect( zoomOutShortCut, &QShortcut::activated, mMapCanvas, &QgsMapCanvas::zoomOut ); zoomOutShortCut->setObjectName( QStringLiteral( "ZoomOutOfCanvas" ) ); - zoomOutShortCut->setWhatsThis( QStringLiteral( "Zoom out of canvas" ) ); + zoomOutShortCut->setWhatsThis( tr( "Zoom out of canvas" ) ); //also make ctrl+alt+= a shortcut to switch to zoom in map tool QShortcut* zoomInToolShortCut = new QShortcut( QKeySequence( tr( "Ctrl+Alt+=" ) ), this ); connect( zoomInToolShortCut, SIGNAL( activated() ), this, SLOT( zoomIn() ) ); zoomInToolShortCut->setObjectName( QStringLiteral( "ZoomIn2" ) ); - zoomInToolShortCut->setWhatsThis( QStringLiteral( "Zoom in (secondary)" ) ); + zoomInToolShortCut->setWhatsThis( tr( "Zoom in (secondary)" ) ); + + QShortcut* toggleSnapping = new QShortcut( QKeySequence( tr( "S" ) ), this ); + toggleSnapping->setObjectName( "toggleSnapping" ); + toggleSnapping->setWhatsThis( tr( "Toggle snapping" ) ); + connect( toggleSnapping, &QShortcut::activated, mSnappingUtils, &QgsSnappingUtils::toggleEnabled ); // Show a nice tip of the day if ( settings.value( QStringLiteral( "/qgis/showTips%1" ).arg( Qgis::QGIS_VERSION_INT / 100 ), true ).toBool() ) diff --git a/src/core/qgsproject.cpp b/src/core/qgsproject.cpp index b9ccd30191a6..088e984066d4 100644 --- a/src/core/qgsproject.cpp +++ b/src/core/qgsproject.cpp @@ -459,7 +459,7 @@ void QgsProject::clear() mRelationManager->clear(); mAnnotationManager->clear(); mSnappingConfig.reset(); - emit snappingConfigChanged(); + emit snappingConfigChanged( mSnappingConfig ); mMapThemeCollection.reset( new QgsMapThemeCollection( this ) ); emit mapThemeCollectionChanged(); @@ -610,7 +610,7 @@ void QgsProject::setSnappingConfig( const QgsSnappingConfig& snappingConfig ) mSnappingConfig = snappingConfig; setDirty(); - emit snappingConfigChanged(); + emit snappingConfigChanged( mSnappingConfig ); } bool QgsProject::_getMapLayers( const QDomDocument& doc, QList& brokenNodes ) @@ -897,7 +897,7 @@ bool QgsProject::read() } mSnappingConfig.readProject( *doc ); - emit snappingConfigChanged(); + emit snappingConfigChanged( mSnappingConfig ); //add variables defined in project file QStringList variableNames = readListEntry( QStringLiteral( "Variables" ), QStringLiteral( "/variableNames" ) ); @@ -1081,13 +1081,13 @@ void QgsProject::onMapLayersAdded( const QList& layers ) } if ( mSnappingConfig.addLayers( layers ) ) - emit snappingConfigChanged(); + emit snappingConfigChanged( mSnappingConfig ); } void QgsProject::onMapLayersRemoved( const QList& layers ) { if ( mSnappingConfig.removeLayers( layers ) ) - emit snappingConfigChanged(); + emit snappingConfigChanged( mSnappingConfig ); } void QgsProject::cleanTransactionGroups( bool force ) diff --git a/src/core/qgsproject.h b/src/core/qgsproject.h index 0cc28746aca2..11469cdc76c4 100644 --- a/src/core/qgsproject.h +++ b/src/core/qgsproject.h @@ -468,13 +468,6 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera */ QgsSnappingConfig snappingConfig() const; - /** - * The snapping configuration for this project. - * - * @note Added in QGIS 3.0 - */ - void setSnappingConfig( const QgsSnappingConfig& snappingConfig ); - /** * A list of layers with which intersections should be avoided. * @@ -749,7 +742,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera void homePathChanged(); //! emitted whenever the configuration for snapping has changed - void snappingConfigChanged(); + void snappingConfigChanged( const QgsSnappingConfig& config ); /** Emitted whenever the expression variables stored in the project have been changed. * @note added in QGIS 3.0 @@ -894,6 +887,13 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera public slots: + /** + * The snapping configuration for this project. + * + * @note Added in QGIS 3.0 + */ + void setSnappingConfig( const QgsSnappingConfig& snappingConfig ); + /** * Flag the project as dirty (modified). If this flag is set, the user will * be asked to save changes to the project before closing the current project. diff --git a/src/core/qgssnappingutils.cpp b/src/core/qgssnappingutils.cpp index b3616f2fceec..d82955f69c65 100644 --- a/src/core/qgssnappingutils.cpp +++ b/src/core/qgssnappingutils.cpp @@ -418,7 +418,14 @@ void QgsSnappingUtils::setConfig( const QgsSnappingConfig& config ) onIndividualLayerSettingsChanged( config.individualLayerSettings() ); mSnappingConfig = config; - emit configChanged(); + + emit configChanged( mSnappingConfig ); +} + +void QgsSnappingUtils::toggleEnabled() +{ + mSnappingConfig.setEnabled( !mSnappingConfig.enabled() ); + emit configChanged( mSnappingConfig ); } QgsPointLocator::Match QgsSnappingUtils::snapToCurrentLayer( QPoint point, int type, QgsPointLocator::MatchFilter* filter ) diff --git a/src/core/qgssnappingutils.h b/src/core/qgssnappingutils.h index be610ed6b7a6..0502ad48fea4 100644 --- a/src/core/qgssnappingutils.h +++ b/src/core/qgssnappingutils.h @@ -75,7 +75,6 @@ class CORE_EXPORT QgsSnappingUtils : public QObject //! The current layer used if mode is SnapCurrentLayer QgsVectorLayer* currentLayer() const { return mCurrentLayer; } - // configuration //! modes for "snap to background" @@ -162,17 +161,26 @@ class CORE_EXPORT QgsSnappingUtils : public QObject */ QgsSnappingConfig config() const; + public slots: + /** * The snapping configuration controls the behavior of this object */ void setConfig( const QgsSnappingConfig& snappingConfig ); + /** + * Toggles the state of snapping + * + * @note Added in QGIS 3.0 + */ + void toggleEnabled(); + signals: /** * Emitted when the snapping settings object changes. */ - void configChanged(); + void configChanged( const QgsSnappingConfig& snappingConfig ); protected: //! Called when starting to index - can be overridden and e.g. progress dialog can be provided