Fix #136254: Assets not available in search after saving file

We'd rather aggressively clear asset lists on file save since 9a9e2e19a9 (and
some related commits), seems like we can be a bit more precise here. Only
reload assets from the current file when saving the file, which is quite fast
to do and doesn't happen asynchronously (so UIs showing assets will only show
up once the assets are ready).

Actually we might not have to clear on file save at all, but needs more
testing.

Also fixes disappearing of asset previews on file save.

Pull Request: https://projects.blender.org/blender/blender/pulls/137117
This commit is contained in:
Julian Eisel
2025-04-10 11:31:46 +02:00
parent 79c6f2eacf
commit 4f965e4d38
5 changed files with 69 additions and 3 deletions

View File

@@ -95,6 +95,7 @@ class AssetList : NonCopyable {
void setup();
void fetch(const bContext &C);
void clear(wmWindowManager *wm);
void clear_current_file_assets(wmWindowManager *wm);
AssetHandle asset_get_by_index(int index) const;
@@ -225,6 +226,20 @@ void AssetList::clear(wmWindowManager *wm)
WM_main_add_notifier(NC_ASSET | ND_ASSET_LIST, nullptr);
}
void AssetList::clear_current_file_assets(wmWindowManager *wm)
{
/* Based on #ED_fileselect_clear_main_assets() */
FileList *files = filelist_;
filelist_readjob_stop(files, wm);
filelist_freelib(files);
filelist_tag_force_reset_mainfiles(files);
filelist_tag_reload_asset_library(files);
filelist_clear_from_reset_tag(files);
WM_main_add_notifier(NC_ASSET | ND_ASSET_LIST, nullptr);
}
AssetHandle AssetList::asset_get_by_index(int index) const
{
return {filelist_file(filelist_, index)};
@@ -456,7 +471,25 @@ void clear(const AssetLibraryReference *library_reference, wmWindowManager *wm)
/* Always clear the all library when clearing a nested one. */
if (library_reference->type != ASSET_LIBRARY_ALL) {
const AssetLibraryReference all_lib_ref = asset_system::all_library_reference();
clear(&all_lib_ref, wm);
AssetList *all_lib_list = lookup_list(all_lib_ref);
/* If the cleared nested library is the current file one, only clear current file assets. */
if (library_reference->type == ASSET_LIBRARY_LOCAL) {
if (all_lib_list) {
all_lib_list->clear_current_file_assets(wm);
}
foreach_visible_asset_browser_showing_library(
all_lib_ref, wm, [&](SpaceFile &sfile) { ED_fileselect_clear_main_assets(wm, &sfile); });
}
else {
if (all_lib_list) {
all_lib_list->clear(wm);
}
foreach_visible_asset_browser_showing_library(
all_lib_ref, wm, [&](SpaceFile &sfile) { ED_fileselect_clear(wm, &sfile); });
}
}
}

View File

@@ -141,6 +141,7 @@ void ED_fileselect_layout_tilepos(const FileLayout *layout, int tile, int *x, in
void ED_operatormacros_file();
void ED_fileselect_clear(wmWindowManager *wm, SpaceFile *sfile);
void ED_fileselect_clear_main_assets(wmWindowManager *wm, SpaceFile *sfile);
void ED_fileselect_exit(wmWindowManager *wm, SpaceFile *sfile);

View File

@@ -306,6 +306,9 @@ enum {
FL_NEED_SORTING = 1 << 4,
FL_NEED_FILTERING = 1 << 5,
FL_SORT_INVERT = 1 << 6,
/** Trigger a call to #AS_asset_library_load() to update asset catalogs (won't reload the actual
* assets) */
FL_RELOAD_ASSET_LIBRARY = 1 << 7,
};
/** #FileList.tags */
@@ -2108,6 +2111,11 @@ void filelist_tag_force_reset_mainfiles(FileList *filelist)
filelist->flags |= FL_FORCE_RESET_MAIN_FILES;
}
void filelist_tag_reload_asset_library(FileList *filelist)
{
filelist->flags |= FL_RELOAD_ASSET_LIBRARY;
}
bool filelist_is_ready(const FileList *filelist)
{
return (filelist->flags & FL_IS_READY) != 0;
@@ -3056,6 +3064,9 @@ struct FileListReadJob {
/** Set to request a partial read that only adds files representing #Main data (IDs). Used when
* #Main may have received changes of interest (e.g. asset removed or renamed). */
bool only_main_data;
/** Trigger a call to #AS_asset_library_load() to update asset catalogs (won't reload the actual
* assets) */
bool reload_asset_library;
/** Shallow copy of #filelist for thread-safe access.
*
@@ -3883,7 +3894,7 @@ static void filelist_readjob_load_asset_library_data(FileListReadJob *job_params
if (job_params->filelist->asset_library_ref == nullptr) {
return;
}
if (tmp_filelist->asset_library != nullptr) {
if (tmp_filelist->asset_library != nullptr && job_params->reload_asset_library == false) {
/* Asset library itself is already loaded. Load assets into this. */
job_params->load_asset_library = tmp_filelist->asset_library;
return;
@@ -4248,8 +4259,12 @@ void filelist_readjob_start(FileList *filelist, const int space_notifier, const
{
flrj->only_main_data = true;
}
if (filelist->flags & FL_RELOAD_ASSET_LIBRARY) {
flrj->reload_asset_library = true;
}
filelist->flags &= ~(FL_FORCE_RESET | FL_FORCE_RESET_MAIN_FILES | FL_IS_READY);
filelist->flags &= ~(FL_FORCE_RESET | FL_FORCE_RESET_MAIN_FILES | FL_RELOAD_ASSET_LIBRARY |
FL_IS_READY);
filelist->flags |= FL_IS_PENDING;
/* Init even for single threaded execution. Called functions use it. */

View File

@@ -179,6 +179,7 @@ bool filelist_file_cache_block(FileList *filelist, int index);
bool filelist_needs_force_reset(const FileList *filelist);
void filelist_tag_force_reset(FileList *filelist);
void filelist_tag_force_reset_mainfiles(FileList *filelist);
void filelist_tag_reload_asset_library(FileList *filelist);
bool filelist_pending(const FileList *filelist);
bool filelist_needs_reset_on_main_changes(const FileList *filelist);
bool filelist_is_ready(const FileList *filelist);

View File

@@ -1309,6 +1309,22 @@ void ED_fileselect_clear(wmWindowManager *wm, SpaceFile *sfile)
WM_main_add_notifier(NC_SPACE | ND_SPACE_FILE_LIST, nullptr);
}
void ED_fileselect_clear_main_assets(wmWindowManager *wm, SpaceFile *sfile)
{
/* Only null in rare cases, see: #29734. */
if (sfile->files) {
filelist_readjob_stop(sfile->files, wm);
filelist_freelib(sfile->files);
filelist_tag_force_reset_mainfiles(sfile->files);
filelist_tag_reload_asset_library(sfile->files);
filelist_clear_from_reset_tag(sfile->files);
}
FileSelectParams *params = ED_fileselect_get_active_params(sfile);
params->highlight_file = -1;
WM_main_add_notifier(NC_SPACE | ND_SPACE_FILE_LIST, nullptr);
}
void ED_fileselect_exit(wmWindowManager *wm, SpaceFile *sfile)
{
if (!sfile) {