Core: Add sub-types for float-type custom properties #106700

Merged
Colin Basnett merged 7 commits from cmbasnett/custom-property-float-subtypes into main 2023-04-28 05:44:55 +02:00
1 changed files with 30 additions and 18 deletions

View File

@ -1345,6 +1345,7 @@ rna_custom_property_name = StringProperty(
maxlen=63,
)
# Most useful entries of rna_enum_property_subtype_items:
rna_custom_property_type_items = (
('FLOAT', "Float", "A single floating-point value"),
('FLOAT_ARRAY', "Float Array", "An array of floating-point values"),
@ -1356,9 +1357,22 @@ rna_custom_property_type_items = (
('PYTHON', "Python", "Edit a python value directly, for unsupported property types"),
)

The reference to rna_enum_property_subtype_items was removed, this seems like it would be useful to keep, otherwise there is no hint that this is duplicating information defined elsewhere.

A reference to the enum the newly added list is copied from would be good here too.

The reference to `rna_enum_property_subtype_items` was removed, this seems like it would be useful to keep, otherwise there is no hint that this is duplicating information defined elsewhere. A reference to the enum the newly added list is copied from would be good here too.

I have restored the comment.

I have restored the comment.
# Most useful entries of rna_enum_property_subtype_items for number arrays:
rna_generic_subtype_none_item = ('NONE', "Plain Data", "Data values without special behavior")
rna_number_subtype_items = (
rna_generic_subtype_none_item,
('PIXEL', "Pixel", ""),
('PERCENTAGE', "Percentage", ""),
('FACTOR', "Factor", ""),
('ANGLE', "Angle", ""),
('TIME_ABSOLUTE', "Time", "Time specified in seconds"),
('DISTANCE', "Distance", ""),
('POWER', "Power", ""),
('TEMPERATURE', "Temperature", ""),
)
rna_vector_subtype_items = (
('NONE', "Plain Data", "Data values without special behavior"),
rna_generic_subtype_none_item,
('COLOR', "Linear Color", "Color in the linear space"),
('COLOR_GAMMA', "Gamma-Corrected Color", "Color in the gamma corrected space"),
('EULER', "Euler Angles", "Euler rotation angles in radians"),

This adds top-level functions without to wm.py which are isolated to WM_OT_properties_edit, prefer static methods on WM_OT_properties_edit to make it clear they're spesific to that operator.

This adds top-level functions without to `wm.py` which are isolated to `WM_OT_properties_edit`, prefer static methods on `WM_OT_properties_edit` to make it clear they're spesific to that operator.

I've moved them both into the WM_OT_properties_edit namespace.

I've moved them both into the WM_OT_properties_edit namespace.
@ -1373,6 +1387,16 @@ class WM_OT_properties_edit(Operator):
# register only because invoke_props_popup requires.
bl_options = {'REGISTER', 'INTERNAL'}

It seems a bit simpler to duplicate NONE between the vector subtypes and the float subtypes. What do you think about that? Totally fine if you disagree, not a strong opinion at all.

It seems a bit simpler to duplicate `NONE` between the vector subtypes and the float subtypes. What do you think about that? Totally fine if you disagree, not a strong opinion at all.

I'd prefer to not have to duplicate the string literal and just have a single-source-of-truth for the NONE entry.

I'd prefer to not have to duplicate the string literal and just have a single-source-of-truth for the `NONE` entry.

Agree duplicating NONE is simpler but that can be done using a variable:

rna_generic_subtype_none_item = ('NONE', "Plain Data", "Data values without special behavior")

rna_number_subtype_items = (
    rna_generic_subtype_none_item,
    ('PIXEL', "Pixel", ""),
    ... snip ...
)

rna_vector_subtype_items = (
    rna_generic_subtype_none_item,
    ('COLOR', "Linear Color", "Color in the linear space"),
    ... snip ...
)
Agree duplicating NONE is simpler but that can be done using a variable: ``` rna_generic_subtype_none_item = ('NONE', "Plain Data", "Data values without special behavior") rna_number_subtype_items = ( rna_generic_subtype_none_item, ('PIXEL', "Pixel", ""), ... snip ... ) rna_vector_subtype_items = ( rna_generic_subtype_none_item, ('COLOR', "Linear Color", "Color in the linear space"), ... snip ... ) ```
def subtype_items_cb(self, context):
if self.property_type == 'FLOAT':
return rna_number_subtype_items
elif self.property_type == 'FLOAT_ARRAY':
return rna_vector_subtype_items
return []
def property_type_update_cb(self, context):
self.subtype = 'NONE'
# Common settings used for all property types. Generally, separate properties are used for each
# type to improve the experience when choosing UI data values.
@ -1381,6 +1405,7 @@ class WM_OT_properties_edit(Operator):
property_type: EnumProperty(
name="Type",
items=rna_custom_property_type_items,
update=property_type_update_cb
)
is_overridable_library: BoolProperty(
name="Library Overridable",
@ -1481,7 +1506,7 @@ class WM_OT_properties_edit(Operator):
)
subtype: EnumProperty(
name="Subtype",
items=WM_OT_properties_edit.subtype_items,
items=subtype_items_cb,
)
# String properties.
@ -1497,9 +1522,6 @@ class WM_OT_properties_edit(Operator):
description="Python value for unsupported custom property types",
)
type_items = rna_custom_property_type_items
subtype_items = rna_vector_subtype_items
# Helper method to avoid repetitive code to retrieve a single value from sequences and non-sequences.
@staticmethod
def _convert_new_value_single(old_value, new_type):
@ -1567,15 +1589,7 @@ class WM_OT_properties_edit(Operator):
return 'PYTHON'
def _init_subtype(self, subtype):
subtype = subtype or 'NONE'
subtype_items = rna_vector_subtype_items
# Add a temporary enum entry to preserve unknown subtypes
if not any(subtype == item[0] for item in subtype_items):
subtype_items += ((subtype, subtype, ""),)
WM_OT_properties_edit.subtype_items = subtype_items
self.subtype = subtype
self.subtype = subtype or 'NONE'
# Fill the operator's properties with the UI data properties from the existing custom property.
# Note that if the UI data doesn't exist yet, the access will create it and use those default values.
@ -1904,9 +1918,7 @@ class WM_OT_properties_edit(Operator):
layout.prop(self, "step_float")
layout.prop(self, "precision")
# Subtype is only supported for float properties currently.
if self.property_type != 'FLOAT':
layout.prop(self, "subtype")
layout.prop(self, "subtype")
elif self.property_type in {'INT', 'INT_ARRAY'}:
if self.property_type == 'INT_ARRAY':
layout.prop(self, "array_length")