Skip to content

Commit cc83ef9

Browse files
committed
Handle flags compatibility with older code when porting enums to enum
class on PyQt5 builds
1 parent 61ab94f commit cc83ef9

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

python/core/auto_additions/qgis.py

+18
Original file line numberDiff line numberDiff line change
@@ -4166,3 +4166,21 @@
41664166
Qgis.GdalResampleAlgorithm.__doc__ = "Resampling algorithm to be used (equivalent to GDAL's enum GDALResampleAlg)\n\n.. note::\n\n RA_Max, RA_Min, RA_Median, RA_Q1 and RA_Q3 are available on GDAL >= 2.0 builds only\n\n.. versionadded:: 3.34\n\n" + '* ``RA_NearestNeighbour``: ' + Qgis.GdalResampleAlgorithm.RA_NearestNeighbour.__doc__ + '\n' + '* ``RA_Bilinear``: ' + Qgis.GdalResampleAlgorithm.RA_Bilinear.__doc__ + '\n' + '* ``RA_Cubic``: ' + Qgis.GdalResampleAlgorithm.RA_Cubic.__doc__ + '\n' + '* ``RA_CubicSpline``: ' + Qgis.GdalResampleAlgorithm.RA_CubicSpline.__doc__ + '\n' + '* ``RA_Lanczos``: ' + Qgis.GdalResampleAlgorithm.RA_Lanczos.__doc__ + '\n' + '* ``RA_Average``: ' + Qgis.GdalResampleAlgorithm.RA_Average.__doc__ + '\n' + '* ``RA_Mode``: ' + Qgis.GdalResampleAlgorithm.RA_Mode.__doc__ + '\n' + '* ``RA_Max``: ' + Qgis.GdalResampleAlgorithm.RA_Max.__doc__ + '\n' + '* ``RA_Min``: ' + Qgis.GdalResampleAlgorithm.RA_Min.__doc__ + '\n' + '* ``RA_Median``: ' + Qgis.GdalResampleAlgorithm.RA_Median.__doc__ + '\n' + '* ``RA_Q1``: ' + Qgis.GdalResampleAlgorithm.RA_Q1.__doc__ + '\n' + '* ``RA_Q3``: ' + Qgis.GdalResampleAlgorithm.RA_Q3.__doc__
41674167
# --
41684168
Qgis.GdalResampleAlgorithm.baseClass = Qgis
4169+
from enum import Enum
4170+
4171+
4172+
def _force_int(v): return int(v.value) if isinstance(v, Enum) else v
4173+
4174+
4175+
Qgis.BrowserItemCapability.__or__ = lambda flag1, flag2: Qgis.BrowserItemCapabilities(_force_int(flag1) | _force_int(flag2))
4176+
Qgis.GeometryValidityFlag.__or__ = lambda flag1, flag2: Qgis.GeometryValidityFlags(_force_int(flag1) | _force_int(flag2))
4177+
Qgis.LabelingFlag.__or__ = lambda flag1, flag2: Qgis.LabelingFlags(_force_int(flag1) | _force_int(flag2))
4178+
Qgis.LabelLinePlacementFlag.__or__ = lambda flag1, flag2: Qgis.LabelLinePlacementFlags(_force_int(flag1) | _force_int(flag2))
4179+
Qgis.MapSettingsFlag.__or__ = lambda flag1, flag2: Qgis.MapSettingsFlags(_force_int(flag1) | _force_int(flag2))
4180+
Qgis.ProjectReadFlag.__or__ = lambda flag1, flag2: Qgis.ProjectReadFlags(_force_int(flag1) | _force_int(flag2))
4181+
Qgis.RenderContextFlag.__or__ = lambda flag1, flag2: Qgis.RenderContextFlags(_force_int(flag1) | _force_int(flag2))
4182+
Qgis.SnappingType.__or__ = lambda flag1, flag2: Qgis.SnappingTypes(_force_int(flag1) | _force_int(flag2))
4183+
Qgis.SymbolPreviewFlag.__or__ = lambda flag1, flag2: Qgis.SymbolPreviewFlags(_force_int(flag1) | _force_int(flag2))
4184+
Qgis.SymbolRenderHint.__or__ = lambda flag1, flag2: Qgis.SymbolRenderHints(_force_int(flag1) | _force_int(flag2))
4185+
Qgis.FeatureRequestFlag.__or__ = lambda flag1, flag2: Qgis.FeatureRequestFlags(_force_int(flag1) | _force_int(flag2))
4186+
Qgis.ProcessingFeatureSourceDefinitionFlag.__or__ = lambda flag1, flag2: Qgis.ProcessingFeatureSourceDefinitionFlags(_force_int(flag1) | _force_int(flag2))

scripts/sipify.pl

+19-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
my $PYTHON_SIGNATURE = '';
6464
my @ENUM_INT_TYPES = ();
6565
my @ENUM_CLASS_NON_INT_TYPES = ();
66+
my @ENUM_MONKEY_PATCHED_TYPES = ();
6667

6768
my $INDENT = '';
6869
my $PREV_INDENT = '';
@@ -1158,8 +1159,9 @@ sub detect_non_method_member{
11581159
# Enum declaration
11591160
# For scoped and type based enum, the type has to be removed
11601161
if ( $LINE =~ m/^\s*Q_DECLARE_FLAGS\s*\(\s*(?<flags_name>\w+)\s*,\s*(?<flag_name>\w+)\s*\)\s*SIP_MONKEYPATCH_FLAGS_UNNEST\s*\(\s*(?<emkb>\w+)\s*,\s*(?<emkf>\w+)\s*\)\s*$/ ){
1161-
11621162
push @OUTPUT_PYTHON, "$+{emkb}.$+{emkf} = $ACTUAL_CLASS.$+{flags_name}\n";
1163+
push @ENUM_MONKEY_PATCHED_TYPES, [$ACTUAL_CLASS, $+{flags_name}, $+{emkb}, $+{emkf}];
1164+
11631165
$LINE =~ s/\s*SIP_MONKEYPATCH_FLAGS_UNNEST\(.*?\)//;
11641166
}
11651167
if ( $LINE =~ m/^(\s*enum(\s+Q_DECL_DEPRECATED)?\s+(?<isclass>class\s+)?(?<enum_qualname>\w+))(:?\s+SIP_[^:]*)?(\s*:\s*(?<enum_type>\w+))?(?<oneliner>.*)$/ ){
@@ -1362,7 +1364,8 @@ sub detect_non_method_member{
13621364
}
13631365
# catch Q_DECLARE_OPERATORS_FOR_FLAGS
13641366
if ( $LINE =~ m/^(\s*)Q_DECLARE_OPERATORS_FOR_FLAGS\(\s*(.*?)\s*\)\s*$/ ){
1365-
my $flag = $QFLAG_HASH{$2};
1367+
my $flags = $2;
1368+
my $flag = $QFLAG_HASH{$flags};
13661369
$LINE = "$1QFlags<$flag> operator|($flag f1, QFlags<$flag> f2);\n";
13671370

13681371
my $py_flag = $flag;
@@ -1384,6 +1387,20 @@ sub detect_non_method_member{
13841387
push @OUTPUT_PYTHON, "$py_flag.__or__ = lambda flag1, flag2: $py_flag(_force_int(flag1) | _force_int(flag2))\n";
13851388
}
13861389
}
1390+
if ( !$is_qt6 )
1391+
{
1392+
foreach ( @ENUM_MONKEY_PATCHED_TYPES ) {
1393+
if ( $flags eq "$_->[0]::$_->[1]" )
1394+
{
1395+
dbg_info("monkey patching flags");
1396+
if ($HAS_PUSHED_FORCE_INT eq 0) {
1397+
push @OUTPUT_PYTHON, "from enum import Enum\n\n\ndef _force_int(v): return int(v.value) if isinstance(v, Enum) else v\n\n\n";
1398+
$HAS_PUSHED_FORCE_INT = 1;
1399+
}
1400+
push @OUTPUT_PYTHON, "$py_flag.__or__ = lambda flag1, flag2: $_->[0].$_->[1](_force_int(flag1) | _force_int(flag2))\n";
1401+
}
1402+
}
1403+
}
13871404
}
13881405

13891406
# remove Q_INVOKABLE

0 commit comments

Comments
 (0)