diff --git a/source/blender/editors/asset/ED_asset_list.hh b/source/blender/editors/asset/ED_asset_list.hh index 7e487db8f37..7b5cef88192 100644 --- a/source/blender/editors/asset/ED_asset_list.hh +++ b/source/blender/editors/asset/ED_asset_list.hh @@ -60,7 +60,18 @@ void iterate(const AssetLibraryReference &library_reference, AssetListIterFn fn) void storage_fetch(const AssetLibraryReference *library_reference, const bContext *C); bool is_loaded(const AssetLibraryReference *library_reference); void ensure_previews_job(const AssetLibraryReference *library_reference, const bContext *C); +/** + * Clears this asset library and the "All" asset library for reload in both the static asset list + * storage, as well as for all open asset browsers. Call this whenever the content of the given + * asset library changed in a way that a reload is necessary. + */ void clear(const AssetLibraryReference *library_reference, const bContext *C); +/** + * Clears the all asset library for reload in both the static asset list storage, as well as for + * all open asset browsers. Call this whenever any asset library content changed in a way that a + * reload is necessary. + */ +void clear_all_library(const bContext *C); bool storage_has_list_for_library(const AssetLibraryReference *library_reference); /** * Tag all asset lists in the storage that show main data as needing an update (re-fetch). diff --git a/source/blender/editors/asset/intern/asset_list.cc b/source/blender/editors/asset/intern/asset_list.cc index 5209e612d77..7267c274e5a 100644 --- a/source/blender/editors/asset/intern/asset_list.cc +++ b/source/blender/editors/asset/intern/asset_list.cc @@ -34,6 +34,7 @@ #include "ED_asset_indexer.hh" #include "ED_asset_list.hh" +#include "ED_fileselect.hh" #include "ED_screen.hh" #include "asset_library_reference.hh" @@ -458,6 +459,35 @@ void clear(const AssetLibraryReference *library_reference, const bContext *C) if (list) { list->clear(C); } + + wmWindowManager *wm = CTX_wm_manager(C); + LISTBASE_FOREACH (const wmWindow *, win, &wm->windows) { + const bScreen *screen = WM_window_get_active_screen(win); + LISTBASE_FOREACH (const ScrArea *, area, &screen->areabase) { + /* Only needs to cover visible file/asset browsers, since others are already cleared through + * area exiting. */ + if (area->spacetype == SPACE_FILE) { + SpaceFile *sfile = reinterpret_cast(area->spacedata.first); + if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS) { + if (sfile->asset_params && sfile->asset_params->asset_library_ref == *library_reference) + { + ED_fileselect_clear(wm, sfile); + } + } + } + } + } + + /* Always clear the all library when clearing a nested one. */ + if (library_reference->type != ASSET_LIBRARY_ALL) { + clear_all_library(C); + } +} + +void clear_all_library(const bContext *C) +{ + const AssetLibraryReference all_lib_ref = asset_system::all_library_reference(); + clear(&all_lib_ref, C); } bool storage_has_list_for_library(const AssetLibraryReference *library_reference) diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt index e5150ee279e..d7e6fa57ec6 100644 --- a/source/blender/editors/space_userpref/CMakeLists.txt +++ b/source/blender/editors/space_userpref/CMakeLists.txt @@ -4,6 +4,7 @@ set(INC ../include + ../../asset_system ../../blenkernel ../../blenloader ../../blentranslation diff --git a/source/blender/editors/space_userpref/userpref_ops.cc b/source/blender/editors/space_userpref/userpref_ops.cc index 3b385de511d..d9b9236b7c5 100644 --- a/source/blender/editors/space_userpref/userpref_ops.cc +++ b/source/blender/editors/space_userpref/userpref_ops.cc @@ -41,6 +41,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "ED_asset.hh" #include "ED_userpref.hh" #include "MEM_guardedalloc.h" @@ -136,7 +137,7 @@ static void PREFERENCES_OT_autoexec_path_remove(wmOperatorType *ot) /** \name Add Asset Library Operator * \{ */ -static int preferences_asset_library_add_exec(bContext * /*C*/, wmOperator *op) +static int preferences_asset_library_add_exec(bContext *C, wmOperator *op) { char *path = RNA_string_get_alloc(op->ptr, "directory", nullptr, 0, nullptr); char dirname[FILE_MAXFILE]; @@ -152,6 +153,7 @@ static int preferences_asset_library_add_exec(bContext * /*C*/, wmOperator *op) /* There's no dedicated notifier for the Preferences. */ WM_main_add_notifier(NC_WINDOW, nullptr); + blender::ed::asset::list::clear_all_library(C); MEM_freeN(path); return OPERATOR_FINISHED; diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index aa468079815..5fa666b6e2b 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -227,6 +227,8 @@ static const EnumPropertyItem rna_enum_preferences_extension_repo_source_type_it # include "MEM_CacheLimiterC-Api.h" # include "MEM_guardedalloc.h" +# include "ED_asset_list.hh" + # include "UI_interface.hh" static void rna_userdef_version_get(PointerRNA *ptr, int *value) @@ -582,11 +584,15 @@ static void rna_userdef_script_directory_remove(ReportList *reports, PointerRNA USERDEF_TAG_DIRTY; } -static bUserAssetLibrary *rna_userdef_asset_library_new(const char *name, const char *directory) +static bUserAssetLibrary *rna_userdef_asset_library_new(const bContext *C, + const char *name, + const char *directory) { bUserAssetLibrary *new_library = BKE_preferences_asset_library_add( &U, name ? name : "", directory ? directory : ""); + blender::ed::asset::list::clear_all_library(C); + /* Trigger refresh for the Asset Browser. */ WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); @@ -7118,7 +7124,7 @@ static void rna_def_userdef_asset_library_collection(BlenderRNA *brna, PropertyR RNA_def_struct_ui_text(srna, "User Asset Libraries", "Collection of user asset libraries"); func = RNA_def_function(srna, "new", "rna_userdef_asset_library_new"); - RNA_def_function_flag(func, FUNC_NO_SELF); + RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a new Asset Library"); RNA_def_string(func, "name", nullptr, sizeof(bUserAssetLibrary::name), "Name", ""); RNA_def_string(func, "directory", nullptr, sizeof(bUserAssetLibrary::dirpath), "Directory", "");