Fix T32209 quitting not saving latest data if you are in edit or sculpt mode on
authorAntony Riakiotakis <kalast@gmail.com>
Fri, 10 Oct 2014 09:48:48 +0000 (11:48 +0200)
committerAntony Riakiotakis <kalast@gmail.com>
Fri, 10 Oct 2014 10:04:44 +0000 (12:04 +0200)
quit.blend.

This will use a slower file write if an object is in edit or sculpt
mode.

Autosaving will explicitly not be supported to keep it fast.
Added a tooltip warning.

source/blender/editors/include/ED_util.h
source/blender/editors/util/ed_util.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/windowmanager/intern/wm_init_exit.c

index 6d9f1c4eda0326597930fbd34cee3b93644b7d55..e26e03473e036bdfa5cc3143bd05bbcd5d70b0aa 100644 (file)
@@ -46,7 +46,7 @@ struct Mesh;
 void    ED_editors_init(struct bContext *C);
 void    ED_editors_exit(struct bContext *C);
 
-void    ED_editors_flush_edits(const struct bContext *C, bool for_render);
+bool    ED_editors_flush_edits(const struct bContext *C, bool for_render);
 
 /* ************** Undo ************************ */
 
index 56b12fcdcda1f0c4f9da2d55e43053a5797b4f46..ec0471da8d30983564c9f3521e2d013e42bd6e87 100644 (file)
@@ -153,19 +153,20 @@ void ED_editors_exit(bContext *C)
 
 /* flush any temp data from object editing to DNA before writing files,
  * rendering, copying, etc. */
-void ED_editors_flush_edits(const bContext *C, bool for_render)
+bool ED_editors_flush_edits(const bContext *C, bool for_render)
 {
+       bool has_edited = false;
        Object *ob;
-       Object *obedit = CTX_data_edit_object(C);
        Main *bmain = CTX_data_main(C);
-       /* get editmode results */
-       if (obedit)
-               ED_object_editmode_load(obedit);
 
+       /* loop through all data to find edit mode or object mode, because during
+        * exiting we might not have a context for edit object and multiple sculpt
+        * objects can exist at the same time */
        for (ob = bmain->object.first; ob; ob = ob->id.next) {
-               if (ob && (ob->mode & OB_MODE_SCULPT)) {
+               if (ob->mode & OB_MODE_SCULPT) {
                        /* flush multires changes (for sculpt) */
                        multires_force_update(ob);
+                       has_edited = true;
 
                        if (for_render) {
                                /* flush changes from dynamic topology sculpt */
@@ -177,7 +178,14 @@ void ED_editors_flush_edits(const bContext *C, bool for_render)
                                BKE_sculptsession_bm_to_me(ob, false);
                        }
                }
+               else if (ob->mode & OB_MODE_EDIT) {
+                       /* get editmode results */
+                       has_edited = true;
+                       ED_object_editmode_load(ob);
+               }
        }
+
+       return has_edited;
 }
 
 /* ***** XXX: functions are using old blender names, cleanup later ***** */
index 7fdc9ba1e79b01a4edd686402f51f715ca491eab..b4968333d3fa6c11250e04795ee0b3142f01594c 100644 (file)
@@ -4388,7 +4388,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
        prop = RNA_def_property(srna, "use_auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE);
        RNA_def_property_ui_text(prop, "Auto Save Temporary Files",
-                                "Automatic saving of temporary files in temp directory, uses process ID");
+                                "Automatic saving of temporary files in temp directory, uses process ID (Sculpt or edit mode data won't be saved!')");
        RNA_def_property_update(prop, 0, "rna_userdef_autosave_update");
 
        prop = RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
index 20f5f8d3e3eea9cc08869e9e9a452b9a6748027b..00e25d395b3661df04440f11b2113678c3b2a4be 100644 (file)
@@ -54,6 +54,8 @@
 #include "BLI_threads.h"
 #include "BLI_utildefines.h"
 
+#include "BLO_writefile.h"
+
 #include "BKE_blender.h"
 #include "BKE_context.h"
 #include "BKE_screen.h"
@@ -409,11 +411,18 @@ void WM_exit_ext(bContext *C, const bool do_python)
                        if ((U.uiflag2 & USER_KEEP_SESSION) || BKE_undo_valid(NULL)) {
                                /* save the undo state as quit.blend */
                                char filename[FILE_MAX];
-                               
+                               bool has_edited;
+                               int fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN | G_FILE_HISTORY);
+
                                BLI_make_file_string("/", filename, BLI_temp_dir_base(), BLENDER_QUIT_FILE);
 
-                               if (BKE_undo_save_file(filename))
-                                       printf("Saved session recovery to '%s'\n", filename);
+                               has_edited = ED_editors_flush_edits(C, false);
+
+                               if ((has_edited && BLO_write_file(CTX_data_main(C), filename, fileflags, NULL, NULL)) ||
+                                       BKE_undo_save_file(filename))
+                               {
+                                               printf("Saved session recovery to '%s'\n", filename);
+                               }
                        }
                }