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; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs