[Bf-blender-cvs] [463077a3d59] blender-v3.2-release: Fix possible lingering around of ID after asset dropping failed

Julian Eisel noreply at git.blender.org
Tue May 24 15:22:46 CEST 2022


Commit: 463077a3d59df3de8a8fdc218c06c38116829f3e
Author: Julian Eisel
Date:   Tue May 24 14:22:59 2022 +0200
Branches: blender-v3.2-release
https://developer.blender.org/rB463077a3d59df3de8a8fdc218c06c38116829f3e

Fix possible lingering around of ID after asset dropping failed

More and more of the drop operations are being switched to use the ID's
session UUID rather than the name, but the cleanup after a drop operator
was cancelled assumed they would set the name. They will now first
attempt to use the session UUID and fallback to the name if needed.

===================================================================

M	source/blender/editors/object/object_add.cc
M	source/blender/editors/object/object_relations.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_dragdrop.c
M	source/blender/windowmanager/intern/wm_operator_props.c

===================================================================

diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc
index 0fc504f7de5..20b9844ac89 100644
--- a/source/blender/editors/object/object_add.cc
+++ b/source/blender/editors/object/object_add.cc
@@ -1653,7 +1653,7 @@ static std::optional<CollectionAddInfo> collection_add_info_get_from_op(bContext
   PropertyRNA *prop_location = RNA_struct_find_property(op->ptr, "location");
 
   add_info.collection = reinterpret_cast<Collection *>(
-      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_GR));
+      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_GR));
 
   bool update_location_if_necessary = false;
   if (add_info.collection) {
@@ -3717,7 +3717,7 @@ static int object_add_named_exec(bContext *C, wmOperator *op)
   /* Find object, create fake base. */
 
   Object *ob = reinterpret_cast<Object *>(
-      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_OB));
+      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_OB));
 
   if (ob == nullptr) {
     BKE_report(op->reports, RPT_ERROR, "Object not found");
@@ -3829,7 +3829,7 @@ static int object_transform_to_mouse_exec(bContext *C, wmOperator *op)
   ViewLayer *view_layer = CTX_data_view_layer(C);
 
   Object *ob = reinterpret_cast<Object *>(
-      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_OB));
+      WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_OB));
 
   if (!ob) {
     ob = OBACT(view_layer);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 0a85a60eda8..6b1eb84341f 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -2630,7 +2630,7 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent
   mat_slot = max_ii(mat_slot, 1);
 
   Material *ma = (Material *)WM_operator_properties_id_lookup_from_name_or_session_uuid(
-      bmain, op, ID_MA);
+      bmain, op->ptr, ID_MA);
 
   if (ob == NULL || ma == NULL) {
     return OPERATOR_CANCELLED;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 48ade798364..b87fa896e69 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -786,7 +786,7 @@ void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
  * helper to add the properties.
  */
 struct ID *WM_operator_properties_id_lookup_from_name_or_session_uuid(struct Main *bmain,
-                                                                      const struct wmOperator *op,
+                                                                      PointerRNA *ptr,
                                                                       enum ID_Type type);
 /**
  * Adds "name" and "session_uuid" properties so the caller can tell the operator which ID to act
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index a98ded82a92..8f96080c810 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -683,15 +683,10 @@ void WM_drag_free_imported_drag_ID(struct Main *bmain, wmDrag *drag, wmDropBox *
     return;
   }
 
-  /* Get name from property, not asset data - it may have changed after importing to ensure
-   * uniqueness (name is assumed to be set from the imported ID name). */
-  char name[MAX_ID_NAME - 2];
-  RNA_string_get(drop->ptr, "name", name);
-  if (!name[0]) {
-    return;
-  }
-
-  ID *id = BKE_libblock_find_name(bmain, asset_drag->id_type, name);
+  /* Try to find the imported ID. For this to work either a "session_uuid" or "name" property must
+   * have been defined (see #WM_operator_properties_id_lookup()). */
+  ID *id = WM_operator_properties_id_lookup_from_name_or_session_uuid(
+      bmain, drop->ptr, asset_drag->id_type);
   if (id != NULL) {
     /* Do not delete the dragged ID if it has any user, otherwise if it is a 're-used' ID it will
      * cause T95636. Note that we need first to add the user that we want to remove in
diff --git a/source/blender/windowmanager/intern/wm_operator_props.c b/source/blender/windowmanager/intern/wm_operator_props.c
index 55544e9906d..3476a16b02a 100644
--- a/source/blender/windowmanager/intern/wm_operator_props.c
+++ b/source/blender/windowmanager/intern/wm_operator_props.c
@@ -243,20 +243,20 @@ void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
 }
 
 ID *WM_operator_properties_id_lookup_from_name_or_session_uuid(Main *bmain,
-                                                               const wmOperator *op,
+                                                               PointerRNA *ptr,
                                                                const ID_Type type)
 {
-  PropertyRNA *prop_name = RNA_struct_find_property(op->ptr, "name");
-  PropertyRNA *prop_session_uuid = RNA_struct_find_property(op->ptr, "session_uuid");
+  PropertyRNA *prop_name = RNA_struct_find_property(ptr, "name");
+  PropertyRNA *prop_session_uuid = RNA_struct_find_property(ptr, "session_uuid");
 
-  if (prop_name && RNA_property_is_set(op->ptr, prop_name)) {
+  if (prop_name && RNA_property_is_set(ptr, prop_name)) {
     char name[MAX_ID_NAME - 2];
-    RNA_property_string_get(op->ptr, prop_name, name);
+    RNA_property_string_get(ptr, prop_name, name);
     return BKE_libblock_find_name(bmain, type, name);
   }
 
-  if (prop_session_uuid && RNA_property_is_set(op->ptr, prop_session_uuid)) {
-    const uint32_t session_uuid = (uint32_t)RNA_property_int_get(op->ptr, prop_session_uuid);
+  if (prop_session_uuid && RNA_property_is_set(ptr, prop_session_uuid)) {
+    const uint32_t session_uuid = (uint32_t)RNA_property_int_get(ptr, prop_session_uuid);
     return BKE_libblock_find_session_uuid(bmain, type, session_uuid);
   }



More information about the Bf-blender-cvs mailing list