Fix T44543: painted texture lost after first save
Fix for T36639 caused all path changes to reload (which could loose user content). Change behavior: - Only reload data when a flag is explicitly passed (currently only used by Find Files operator) - Don't reload images which have been painted onto and not saved (dirty flag set).
This commit is contained in:
@@ -48,13 +48,21 @@ void *BKE_bpath_list_backup(struct Main *bmain, const int flag);
|
|||||||
void BKE_bpath_list_restore(struct Main *bmain, const int flag, void *ls_handle);
|
void BKE_bpath_list_restore(struct Main *bmain, const int flag, void *ls_handle);
|
||||||
void BKE_bpath_list_free(void *ls_handle);
|
void BKE_bpath_list_free(void *ls_handle);
|
||||||
|
|
||||||
#define BKE_BPATH_TRAVERSE_ABS (1 << 0) /* convert paths to absolute */
|
enum {
|
||||||
#define BKE_BPATH_TRAVERSE_SKIP_LIBRARY (1 << 2) /* skip library paths */
|
/* convert paths to absolute */
|
||||||
#define BKE_BPATH_TRAVERSE_SKIP_PACKED (1 << 3) /* skip packed data */
|
BKE_BPATH_TRAVERSE_ABS = (1 << 0),
|
||||||
#define BKE_BPATH_TRAVERSE_SKIP_MULTIFILE (1 << 4) /* skip paths where a single dir is used with an array of files, eg.
|
/* skip library paths */
|
||||||
* sequence strip images and pointcache. in this case only use the first
|
BKE_BPATH_TRAVERSE_SKIP_LIBRARY = (1 << 1),
|
||||||
* file, this is needed for directory manipulation functions which might
|
/* skip packed data */
|
||||||
* otherwise modify the same directory multiple times */
|
BKE_BPATH_TRAVERSE_SKIP_PACKED = (1 << 2),
|
||||||
|
/* skip paths where a single dir is used with an array of files, eg.
|
||||||
|
* sequence strip images and pointcache. in this case only use the first
|
||||||
|
* file, this is needed for directory manipulation functions which might
|
||||||
|
* otherwise modify the same directory multiple times */
|
||||||
|
BKE_BPATH_TRAVERSE_SKIP_MULTIFILE = (1 << 3),
|
||||||
|
/* reload data (when the path is edited) */
|
||||||
|
BKE_BPATH_TRAVERSE_RELOAD_EDITED = (1 << 4),
|
||||||
|
};
|
||||||
|
|
||||||
/* high level funcs */
|
/* high level funcs */
|
||||||
|
|
||||||
|
@@ -322,13 +322,14 @@ void BKE_bpath_missing_files_find(Main *bmain, const char *searchpath, ReportLis
|
|||||||
const bool find_all)
|
const bool find_all)
|
||||||
{
|
{
|
||||||
struct BPathFind_Data data = {NULL};
|
struct BPathFind_Data data = {NULL};
|
||||||
|
const int flag = BKE_BPATH_TRAVERSE_ABS | BKE_BPATH_TRAVERSE_RELOAD_EDITED;
|
||||||
|
|
||||||
data.basedir = bmain->name;
|
data.basedir = bmain->name;
|
||||||
data.reports = reports;
|
data.reports = reports;
|
||||||
data.searchdir = searchpath;
|
data.searchdir = searchpath;
|
||||||
data.find_all = find_all;
|
data.find_all = find_all;
|
||||||
|
|
||||||
BKE_bpath_traverse_main(bmain, missing_files_find__visit_cb, BKE_BPATH_TRAVERSE_ABS, (void *)&data);
|
BKE_bpath_traverse_main(bmain, missing_files_find__visit_cb, flag, (void *)&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run a visitor on a string, replacing the contents of the string as needed. */
|
/* Run a visitor on a string, replacing the contents of the string as needed. */
|
||||||
@@ -435,9 +436,14 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
|||||||
if (BKE_image_has_packedfile(ima) == false || (flag & BKE_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
if (BKE_image_has_packedfile(ima) == false || (flag & BKE_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
||||||
if (ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
|
if (ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
|
||||||
if (rewrite_path_fixed(ima->name, visit_cb, absbase, bpath_user_data)) {
|
if (rewrite_path_fixed(ima->name, visit_cb, absbase, bpath_user_data)) {
|
||||||
if (!BKE_image_has_packedfile(ima)) {
|
if (flag & BKE_BPATH_TRAVERSE_RELOAD_EDITED) {
|
||||||
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
|
if (!BKE_image_has_packedfile(ima) &&
|
||||||
BKE_image_walk_all_users(bmain, ima, bpath_traverse_image_user_cb);
|
/* image may have been painted onto (and not saved, T44543) */
|
||||||
|
!BKE_image_is_dirty(ima))
|
||||||
|
{
|
||||||
|
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
|
||||||
|
BKE_image_walk_all_users(bmain, ima, bpath_traverse_image_user_cb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user