Skip to content

Commit

Permalink
do not enable default Duplicate Feature and Digitize action for geome…
Browse files Browse the repository at this point in the history
…tryless layers (refs #57916)
  • Loading branch information
alexbruy authored and nyalldawson committed Feb 19, 2025
1 parent f08eda1 commit 3d44213
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 1 deletion.
5 changes: 5 additions & 0 deletions python/PyQt6/core/auto_additions/qgis.py
Original file line number Diff line number Diff line change
Expand Up @@ -7806,13 +7806,18 @@
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

.. 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


"""
# --
Expand Down
1 change: 1 addition & 0 deletions python/PyQt6/core/auto_generated/qgis.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -2461,6 +2461,7 @@ The development version
enum class MapLayerActionFlag /BaseType=IntFlag/
{
EnabledOnlyWhenEditable,
EnableOnlyWhenHasGeometry,
};

typedef QFlags<Qgis::MapLayerActionFlag> MapLayerActionFlags;
Expand Down
5 changes: 5 additions & 0 deletions python/core/auto_additions/qgis.py
Original file line number Diff line number Diff line change
Expand Up @@ -7730,13 +7730,18 @@
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

.. 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


"""
# --
Expand Down
1 change: 1 addition & 0 deletions python/core/auto_generated/qgis.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -2461,6 +2461,7 @@ The development version
enum class MapLayerActionFlag
{
EnabledOnlyWhenEditable,
EnableOnlyWhenHasGeometry,
};

typedef QFlags<Qgis::MapLayerActionFlag> MapLayerActionFlags;
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgisapp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 & ) {
Expand Down
1 change: 1 addition & 0 deletions src/core/qgis.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 )

Expand Down
11 changes: 11 additions & 0 deletions src/gui/actions/qgsmaplayeraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<QgsVectorLayer *>( layer )->wkbType() == Qgis::WkbType::NoGeometry )
return false;
}

//check layer details
if ( !mSingleLayer && !mSpecificLayerType )
{
Expand Down

0 comments on commit 3d44213

Please sign in to comment.