Fix further issues when mixing link & append for asset drag & drop

917c096be6 applied to objects only, this also applies the same fix for
the general 3D View drop operations, e.g. used for dragging materials,
images, worlds, etc.

This is needed to fix T95706, but apparently something else is still
going on. Needs further investigation.
This commit is contained in:
Julian Eisel 2022-05-23 20:54:15 +02:00
parent 0d6dda4555
commit 8f79fa9c67
Notes: blender-bot 2023-02-14 01:11:05 +01:00
Referenced by commit b0da080c2c, Drag & drop: Use session UUID of IDs instead of name for dropping
Referenced by commit 7b778166db, Cleanup: Use new helpers for passing IDs from drag & drop to operators
Referenced by commit cd412b4454, Drag & drop: Invert priority of name and session UUID in ID lookups
Referenced by commit bc3dbf109c, Fix T95706: Material asset not applied if appended and then linked
Referenced by issue #95706, Asset Browser - Material is not applied if it is appended and then linked
4 changed files with 31 additions and 8 deletions

View File

@ -2629,11 +2629,9 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent
Object *ob = ED_view3d_give_material_slot_under_cursor(C, event->mval, &mat_slot);
mat_slot = max_ii(mat_slot, 1);
Material *ma;
char name[MAX_ID_NAME - 2];
Material *ma = (Material *)WM_operator_properties_id_lookup_from_name_or_session_uuid(
bmain, op, ID_MA);
RNA_string_get(op->ptr, "name", name);
ma = (Material *)BKE_libblock_find_name(bmain, ID_MA, name);
if (ob == NULL || ma == NULL) {
return OPERATOR_CANCELLED;
}
@ -2663,7 +2661,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL;
/* properties */
RNA_def_string(ot->srna, "name", "Material", MAX_ID_NAME - 2, "Name", "Material name to assign");
WM_operator_properties_id_lookup(ot, true);
}
/** \} */

View File

@ -823,15 +823,15 @@ static void view3d_id_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *dr
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
RNA_string_set(drop->ptr, "name", id->name + 2);
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
}
static void view3d_id_drop_copy_with_type(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
RNA_string_set(drop->ptr, "name", id->name + 2);
RNA_enum_set(drop->ptr, "type", GS(id->name));
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
}
static void view3d_id_path_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
@ -839,7 +839,7 @@ static void view3d_id_path_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBo
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
if (id) {
RNA_string_set(drop->ptr, "name", id->name + 2);
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
RNA_struct_property_unset(drop->ptr, "filepath");
}
else if (drag->path[0]) {

View File

@ -771,6 +771,15 @@ void WM_operator_properties_filesel(struct wmOperatorType *ot,
short display,
short sort);
/**
* Tries to pass \a id to an operator via either a "session_uuid" or a "name" property defined in
* the properties of \a ptr. The former is preferred, since it works properly with linking and
* library overrides (which may both result in multiple IDs with the same name and type).
*
* Also see #WM_operator_properties_id_lookup() and
* #WM_operator_properties_id_lookup_from_name_or_session_uuid()
*/
void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id);
/**
* Tries to find an ID in \a bmain. There needs to be either a "name" string or "session_uuid" int
* property defined and set. The former has priority. See #WM_operator_properties_id_lookup() for a

View File

@ -226,6 +226,22 @@ void WM_operator_properties_filesel(wmOperatorType *ot,
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
{
PropertyRNA *prop_session_uuid = RNA_struct_find_property(ptr, "session_uuid");
PropertyRNA *prop_name = RNA_struct_find_property(ptr, "name");
if (prop_session_uuid) {
RNA_int_set(ptr, "session_uuid", (int)id->session_uuid);
}
else if (prop_name) {
RNA_string_set(ptr, "name", id->name + 2);
}
else {
BLI_assert_unreachable();
}
}
ID *WM_operator_properties_id_lookup_from_name_or_session_uuid(Main *bmain,
const wmOperator *op,
const ID_Type type)