Skip to content

Commit fc33bc0

Browse files
committed
Handle enum values for data defined properties by converting to int
1 parent 4293d4f commit fc33bc0

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

python/PyQt/PyQt/common.py.in

+48
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ def _handle_extended_enum_values(v):
2424
in the Enum class.
2525
Otherwise returns v unchanged.
2626
"""
27+
if isinstance(v, list):
28+
return [_handle_extended_enum_values(_item) for _item in v]
29+
if isinstance(v, dict):
30+
return {_key: _handle_extended_enum_values(_value) for _key, _value in v.items()}
2731
if isinstance(v, Enum):
2832
# v may be an Enum value which itself is an Enum value!
2933
# E.g. QNetworkRequest.Attribute(QgsNetworkRequestParameters.RequestAttributes.AttributeInitiatorClass)
@@ -56,3 +60,47 @@ def install_extended_enum_wrapper(f):
5660
"""
5761
return _extended_enum_wrapper(f)
5862

63+
64+
def _convert_enum_values_to_int(v):
65+
"""
66+
If v is an Enum, returns an integer representation of its value wrapped
67+
in the Enum class.
68+
Otherwise returns v unchanged.
69+
"""
70+
if isinstance(v, list):
71+
return [_convert_enum_values_to_int(_item) for _item in v]
72+
if isinstance(v, dict):
73+
return {_key: _convert_enum_values_to_int(_value) for _key, _value in v.items()}
74+
if isinstance(v, Enum):
75+
# v may be an Enum value which itself is an Enum value!
76+
# E.g. QNetworkRequest.Attribute(QgsNetworkRequestParameters.RequestAttributes.AttributeInitiatorClass)
77+
# in this case v is an Enum of the class QNetworkRequest.Attribute, while v.value is an Enum of the
78+
# class QgsNetworkRequestParameters.RequestAttributes. For this to work, we need to extract the integer
79+
# value from QgsNetworkRequestParameters.RequestAttributes.AttributeInitiatorClass and then convert it
80+
# to a QNetworkRequest.Attribute enum value!
81+
if isinstance(v.value, Enum):
82+
return int(v.value.value)
83+
return int(v.value)
84+
return v
85+
86+
87+
def _enum_to_int_wrapper(method):
88+
"""
89+
Calls a function, first converting all passed Enum arguments to integer
90+
values.
91+
"""
92+
@functools.wraps(method)
93+
def wrapped(*args, **kwargs):
94+
parsed_args = [_convert_enum_values_to_int(arg) for arg in args]
95+
parsed_kwargs = {k: _convert_enum_values_to_int(v) for k, v in kwargs.items()}
96+
return method(*parsed_args, **parsed_kwargs)
97+
98+
return wrapped
99+
100+
101+
def install_enum_to_int_wrapper(f):
102+
"""
103+
Installs a wrapper on a function so that all passed Enum arguments are converted to integer values.
104+
"""
105+
return _enum_to_int_wrapper(f)
106+

python/PyQt6/core/__init__.py.in

+18
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ __author__ = 'Nathan Woodrow'
2121
__date__ = 'May 2014'
2222
__copyright__ = '(C) 2014, Nathan Woodrow'
2323

24+
from qgis.PyQt.common import install_enum_to_int_wrapper
2425
from qgis.PyQt.QtCore import NULL
2526
from qgis._core import *
2627

@@ -159,3 +160,20 @@ PROJECT_SCALES = Qgis.defaultProjectScales()
159160
GEOPROJ4 = geoProj4()
160161
GEO_EPSG_CRS_AUTHID = geoEpsgCrsAuthId()
161162
GEO_NONE = geoNone()
163+
164+
QgsPropertyCollection.setProperty = install_enum_to_int_wrapper(QgsPropertyCollection.setProperty)
165+
QgsPropertyCollection.property = install_enum_to_int_wrapper(QgsPropertyCollection.property)
166+
QgsPropertyCollection.hasProperty = install_enum_to_int_wrapper(QgsPropertyCollection.hasProperty)
167+
QgsPropertyCollection.isActive = install_enum_to_int_wrapper(QgsPropertyCollection.isActive)
168+
QgsAbstractPropertyCollection.value = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.value)
169+
QgsAbstractPropertyCollection.valueAsDateTime = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsDateTime)
170+
QgsAbstractPropertyCollection.valueAsString = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsString)
171+
QgsAbstractPropertyCollection.valueAsColor = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsColor)
172+
QgsAbstractPropertyCollection.valueAsDouble = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsDouble)
173+
QgsAbstractPropertyCollection.valueAsInt = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsInt)
174+
QgsAbstractPropertyCollection.valueAsBool = install_enum_to_int_wrapper(QgsAbstractPropertyCollection.valueAsBool)
175+
QgsSymbol.setDataDefinedProperty = install_enum_to_int_wrapper(QgsSymbol.setDataDefinedProperty)
176+
QgsSymbolLayer.setDataDefinedProperty = install_enum_to_int_wrapper(QgsSymbolLayer.setDataDefinedProperty)
177+
QgsHashedLineSymbolLayer.setDataDefinedProperty = install_enum_to_int_wrapper(QgsHashedLineSymbolLayer.setDataDefinedProperty)
178+
QgsMarkerLineSymbolLayer.setDataDefinedProperty = install_enum_to_int_wrapper(QgsMarkerLineSymbolLayer.setDataDefinedProperty)
179+

0 commit comments

Comments
 (0)