diff --git a/source/blender/editors/interface/interface_drag.cc b/source/blender/editors/interface/interface_drag.cc index 1a2b5476266..436a9d33ba0 100644 --- a/source/blender/editors/interface/interface_drag.cc +++ b/source/blender/editors/interface/interface_drag.cc @@ -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(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) { diff --git a/source/blender/editors/interface/interface_dropboxes.cc b/source/blender/editors/interface/interface_dropboxes.cc index 2fe218e0be4..6ebbf08a1d4 100644 --- a/source/blender/editors/interface/interface_dropboxes.cc +++ b/source/blender/editors/interface/interface_dropboxes.cc @@ -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)); } diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 23f594c319c..63a64e57968 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -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)); diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index fcc8ad10074..1e45e3d949d 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -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; diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 0d911362df2..783a5ca22ad 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -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); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index d9fc745132c..1e3166f22ea 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -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. diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 55ba18626e2..f5e9ebcbdfc 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -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 { diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index a441260fbb8..4d24599c1bb 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -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)