From 3d44213606dc4788539cefa1562256b63fe8057e Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Mon, 10 Feb 2025 13:31:45 +0000 Subject: [PATCH] do not enable default Duplicate Feature and Digitize action for geometryless layers (refs #57916) --- python/PyQt6/core/auto_additions/qgis.py | 5 +++++ python/PyQt6/core/auto_generated/qgis.sip.in | 1 + python/core/auto_additions/qgis.py | 5 +++++ python/core/auto_generated/qgis.sip.in | 1 + src/app/qgisapp.cpp | 2 +- src/core/qgis.h | 1 + src/gui/actions/qgsmaplayeraction.cpp | 11 +++++++++++ 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/python/PyQt6/core/auto_additions/qgis.py b/python/PyQt6/core/auto_additions/qgis.py index 28a4da2216d..f0ab7f5f9e9 100644 --- a/python/PyQt6/core/auto_additions/qgis.py +++ b/python/PyQt6/core/auto_additions/qgis.py @@ -7806,6 +7806,7 @@ Qgis.MapLayerActionTargets.baseClass = Qgis MapLayerActionTargets = Qgis # dirty hack since SIP seems to introduce the flags in module # monkey patching scoped based enum Qgis.MapLayerActionFlag.EnabledOnlyWhenEditable.__doc__ = "Action should be shown only for editable layers" +Qgis.MapLayerActionFlag.EnableOnlyWhenHasGeometry.__doc__ = "Action should be shown only for layers with geometry, \n.. versionadded:: 3.42" Qgis.MapLayerActionFlag.__doc__ = """Map layer action flags. Prior to QGIS 3.30 this was available as :py:class:`QgsMapLayerAction`.Flag @@ -7813,6 +7814,10 @@ Prior to QGIS 3.30 this was available as :py:class:`QgsMapLayerAction`.Flag .. versionadded:: 3.30 * ``EnabledOnlyWhenEditable``: Action should be shown only for editable layers +* ``EnableOnlyWhenHasGeometry``: Action should be shown only for layers with geometry, + + .. versionadded:: 3.42 + """ # -- diff --git a/python/PyQt6/core/auto_generated/qgis.sip.in b/python/PyQt6/core/auto_generated/qgis.sip.in index 1e0c27a9c2e..a92b4b6f57f 100644 --- a/python/PyQt6/core/auto_generated/qgis.sip.in +++ b/python/PyQt6/core/auto_generated/qgis.sip.in @@ -2461,6 +2461,7 @@ The development version enum class MapLayerActionFlag /BaseType=IntFlag/ { EnabledOnlyWhenEditable, + EnableOnlyWhenHasGeometry, }; typedef QFlags MapLayerActionFlags; diff --git a/python/core/auto_additions/qgis.py b/python/core/auto_additions/qgis.py index ce7a57dbe50..0efffaf04d6 100644 --- a/python/core/auto_additions/qgis.py +++ b/python/core/auto_additions/qgis.py @@ -7730,6 +7730,7 @@ Qgis.MapLayerActionTargets.baseClass = Qgis MapLayerActionTargets = Qgis # dirty hack since SIP seems to introduce the flags in module # monkey patching scoped based enum Qgis.MapLayerActionFlag.EnabledOnlyWhenEditable.__doc__ = "Action should be shown only for editable layers" +Qgis.MapLayerActionFlag.EnableOnlyWhenHasGeometry.__doc__ = "Action should be shown only for layers with geometry, \n.. versionadded:: 3.42" Qgis.MapLayerActionFlag.__doc__ = """Map layer action flags. Prior to QGIS 3.30 this was available as :py:class:`QgsMapLayerAction`.Flag @@ -7737,6 +7738,10 @@ Prior to QGIS 3.30 this was available as :py:class:`QgsMapLayerAction`.Flag .. versionadded:: 3.30 * ``EnabledOnlyWhenEditable``: Action should be shown only for editable layers +* ``EnableOnlyWhenHasGeometry``: Action should be shown only for layers with geometry, + + .. versionadded:: 3.42 + """ # -- diff --git a/python/core/auto_generated/qgis.sip.in b/python/core/auto_generated/qgis.sip.in index 48b8be7b6c0..1c1985ae424 100644 --- a/python/core/auto_generated/qgis.sip.in +++ b/python/core/auto_generated/qgis.sip.in @@ -2461,6 +2461,7 @@ The development version enum class MapLayerActionFlag { EnabledOnlyWhenEditable, + EnableOnlyWhenHasGeometry, }; typedef QFlags MapLayerActionFlags; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index c50a1c681e3..b9da4e4f3ad 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -9153,7 +9153,7 @@ void QgisApp::setupDuplicateFeaturesAction() duplicateFeatures( layer, feat ); } ); - mDuplicateFeatureDigitizeAction.reset( new QgsMapLayerAction( tr( "Duplicate Feature and Digitize" ), nullptr, Qgis::MapLayerActionTarget::SingleFeature, QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeatureDigitized.svg" ) ), Qgis::MapLayerActionFlag::EnabledOnlyWhenEditable ) ); + mDuplicateFeatureDigitizeAction.reset( new QgsMapLayerAction( tr( "Duplicate Feature and Digitize" ), nullptr, Qgis::MapLayerActionTarget::SingleFeature, QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeatureDigitized.svg" ) ), Qgis::MapLayerActionFlag::EnabledOnlyWhenEditable | Qgis::MapLayerActionFlag::EnableOnlyWhenHasGeometry ) ); QgsGui::mapLayerActionRegistry()->addMapLayerAction( mDuplicateFeatureDigitizeAction.get() ); connect( mDuplicateFeatureDigitizeAction.get(), &QgsMapLayerAction::triggeredForFeatureV2, this, [this]( QgsMapLayer *layer, const QgsFeature &feat, const QgsMapLayerActionContext & ) { diff --git a/src/core/qgis.h b/src/core/qgis.h index 8cff42bde3c..6cc6bae2eb7 100644 --- a/src/core/qgis.h +++ b/src/core/qgis.h @@ -4398,6 +4398,7 @@ class CORE_EXPORT Qgis enum class MapLayerActionFlag : int SIP_ENUM_BASETYPE( IntFlag ) { EnabledOnlyWhenEditable = 1 << 1, //!< Action should be shown only for editable layers + EnableOnlyWhenHasGeometry = 1 << 2, //!< Action should be shown only for layers with geometry, \since QGIS 3.42 }; Q_ENUM( MapLayerActionFlag ) diff --git a/src/gui/actions/qgsmaplayeraction.cpp b/src/gui/actions/qgsmaplayeraction.cpp index 63044c7d78d..c0cb4a46c0b 100644 --- a/src/gui/actions/qgsmaplayeraction.cpp +++ b/src/gui/actions/qgsmaplayeraction.cpp @@ -75,6 +75,17 @@ bool QgsMapLayerAction::canRunUsingLayer( QgsMapLayer *layer, const QgsMapLayerA return false; } + if ( mFlags & Qgis::MapLayerActionFlag::EnableOnlyWhenHasGeometry ) + { + // action is only enabled for layers with geometry + if ( !layer ) + return false; + if ( layer->type() != Qgis::LayerType::Vector ) + return false; + if ( qobject_cast( layer )->wkbType() == Qgis::WkbType::NoGeometry ) + return false; + } + //check layer details if ( !mSingleLayer && !mSpecificLayerType ) {