diff --git a/python/PyQt6/core/auto_additions/qgis.py b/python/PyQt6/core/auto_additions/qgis.py index 28a4da2216dc..f0ab7f5f9e9d 100644 --- a/python/PyQt6/core/auto_additions/qgis.py +++ b/python/PyQt6/core/auto_additions/qgis.py @@ -7806,6 +7806,7 @@ 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 @@ .. 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 1e0c27a9c2ee..a92b4b6f57f9 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 ce7a57dbe506..0efffaf04d61 100644 --- a/python/core/auto_additions/qgis.py +++ b/python/core/auto_additions/qgis.py @@ -7730,6 +7730,7 @@ 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 @@ .. 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 48b8be7b6c05..1c1985ae4248 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 c50a1c681e37..b9da4e4f3ad9 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 8cff42bde3c5..6cc6bae2eb7d 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 63044c7d78de..c0cb4a46c0bf 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 ) {