Drag & drop: Use session UUID of IDs instead of name for dropping
Dropping would pass the name of the ID to drop to the properties of the drop operator. This would then lookup the ID by name. With linking and/or library overrides, multiple IDs of the same name and type may exist, which is why the session UUID should be used instead. All operators used for dropping support this now and the drop code passes the session UUID instead of the name. Also see917c096be6
and8f79fa9c67
. Some drop operators were already using the session UUIDs. This converts the remaining ones. The "name" property is kept working as before, since some scripts use this. Side-effect: The "Name" property won't show up in the Adjust Last Operation anymore, which was the case for some of these operators, and its value won't be remembered over multiple executions of the operator. Both were not at all useful from what I can tell, and I doubt this was done intentionally.
This commit is contained in:
parent
7b778166db
commit
b0da080c2c
Notes:
blender-bot
2023-02-13 15:11:55 +01:00
Referenced by commit a814c7091b
, Fix T99847: Dragging image from Image Editor to Node Editor broken
Referenced by issue #99847, Regression: Dragging an image from the Image Editor into any Node Editor no longer works in 3.3
Referenced by issue #98875, Regression: Adding Camera background image immediately pops an "Image not found" error
|
@ -1265,9 +1265,9 @@ void OBJECT_OT_drop_named_image(wmOperatorType *ot)
|
|||
"Relative Path",
|
||||
"Select the file relative to the blend file");
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE));
|
||||
prop = RNA_def_string(
|
||||
ot->srna, "name", nullptr, MAX_ID_NAME - 2, "Name", "Image name to assign");
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE));
|
||||
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
|
||||
ED_object_add_generic_props(ot, false);
|
||||
}
|
||||
|
||||
|
@ -1894,18 +1894,12 @@ static int object_data_instance_add_exec(bContext *C, wmOperator *op)
|
|||
ushort local_view_bits;
|
||||
float loc[3], rot[3];
|
||||
|
||||
PropertyRNA *prop_name = RNA_struct_find_property(op->ptr, "name");
|
||||
PropertyRNA *prop_type = RNA_struct_find_property(op->ptr, "type");
|
||||
PropertyRNA *prop_location = RNA_struct_find_property(op->ptr, "location");
|
||||
|
||||
/* These shouldn't fail when created by outliner dropping as it checks the ID is valid. */
|
||||
if (!RNA_property_is_set(op->ptr, prop_name) || !RNA_property_is_set(op->ptr, prop_type)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
const short id_type = RNA_property_enum_get(op->ptr, prop_type);
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_property_string_get(op->ptr, prop_name, name);
|
||||
id = BKE_libblock_find_name(bmain, id_type, name);
|
||||
id = WM_operator_properties_id_lookup_from_name_or_session_uuid(
|
||||
bmain, op->ptr, (ID_Type)id_type);
|
||||
if (id == nullptr) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -1948,7 +1942,7 @@ void OBJECT_OT_data_instance_add(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
/* properties */
|
||||
RNA_def_string(ot->srna, "name", "Name", MAX_ID_NAME - 2, "Name", "ID name to add");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
PropertyRNA *prop = RNA_def_enum(ot->srna, "type", rna_enum_id_type_items, 0, "Type", "");
|
||||
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
|
||||
ED_object_add_generic_props(ot, false);
|
||||
|
|
|
@ -303,10 +303,8 @@ static bNodeTree *node_add_group_get_and_poll_group_node_tree(Main *bmain,
|
|||
wmOperator *op,
|
||||
bNodeTree *ntree)
|
||||
{
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
|
||||
bNodeTree *node_group = (bNodeTree *)BKE_libblock_find_name(bmain, ID_NT, name);
|
||||
bNodeTree *node_group = reinterpret_cast<bNodeTree *>(
|
||||
WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_NT));
|
||||
if (!node_group) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -423,7 +421,7 @@ void NODE_OT_add_group(wmOperatorType *ot)
|
|||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
|
||||
|
||||
RNA_def_string(ot->srna, "name", "Mask", MAX_ID_NAME - 2, "Name", "Data-block name to assign");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -721,7 +719,7 @@ void NODE_OT_add_file(wmOperatorType *ot)
|
|||
WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH,
|
||||
FILE_DEFAULTDISPLAY,
|
||||
FILE_SORT_DEFAULT);
|
||||
RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Data-block name to assign");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -672,7 +672,7 @@ static void node_group_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *d
|
|||
{
|
||||
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
|
||||
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
RNA_int_set(drop->ptr, "session_uuid", (int)id->session_uuid);
|
||||
}
|
||||
|
||||
static void node_id_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
|
||||
|
@ -687,7 +687,7 @@ static void node_id_path_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox
|
|||
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
|
||||
|
||||
if (id) {
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
RNA_int_set(drop->ptr, "session_uuid", (int)id->session_uuid);
|
||||
RNA_struct_property_unset(drop->ptr, "filepath");
|
||||
}
|
||||
else if (drag->path[0]) {
|
||||
|
|
|
@ -608,7 +608,7 @@ void VIEW3D_OT_background_image_add(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_UNDO;
|
||||
|
||||
/* properties */
|
||||
RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Image name to assign");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
WM_operator_properties_filesel(ot,
|
||||
FILE_TYPE_FOLDER | FILE_TYPE_IMAGE | FILE_TYPE_MOVIE,
|
||||
FILE_SPECIAL,
|
||||
|
@ -678,10 +678,8 @@ static int drop_world_exec(bContext *C, wmOperator *op)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
|
||||
char name[MAX_ID_NAME - 2];
|
||||
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
World *world = (World *)BKE_libblock_find_name(bmain, ID_WO, name);
|
||||
World *world = (World *)WM_operator_properties_id_lookup_from_name_or_session_uuid(
|
||||
bmain, op->ptr, ID_WO);
|
||||
if (world == NULL) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -718,7 +716,7 @@ void VIEW3D_OT_drop_world(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL;
|
||||
|
||||
/* properties */
|
||||
RNA_def_string(ot->srna, "name", "World", MAX_ID_NAME - 2, "Name", "World to assign");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -1266,6 +1266,7 @@ ID *WM_operator_drop_load_path(struct bContext *C, wmOperator *op, const short i
|
|||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
ID *id = NULL;
|
||||
|
||||
/* check input variables */
|
||||
if (RNA_struct_property_is_set(op->ptr, "filepath")) {
|
||||
const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
|
||||
|
@ -1303,19 +1304,29 @@ ID *WM_operator_drop_load_path(struct bContext *C, wmOperator *op, const short i
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
else if (RNA_struct_property_is_set(op->ptr, "name")) {
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
id = BKE_libblock_find_name(bmain, idcode, name);
|
||||
if (!id) {
|
||||
|
||||
/* Lookup an already existing ID. */
|
||||
id = WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, idcode);
|
||||
|
||||
if (!id) {
|
||||
/* Print error with the name if the name is available. */
|
||||
|
||||
if (RNA_struct_property_is_set(op->ptr, "name")) {
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
BKE_reportf(
|
||||
op->reports, RPT_ERROR, "%s '%s' not found", BKE_idtype_idcode_to_name(idcode), name);
|
||||
return NULL;
|
||||
}
|
||||
id_us_plus(id);
|
||||
|
||||
BKE_reportf(op->reports, RPT_ERROR, "%s not found", BKE_idtype_idcode_to_name(idcode));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
id_us_plus(id);
|
||||
return id;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue