UX: Readfile: Libraries error messages: avoid wall of warnings.

When a lot of libraries or linked IDs were missing/not found when
loading a .blend file, Blender used to show one warning report for each
missing item, potentially covering the user's screen with a giant
unuable popup.

Now it will instead generate a single warning with amount of missing lib
files and linked IDs. Each missing item is still reported individually,
but only as `INFO`, so it will still show up in the console or Info editor.
This commit is contained in:
Bastien Montagne 2021-02-26 11:59:14 +01:00
parent 72ceab8ab2
commit 53d13b6f53
Notes: blender-bot 2023-02-14 01:57:12 +01:00
Referenced by commit aad2f1510a, Fix T86028: Crash when loading file with missing libraries.
Referenced by issue #86028, Crash trying to load file with a missing library on line fd->library_file_missing_count++;
2 changed files with 20 additions and 2 deletions

View File

@ -5273,12 +5273,13 @@ static void read_library_linked_id(
}
else {
BLO_reportf_wrap(reports,
RPT_WARNING,
RPT_INFO,
TIP_("LIB: %s: '%s' missing from '%s', parent '%s'"),
BKE_idtype_idcode_to_name(GS(id->name)),
id->name + 2,
mainvar->curlib->filepath_abs,
library_parent_filepath(mainvar->curlib));
fd->library_id_missing_count++;
/* Generate a placeholder for this ID (simplified version of read_libblock actually...). */
if (r_id) {
@ -5432,7 +5433,8 @@ static FileData *read_library_file_data(FileData *basefd,
if (fd == NULL) {
BLO_reportf_wrap(
basefd->reports, RPT_WARNING, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs);
basefd->reports, RPT_INFO, TIP_("Cannot find lib '%s'"), mainptr->curlib->filepath_abs);
fd->library_file_missing_count++;
}
return fd;
@ -5481,6 +5483,9 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
/* Test if linked data-locks need to read further linked data-locks
* and create link placeholders for them. */
BLO_expand_main(fd, mainptr);
basefd->library_file_missing_count += fd->library_file_missing_count;
basefd->library_id_missing_count += fd->library_id_missing_count;
}
}
}
@ -5526,6 +5531,15 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
mainptr->curlib->filedata = NULL;
}
BKE_main_free(main_newid);
if (basefd->library_file_missing_count != 0 || basefd->library_id_missing_count != 0) {
BKE_reportf(basefd->reports,
RPT_WARNING,
"LIB: %d libraries and %d linked data-blocks are missing, please check the "
"Info and Outliner editors for details",
basefd->library_file_missing_count,
basefd->library_id_missing_count);
}
}
void *BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address)

View File

@ -138,6 +138,10 @@ typedef struct FileData {
struct IDNameLib_Map *old_idmap;
struct ReportList *reports;
/* Counters for amount of missing libraries, and missing IDs in libraries.
* Used to generate a synthetic report in the UI. */
int library_file_missing_count;
int library_id_missing_count;
} FileData;
#define SIZEOFBLENDERHEADER 12