Refactor: Avoid evil context storage in drag data for asset import

Context is needed to import and instantiate assets correctly. Previously
the context was stored as "evil" pointer in the drag data. Since
77794b1a7b, context is passed to the dragging callbacks doing the asset
import, so the context doesn't need to be stored that way anymore and
can simply be passed to the import function.
This commit is contained in:
Julian Eisel 2023-07-28 12:16:52 +02:00
parent 1f722a6d01
commit d1e590eafa
8 changed files with 34 additions and 50 deletions

View File

@ -38,13 +38,6 @@ void UI_but_drag_set_asset(uiBut *but,
{
wmDragAsset *asset_drag = WM_drag_create_asset_data(asset, import_type);
/* FIXME: This is temporary evil solution to get scene/view-layer/etc in the copy callback of the
* #wmDropBox.
* TODO: Handle link/append in operator called at the end of the drop process, and NOT in its
* copy callback.
* */
asset_drag->evil_C = static_cast<bContext *>(but->block->evil_C);
but->dragtype = WM_DRAG_ASSET;
ui_def_but_icon(but, icon, 0); /* no flag UI_HAS_ICON, so icon doesn't draw in button */
if (but->dragflag & UI_BUT_DRAGPOIN_FREE) {

View File

@ -86,9 +86,9 @@ static bool ui_drop_material_poll(bContext *C, wmDrag *drag, const wmEvent * /*e
return WM_drag_is_ID_type(drag, ID_MA) && !RNA_pointer_is_null(&mat_slot);
}
static void ui_drop_material_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void ui_drop_material_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
const ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, ID_MA);
const ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, ID_MA);
RNA_int_set(drop->ptr, "session_uuid", int(id->session_uuid));
}

View File

@ -691,23 +691,23 @@ static bool node_mask_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent *
return WM_drag_is_ID_type(drag, ID_MSK);
}
static void node_group_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void node_group_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
RNA_int_set(drop->ptr, "session_uuid", int(id->session_uuid));
}
static void node_id_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void node_id_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
RNA_int_set(drop->ptr, "session_uuid", int(id->session_uuid));
}
static void node_id_path_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void node_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
if (id) {
RNA_int_set(drop->ptr, "session_uuid", int(id->session_uuid));

View File

@ -221,7 +221,7 @@ static float update_overlay_strip_position_data(bContext *C, const int mval[2])
static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
/* ID dropped. */
if (id != nullptr) {
const ID_Type id_type = GS(id->name);
@ -316,9 +316,9 @@ static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
}
}
static void get_drag_path(wmDrag *drag, char r_path[FILE_MAX])
static void get_drag_path(const bContext *C, wmDrag *drag, char r_path[FILE_MAX])
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
/* ID dropped. */
if (id != nullptr) {
const ID_Type id_type = GS(id->name);
@ -456,7 +456,7 @@ static void draw_seq_in_view(bContext *C, wmWindow * /*win*/, wmDrag *drag, cons
char strip_duration_text[16];
int len_text_arr = 0;
get_drag_path(drag, path);
get_drag_path(C, drag, path);
if (sseq->timeline_overlay.flag & SEQ_TIMELINE_SHOW_STRIP_NAME) {
BLI_path_split_file_part(path, filename, FILE_MAX);
@ -590,7 +590,7 @@ static void start_audio_video_job(bContext *C, wmDrag *drag, bool only_audio)
DropJobData *job_data = (DropJobData *)MEM_mallocN(sizeof(DropJobData),
"SeqDragDropPreviewData");
get_drag_path(drag, job_data->path);
get_drag_path(C, drag, job_data->path);
job_data->only_audio = only_audio;
job_data->scene_fps = FPS;

View File

@ -806,7 +806,7 @@ static void view3d_ob_drop_copy_local_id(bContext * /*C*/, wmDrag *drag, wmDropB
/* Mostly the same logic as #view3d_collection_drop_copy_external_asset(), just different enough to
* make sharing code a bit difficult. */
static void view3d_ob_drop_copy_external_asset(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void view3d_ob_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDropBox *drop)
{
/* NOTE(@ideasman42): Selection is handled here, de-selecting objects before append,
* using auto-select to ensure the new objects are selected.
@ -815,13 +815,12 @@ static void view3d_ob_drop_copy_external_asset(bContext * /*C*/, wmDrag *drag, w
BLI_assert(drag->type == WM_DRAG_ASSET);
wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
bContext *C = asset_drag->evil_C;
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
BKE_view_layer_base_deselect_all(scene, view_layer);
ID *id = WM_drag_asset_id_import(asset_drag, FILE_AUTOSELECT);
ID *id = WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT);
/* TODO(sergey): Only update relations for the current scene. */
DEG_relations_tag_update(CTX_data_main(C));
@ -856,20 +855,17 @@ static void view3d_collection_drop_copy_local_id(bContext * /*C*/, wmDrag *drag,
/* Mostly the same logic as #view3d_ob_drop_copy_external_asset(), just different enough to make
* sharing code a bit difficult. */
static void view3d_collection_drop_copy_external_asset(bContext * /*C*/,
wmDrag *drag,
wmDropBox *drop)
static void view3d_collection_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDropBox *drop)
{
BLI_assert(drag->type == WM_DRAG_ASSET);
wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
bContext *C = asset_drag->evil_C;
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
BKE_view_layer_base_deselect_all(scene, view_layer);
ID *id = WM_drag_asset_id_import(asset_drag, FILE_AUTOSELECT);
ID *id = WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT);
Collection *collection = (Collection *)id;
/* TODO(sergey): Only update relations for the current scene. */
@ -895,24 +891,24 @@ static void view3d_collection_drop_copy_external_asset(bContext * /*C*/,
ED_undo_push(C, "Collection_Drop");
}
static void view3d_id_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void view3d_id_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
}
static void view3d_id_drop_copy_with_type(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
static void view3d_id_drop_copy_with_type(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
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 * /*C*/, wmDrag *drag, wmDropBox *drop)
static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
{
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
ID *id = WM_drag_get_local_ID_or_import_from_asset(C, drag, 0);
if (id) {
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);

View File

@ -1455,7 +1455,7 @@ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid);
/**
* \param flag_extra: Additional linking flags (from #eFileSel_Params_Flag).
*/
ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, int flag_extra);
ID *WM_drag_asset_id_import(const struct bContext *C, wmDragAsset *asset_drag, int flag_extra);
bool WM_drag_asset_will_import_linked(const wmDrag *drag);
void WM_drag_add_local_ID(struct wmDrag *drag, struct ID *id, struct ID *from_parent);
struct ID *WM_drag_get_local_ID(const struct wmDrag *drag, short idcode);
@ -1482,7 +1482,9 @@ struct AssetMetaData *WM_drag_get_asset_meta_data(const struct wmDrag *drag, int
* Use #WM_drag_free_imported_drag_ID() as cancel callback of the drop-box, so that the asset
* import is rolled back if the drop operator fails.
*/
struct ID *WM_drag_get_local_ID_or_import_from_asset(const struct wmDrag *drag, int idcode);
struct ID *WM_drag_get_local_ID_or_import_from_asset(const struct bContext *C,
const struct wmDrag *drag,
int idcode);
/**
* \brief Free asset ID imported for canceled drop.

View File

@ -1109,13 +1109,6 @@ typedef struct wmDragID {
typedef struct wmDragAsset {
int import_method; /* eAssetImportType */
const AssetRepresentationHandle *asset;
/* FIXME: This is temporary evil solution to get scene/view-layer/etc in the copy callback of the
* #wmDropBox.
* TODO: Handle link/append in operator called at the end of the drop process, and NOT in its
* copy callback.
* */
struct bContext *evil_C;
} wmDragAsset;
typedef struct wmDragAssetCatalog {

View File

@ -611,7 +611,7 @@ AssetMetaData *WM_drag_get_asset_meta_data(const wmDrag *drag, int idcode)
return nullptr;
}
ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, const int flag_extra)
ID *WM_drag_asset_id_import(const bContext *C, wmDragAsset *asset_drag, const int flag_extra)
{
/* Only support passing in limited flags. */
BLI_assert(flag_extra == (flag_extra & FILE_AUTOSELECT));
@ -626,10 +626,10 @@ ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, const int flag_extra)
/* FIXME: Link/Append should happens in the operator called at the end of drop process, not from
* here. */
Main *bmain = CTX_data_main(asset_drag->evil_C);
Scene *scene = CTX_data_scene(asset_drag->evil_C);
ViewLayer *view_layer = CTX_data_view_layer(asset_drag->evil_C);
View3D *view3d = CTX_wm_view3d(asset_drag->evil_C);
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
View3D *view3d = CTX_wm_view3d(C);
switch (eAssetImportMethod(asset_drag->import_method)) {
case ASSET_IMPORT_LINK:
@ -678,7 +678,7 @@ bool WM_drag_asset_will_import_linked(const wmDrag *drag)
return asset_drag->import_method == ASSET_IMPORT_LINK;
}
ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
ID *WM_drag_get_local_ID_or_import_from_asset(const bContext *C, const wmDrag *drag, int idcode)
{
if (!ELEM(drag->type, WM_DRAG_ASSET, WM_DRAG_ID)) {
return nullptr;
@ -694,7 +694,7 @@ ID *WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
}
/* Link/append the asset. */
return WM_drag_asset_id_import(asset_drag, 0);
return WM_drag_asset_id_import(C, asset_drag, 0);
}
void WM_drag_free_imported_drag_ID(Main *bmain, wmDrag *drag, wmDropBox *drop)