[Bf-blender-cvs] [907a7aba1ec] blender-projects-basics: Confirmation prompt for closing file with unsaved project settings

Julian Eisel noreply at git.blender.org
Tue Oct 18 16:46:50 CEST 2022


Commit: 907a7aba1ec6b74ebe0739e097d07a5373453f55
Author: Julian Eisel
Date:   Tue Oct 18 16:44:43 2022 +0200
Branches: blender-projects-basics
https://developer.blender.org/rB907a7aba1ec6b74ebe0739e097d07a5373453f55

Confirmation prompt for closing file with unsaved project settings

The regular confirmation prompt is shown then with a "Save modified
project settings" checkbox.

===================================================================

M	source/blender/blenkernel/BKE_blender_project.h
M	source/blender/blenkernel/intern/blender_project.cc
M	source/blender/makesrna/intern/rna_blender_project.c
M	source/blender/windowmanager/intern/wm_files.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_blender_project.h b/source/blender/blenkernel/BKE_blender_project.h
index 647730d66b5..4851e249884 100644
--- a/source/blender/blenkernel/BKE_blender_project.h
+++ b/source/blender/blenkernel/BKE_blender_project.h
@@ -62,8 +62,13 @@ const char *BKE_project_name_get(const BlenderProject *project) ATTR_WARN_UNUSED
 ListBase *BKE_project_custom_asset_libraries_get(const BlenderProject *project)
     ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 void BKE_project_tag_has_unsaved_changes(const BlenderProject *project) ATTR_NONNULL();
-bool BKE_project_has_unsaved_changes(const BlenderProject *project) ATTR_WARN_UNUSED_RESULT
-    ATTR_NONNULL();
+/**
+ * Check if the project is marked as having unsaved changes. For convenience this allows passing
+ * null as the project (returns false then), so a call like
+ * `BKE_project_has_unsaved_changes(CTX_wm_project())` can be done without having to null-check the
+ * project first.
+ */
+bool BKE_project_has_unsaved_changes(const BlenderProject *project) ATTR_WARN_UNUSED_RESULT;
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/blender_project.cc b/source/blender/blenkernel/intern/blender_project.cc
index c21793a7327..b54b8f47e32 100644
--- a/source/blender/blenkernel/intern/blender_project.cc
+++ b/source/blender/blenkernel/intern/blender_project.cc
@@ -298,6 +298,10 @@ void BKE_project_tag_has_unsaved_changes(const BlenderProject *project_handle)
 
 bool BKE_project_has_unsaved_changes(const BlenderProject *project_handle)
 {
+  if (!project_handle) {
+    return false;
+  }
+
   const bke::BlenderProject *project = reinterpret_cast<const bke::BlenderProject *>(
       project_handle);
   const bke::ProjectSettings &settings = project->get_settings();
diff --git a/source/blender/makesrna/intern/rna_blender_project.c b/source/blender/makesrna/intern/rna_blender_project.c
index 58968f60fc6..b8fc7f58bc7 100644
--- a/source/blender/makesrna/intern/rna_blender_project.c
+++ b/source/blender/makesrna/intern/rna_blender_project.c
@@ -104,10 +104,6 @@ static void rna_BlenderProject_asset_libraries_begin(CollectionPropertyIterator
 static bool rna_BlenderProject_is_dirty_get(PointerRNA *ptr)
 {
   const BlenderProject *project = ptr->data;
-  if (!project) {
-    return false;
-  }
-
   return BKE_project_has_unsaved_changes(project);
 }
 
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index a60ca2d77cb..1d55e4369f8 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -160,7 +160,8 @@ void WM_file_tag_modified(void)
 bool wm_file_or_session_data_has_unsaved_changes(const Main *bmain, const wmWindowManager *wm)
 {
   return !wm->file_saved || ED_image_should_save_modified(bmain) ||
-         BKE_asset_library_has_any_unsaved_catalogs();
+         BKE_asset_library_has_any_unsaved_catalogs() ||
+         BKE_project_has_unsaved_changes(CTX_wm_project());
 }
 
 /** \} */
@@ -3576,6 +3577,7 @@ void wm_test_autorun_warning(bContext *C)
  * \{ */
 
 static char save_images_when_file_is_closed = true;
+static char save_project_settings_when_file_is_closed = true;
 
 static void wm_block_file_close_cancel(bContext *C, void *arg_block, void *UNUSED(arg_data))
 {
@@ -3618,6 +3620,12 @@ static void wm_block_file_close_save(bContext *C, void *arg_block, void *arg_dat
     }
   }
 
+  BlenderProject *project = CTX_wm_project();
+  if (project && BKE_project_has_unsaved_changes(project) &&
+      save_project_settings_when_file_is_closed) {
+    BKE_project_settings_save(project);
+  }
+
   bool file_has_been_saved_before = BKE_main_blendfile_path(bmain)[0] != '\0';
 
   if (file_has_been_saved_before) {
@@ -3757,6 +3765,30 @@ static uiBlock *block_create__close_file_dialog(struct bContext *C,
     has_extra_checkboxes = true;
   }
 
+  if (BKE_project_has_unsaved_changes(CTX_wm_project())) {
+    /* Only the first checkbox should get extra separation. */
+    if (!has_extra_checkboxes) {
+      uiItemS(layout);
+    }
+
+    uiDefButBitC(block,
+                 UI_BTYPE_CHECKBOX,
+                 1,
+                 0,
+                 "Save modified project settings",
+                 0,
+                 0,
+                 0,
+                 UI_UNIT_Y,
+                 &save_project_settings_when_file_is_closed,
+                 0,
+                 0,
+                 0,
+                 0,
+                 "");
+    has_extra_checkboxes = true;
+  }
+
   if (BKE_asset_library_has_any_unsaved_catalogs()) {
     static char save_catalogs_when_file_is_closed;



More information about the Bf-blender-cvs mailing list