Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/modules/rna_prop_ui.py51
-rw-r--r--release/scripts/startup/bl_operators/wm.py25
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc3
-rw-r--r--source/blender/editors/interface/interface_layout.c4
-rw-r--r--source/blender/makesrna/intern/rna_access.c165
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);