UI: Asset Shelf (Experimental Feature) #104831

Closed
Julian Eisel wants to merge 399 commits from asset-shelf into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
7 changed files with 34 additions and 43 deletions
Showing only changes of commit f23bee61d1 - Show all commits

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

@ -820,7 +820,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.
@ -829,13 +829,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));
@ -870,20 +869,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. */
@ -909,24 +905,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);
@ -1483,7 +1483,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

@ -1111,13 +1111,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

@ -618,7 +618,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));
@ -633,10 +633,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:
@ -685,7 +685,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;
@ -701,7 +701,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)