[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