diff options
-rw-r--r-- | release/scripts/modules/rna_prop_ui.py | 51 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/wm.py | 25 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 3 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 3 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 165 |
6 files changed, 189 insertions, 62 deletions
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py index 9d1ba035b3e..b568f9835a0 100644 --- a/release/scripts/modules/rna_prop_ui.py +++ b/release/scripts/modules/rna_prop_ui.py @@ -20,6 +20,15 @@ import bpy +from mathutils import Vector +from idprop.types import IDPropertyArray, IDPropertyGroup + +ARRAY_TYPES = (list, tuple, IDPropertyArray, Vector) + +# Maximum length of an array property for which a multi-line +# edit field will be displayed in the Custom Properties panel. +MAX_DISPLAY_ROWS = 4 + def rna_idprop_ui_get(item, create=True): try: @@ -101,23 +110,47 @@ def rna_idprop_has_properties(rna_item): return (nbr_props > 1) or (nbr_props and '_RNA_UI' not in keys) +def rna_idprop_value_to_python(value): + if isinstance(value, IDPropertyArray): + return value.to_list() + elif isinstance(value, IDPropertyGroup): + return value.to_dict() + else: + return value + + +def rna_idprop_value_item_type(value): + is_array = isinstance(value, ARRAY_TYPES) and len(value) > 0 + item_value = value[0] if is_array else value + return type(item_value), is_array + + def rna_idprop_ui_prop_default_set(item, prop, value): defvalue = None try: - prop_type = type(item[prop]) + prop_type, is_array = rna_idprop_value_item_type(item[prop]) if prop_type in {int, float}: - defvalue = prop_type(value) + if is_array and isinstance(value, ARRAY_TYPES): + value = [prop_type(item) for item in value] + if any(value): + defvalue = value + else: + defvalue = prop_type(value) except KeyError: pass + except ValueError: + pass if defvalue: rna_ui = rna_idprop_ui_prop_get(item, prop, True) rna_ui["default"] = defvalue else: rna_ui = rna_idprop_ui_prop_get(item, prop) - if rna_ui and "default" in rna_ui: - del rna_ui["default"] + if rna_ui: + rna_ui.pop("default", None) + + return defvalue def rna_idprop_ui_create( @@ -129,7 +162,7 @@ def rna_idprop_ui_create( ): """Create and initialize a custom property with limits, defaults and other settings.""" - proptype = type(default) + proptype, is_array = rna_idprop_value_item_type(default) # Sanitize limits if proptype is bool: @@ -159,7 +192,7 @@ def rna_idprop_ui_create( rna_ui["max"] = proptype(max) rna_ui["soft_max"] = proptype(soft_max) - if default: + if default and (not is_array or any(default)): rna_ui["default"] = default # Assign other settings @@ -252,7 +285,11 @@ def draw(layout, context, context_member, property_type, use_edit=True): row.label(text=key, translate=False) # explicit exception for arrays. - if to_dict or to_list: + show_array_ui = to_list and not is_rna and 0 < len(val) <= MAX_DISPLAY_ROWS + + if show_array_ui and isinstance(val[0], (int, float)): + row.prop(rna_item, '["%s"]' % escape_identifier(key), text="") + elif to_dict or to_list: row.label(text=val_draw, translate=False) else: if is_rna: diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 5cc4b773b54..97a242772a4 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1139,6 +1139,8 @@ class WM_OT_properties_edit(Operator): rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear, rna_idprop_ui_prop_update, + rna_idprop_ui_prop_default_set, + rna_idprop_value_item_type, ) data_path = self.data_path @@ -1174,15 +1176,15 @@ class WM_OT_properties_edit(Operator): self._last_prop[:] = [prop] - prop_type = type(item[prop]) + prop_value = item[prop] + prop_type_new = type(prop_value) + prop_type, is_array = rna_idprop_value_item_type(prop_value) prop_ui = rna_idprop_ui_prop_get(item, prop) if prop_type in {float, int}: prop_ui["min"] = prop_type(self.min) prop_ui["max"] = prop_type(self.max) - if type(default_eval) in {float, int} and default_eval != 0: - prop_ui["default"] = prop_type(default_eval) if self.use_soft_limits: prop_ui["soft_min"] = prop_type(self.soft_min) @@ -1193,8 +1195,10 @@ class WM_OT_properties_edit(Operator): prop_ui["description"] = self.description + rna_idprop_ui_prop_default_set(item, prop, default_eval) + # If we have changed the type of the property, update its potential anim curves! - if prop_type_old != prop_type: + if prop_type_old != prop_type_new: data_path = '["%s"]' % bpy.utils.escape_identifier(prop) done = set() @@ -1231,7 +1235,7 @@ class WM_OT_properties_edit(Operator): return {'FINISHED'} def invoke(self, context, _event): - from rna_prop_ui import rna_idprop_ui_prop_get + from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_value_to_python data_path = self.data_path @@ -1263,7 +1267,7 @@ class WM_OT_properties_edit(Operator): defval = prop_ui.get("default", None) if defval is not None: - self.default = str(defval) + self.default = str(rna_idprop_value_to_python(defval)) self.soft_min = prop_ui.get("soft_min", self.min) self.soft_max = prop_ui.get("soft_max", self.max) @@ -1307,12 +1311,19 @@ class WM_OT_properties_edit(Operator): return changed def draw(self, _context): + from rna_prop_ui import ( + rna_idprop_value_item_type, + ) + layout = self.layout layout.prop(self, "property") layout.prop(self, "value") + value = self.get_value_eval() + proptype, is_array = rna_idprop_value_item_type(value) + row = layout.row() - row.enabled = type(self.get_value_eval()) in {int, float} + row.enabled = proptype in {int, float} row.prop(self, "default") row = layout.row(align=True) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 986f65df3fc..fd4c1e251e4 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -944,8 +944,9 @@ void DepsgraphNodeBuilder::build_driver_id_property(ID *id, const char *rna_path } PointerRNA id_ptr, ptr; PropertyRNA *prop; + int index; RNA_id_pointer_create(id, &id_ptr); - if (!RNA_path_resolve_full(&id_ptr, rna_path, &ptr, &prop, NULL)) { + if (!RNA_path_resolve_full(&id_ptr, rna_path, &ptr, &prop, &index)) { return; } if (prop == NULL) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 27b519a8551..3c226338bfd 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1531,8 +1531,9 @@ void DepsgraphRelationBuilder::build_driver_id_property(ID *id, const char *rna_ } PointerRNA id_ptr, ptr; PropertyRNA *prop; + int index; RNA_id_pointer_create(id, &id_ptr); - if (!RNA_path_resolve_full(&id_ptr, rna_path, &ptr, &prop, NULL)) { + if (!RNA_path_resolve_full(&id_ptr, rna_path, &ptr, &prop, &index)) { return; } if (prop == NULL) { diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 25fedf8519a..530689f2d27 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1832,7 +1832,9 @@ static void ui_item_rna_size(uiLayout *layout, h += len * UI_UNIT_Y; } } - else if (ui_layout_variable_size(layout)) { + + /* Increase width requirement if in a variable size layout. */ + if (ui_layout_variable_size(layout)) { if (type == PROP_BOOLEAN && name[0]) { w += UI_UNIT_X / 5; } diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 731f549b497..6d02bfa0987 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -2522,20 +2522,33 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value) } } -static void rna_property_boolean_get_default_array_values(BoolPropertyRNA *bprop, bool *values) +static void rna_property_boolean_fill_default_array_values( + const bool *defarr, int defarr_length, bool defvalue, int out_length, bool *r_values) { - unsigned int length = bprop->property.totarraylength; - - if (bprop->defaultarray) { - memcpy(values, bprop->defaultarray, sizeof(bool) * length); + if (defarr && defarr_length > 0) { + defarr_length = MIN2(defarr_length, out_length); + memcpy(r_values, defarr, sizeof(bool) * defarr_length); } else { - for (unsigned int i = 0; i < length; i++) { - values[i] = bprop->defaultvalue; - } + defarr_length = 0; + } + + for (int i = defarr_length; i < out_length; i++) { + r_values[i] = defvalue; } } +static void rna_property_boolean_get_default_array_values(PointerRNA *ptr, + BoolPropertyRNA *bprop, + bool *r_values) +{ + int length = bprop->property.totarraylength; + int out_length = RNA_property_array_length(ptr, (PropertyRNA *)bprop); + + rna_property_boolean_fill_default_array_values( + bprop->defaultarray, length, bprop->defaultvalue, out_length, r_values); +} + void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, bool *values) { BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; @@ -2565,7 +2578,7 @@ void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, bool *va bprop->getarray_ex(ptr, prop, values); } else { - rna_property_boolean_get_default_array_values(bprop, values); + rna_property_boolean_get_default_array_values(ptr, bprop, values); } } @@ -2684,9 +2697,7 @@ bool RNA_property_boolean_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop return bprop->defaultvalue; } -void RNA_property_boolean_get_default_array(PointerRNA *UNUSED(ptr), - PropertyRNA *prop, - bool *values) +void RNA_property_boolean_get_default_array(PointerRNA *ptr, PropertyRNA *prop, bool *values) { BoolPropertyRNA *bprop = (BoolPropertyRNA *)rna_ensure_property(prop); @@ -2697,7 +2708,7 @@ void RNA_property_boolean_get_default_array(PointerRNA *UNUSED(ptr), values[0] = bprop->defaultvalue; } else { - rna_property_boolean_get_default_array_values(bprop, values); + rna_property_boolean_get_default_array_values(ptr, bprop, values); } } @@ -2709,7 +2720,7 @@ bool RNA_property_boolean_get_default_index(PointerRNA *ptr, PropertyRNA *prop, BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); BLI_assert(RNA_property_array_check(prop) != false); BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(index < len); if (len <= RNA_MAX_ARRAY_LENGTH) { RNA_property_boolean_get_default_array(ptr, prop, tmp); @@ -2785,20 +2796,33 @@ void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value) } } -static void rna_property_int_get_default_array_values(IntPropertyRNA *iprop, int *values) +static void rna_property_int_fill_default_array_values( + const int *defarr, int defarr_length, int defvalue, int out_length, int *r_values) { - unsigned int length = iprop->property.totarraylength; - - if (iprop->defaultarray) { - memcpy(values, iprop->defaultarray, sizeof(int) * length); + if (defarr && defarr_length > 0) { + defarr_length = MIN2(defarr_length, out_length); + memcpy(r_values, defarr, sizeof(int) * defarr_length); } else { - for (unsigned int i = 0; i < length; i++) { - values[i] = iprop->defaultvalue; - } + defarr_length = 0; + } + + for (int i = defarr_length; i < out_length; i++) { + r_values[i] = defvalue; } } +static void rna_property_int_get_default_array_values(PointerRNA *ptr, + IntPropertyRNA *iprop, + int *r_values) +{ + int length = iprop->property.totarraylength; + int out_length = RNA_property_array_length(ptr, (PropertyRNA *)iprop); + + rna_property_int_fill_default_array_values( + iprop->defaultarray, length, iprop->defaultvalue, out_length, r_values); +} + void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values) { IntPropertyRNA *iprop = (IntPropertyRNA *)prop; @@ -2827,7 +2851,7 @@ void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values) iprop->getarray_ex(ptr, prop, values); } else { - rna_property_int_get_default_array_values(iprop, values); + rna_property_int_get_default_array_values(ptr, iprop, values); } } @@ -2999,18 +3023,34 @@ bool RNA_property_int_set_default(PointerRNA *ptr, PropertyRNA *prop, int value) } } -void RNA_property_int_get_default_array(PointerRNA *UNUSED(ptr), PropertyRNA *prop, int *values) +void RNA_property_int_get_default_array(PointerRNA *ptr, PropertyRNA *prop, int *values) { IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); BLI_assert(RNA_property_type(prop) == PROP_INT); BLI_assert(RNA_property_array_check(prop) != false); - if (prop->arraydimension == 0) { + if (prop->magic != RNA_MAGIC) { + int length = rna_ensure_property_array_length(ptr, prop); + + IDProperty *idp_ui = rna_idproperty_ui(prop); + IDProperty *item = idp_ui ? IDP_GetPropertyFromGroup(idp_ui, "default") : NULL; + + int defval = (item && item->type == IDP_INT) ? IDP_Int(item) : iprop->defaultvalue; + + if (item && item->type == IDP_ARRAY && item->subtype == IDP_INT) { + rna_property_int_fill_default_array_values( + IDP_Array(item), item->len, defval, length, values); + } + else { + rna_property_int_fill_default_array_values(NULL, 0, defval, length, values); + } + } + else if (prop->arraydimension == 0) { values[0] = iprop->defaultvalue; } else { - rna_property_int_get_default_array_values(iprop, values); + rna_property_int_get_default_array_values(ptr, iprop, values); } } @@ -3022,7 +3062,7 @@ int RNA_property_int_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int i BLI_assert(RNA_property_type(prop) == PROP_INT); BLI_assert(RNA_property_array_check(prop) != false); BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(index < len); if (len <= RNA_MAX_ARRAY_LENGTH) { RNA_property_int_get_default_array(ptr, prop, tmp); @@ -3109,20 +3149,33 @@ void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value) } } -static void rna_property_float_get_default_array_values(FloatPropertyRNA *fprop, float *values) +static void rna_property_float_fill_default_array_values( + const float *defarr, int defarr_length, float defvalue, int out_length, float *r_values) { - unsigned int length = fprop->property.totarraylength; - - if (fprop->defaultarray) { - memcpy(values, fprop->defaultarray, sizeof(float) * length); + if (defarr && defarr_length > 0) { + defarr_length = MIN2(defarr_length, out_length); + memcpy(r_values, defarr, sizeof(float) * defarr_length); } else { - for (unsigned int i = 0; i < length; i++) { - values[i] = fprop->defaultvalue; - } + defarr_length = 0; + } + + for (int i = defarr_length; i < out_length; i++) { + r_values[i] = defvalue; } } +static void rna_property_float_get_default_array_values(PointerRNA *ptr, + FloatPropertyRNA *fprop, + float *r_values) +{ + int length = fprop->property.totarraylength; + int out_length = RNA_property_array_length(ptr, (PropertyRNA *)fprop); + + rna_property_float_fill_default_array_values( + fprop->defaultarray, length, fprop->defaultvalue, out_length, r_values); +} + void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values) { FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; @@ -3157,7 +3210,7 @@ void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *val fprop->getarray_ex(ptr, prop, values); } else { - rna_property_float_get_default_array_values(fprop, values); + rna_property_float_get_default_array_values(ptr, fprop, values); } } @@ -3343,20 +3396,40 @@ bool RNA_property_float_set_default(PointerRNA *ptr, PropertyRNA *prop, float va } } -void RNA_property_float_get_default_array(PointerRNA *UNUSED(ptr), - PropertyRNA *prop, - float *values) +void RNA_property_float_get_default_array(PointerRNA *ptr, PropertyRNA *prop, float *values) { FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); BLI_assert(RNA_property_type(prop) == PROP_FLOAT); BLI_assert(RNA_property_array_check(prop) != false); - if (prop->arraydimension == 0) { + if (prop->magic != RNA_MAGIC) { + int length = rna_ensure_property_array_length(ptr, prop); + + IDProperty *idp_ui = rna_idproperty_ui(prop); + IDProperty *item = idp_ui ? IDP_GetPropertyFromGroup(idp_ui, "default") : NULL; + + float defval = (item && item->type == IDP_DOUBLE) ? IDP_Double(item) : fprop->defaultvalue; + + if (item && item->type == IDP_ARRAY && item->subtype == IDP_DOUBLE) { + double *defarr = IDP_Array(item); + for (int i = 0; i < length; i++) { + values[i] = (i < item->len) ? (float)defarr[i] : defval; + } + } + else if (item && item->type == IDP_ARRAY && item->subtype == IDP_FLOAT) { + rna_property_float_fill_default_array_values( + IDP_Array(item), item->len, defval, length, values); + } + else { + rna_property_float_fill_default_array_values(NULL, 0, defval, length, values); + } + } + else if (prop->arraydimension == 0) { values[0] = fprop->defaultvalue; } else { - rna_property_float_get_default_array_values(fprop, values); + rna_property_float_get_default_array_values(ptr, fprop, values); } } @@ -3368,7 +3441,7 @@ float RNA_property_float_get_default_index(PointerRNA *ptr, PropertyRNA *prop, i BLI_assert(RNA_property_type(prop) == PROP_FLOAT); BLI_assert(RNA_property_array_check(prop) != false); BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(index < len); if (len <= RNA_MAX_ARRAY_LENGTH) { RNA_property_float_get_default_array(ptr, prop, tmp); @@ -7083,6 +7156,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, FunctionRNA *func) { PropertyRNA *parm; + PointerRNA null_ptr = PointerRNA_NULL; void *data; int alloc_size = 0, size; @@ -7122,7 +7196,8 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, switch (parm->type) { case PROP_BOOLEAN: if (parm->arraydimension) { - rna_property_boolean_get_default_array_values((BoolPropertyRNA *)parm, data); + rna_property_boolean_get_default_array_values( + &null_ptr, (BoolPropertyRNA *)parm, data); } else { memcpy(data, &((BoolPropertyRNA *)parm)->defaultvalue, size); @@ -7130,7 +7205,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, break; case PROP_INT: if (parm->arraydimension) { - rna_property_int_get_default_array_values((IntPropertyRNA *)parm, data); + rna_property_int_get_default_array_values(&null_ptr, (IntPropertyRNA *)parm, data); } else { memcpy(data, &((IntPropertyRNA *)parm)->defaultvalue, size); @@ -7138,7 +7213,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, break; case PROP_FLOAT: if (parm->arraydimension) { - rna_property_float_get_default_array_values((FloatPropertyRNA *)parm, data); + rna_property_float_get_default_array_values(&null_ptr, (FloatPropertyRNA *)parm, data); } else { memcpy(data, &((FloatPropertyRNA *)parm)->defaultvalue, size); |