diff --git a/scripts/startup/bl_operators/wm.py b/scripts/startup/bl_operators/wm.py index 139460ecbef..eb14bcebac1 100644 --- a/scripts/startup/bl_operators/wm.py +++ b/scripts/startup/bl_operators/wm.py @@ -1644,6 +1644,14 @@ class WM_OT_properties_edit(Operator): return 'PYTHON' + # For `DATABLOCK` types, return the `id_type` or an empty string for non data-block types. + @staticmethod + def get_property_id_type(item, property_name): + ui_data = item.id_properties_ui(property_name) + rna_data = ui_data.as_dict() + # For non `DATABLOCK` types, the `id_type` wont exist. + return rna_data.get("id_type", "") + def _init_subtype(self, subtype): self.subtype = subtype or 'NONE' @@ -1697,7 +1705,7 @@ class WM_OT_properties_edit(Operator): # When the operator chooses a different type than the original property, # attempt to convert the old value to the new type for continuity and speed. - def _get_converted_value(self, item, name_old, prop_type_new): + def _get_converted_value(self, item, name_old, prop_type_new, id_type_old, id_type_new): if prop_type_new == 'INT': return self._convert_new_value_single(item[name_old], int) elif prop_type_new == 'FLOAT': @@ -1721,7 +1729,13 @@ class WM_OT_properties_edit(Operator): elif prop_type_new == 'STRING': return self.convert_custom_property_to_string(item, name_old) elif prop_type_new == 'DATABLOCK': - return None + if id_type_old != id_type_new: + return None + old_value = item[name_old] + if not isinstance(old_value, bpy.types.ID): + return None + return old_value + # If all else fails, create an empty string property. That should avoid errors later on anyway. return "" @@ -1852,6 +1866,9 @@ class WM_OT_properties_edit(Operator): prop_type_new = self.property_type self._old_prop_name[:] = [name] + id_type_old = self.get_property_id_type(item, name_old) + id_type_new = self.id_type + if prop_type_new == 'PYTHON': try: new_value = eval(self.eval_string) @@ -1866,7 +1883,7 @@ class WM_OT_properties_edit(Operator): if name_old != name: del item[name_old] else: - new_value = self._get_converted_value(item, name_old, prop_type_new) + new_value = self._get_converted_value(item, name_old, prop_type_new, id_type_old, id_type_new) del item[name_old] item[name] = new_value