[Bf-blender-cvs] [3013cf0b376] blender-projects-basics: Add menu with operator to delete project configuration
Julian Eisel
noreply at git.blender.org
Thu Oct 6 19:33:18 CEST 2022
Commit: 3013cf0b376aceb4b14325a58becfe29455c76ba
Author: Julian Eisel
Date: Thu Oct 6 19:32:06 2022 +0200
Branches: blender-projects-basics
https://developer.blender.org/rB3013cf0b376aceb4b14325a58becfe29455c76ba
Add menu with operator to delete project configuration
Deletes the active project's .blender_project directory, but leaves all
actual project files (.blends and such) untouched.
===================================================================
M release/scripts/startup/bl_ui/space_project_settings.py
M source/blender/blenkernel/BKE_blender_project.h
M source/blender/blenkernel/BKE_blender_project.hh
M source/blender/blenkernel/intern/blender_project.cc
M source/blender/blenkernel/intern/blender_project_test.cc
M source/blender/windowmanager/intern/wm_files.c
M source/blender/windowmanager/intern/wm_operators.c
M source/blender/windowmanager/wm_files.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_project_settings.py b/release/scripts/startup/bl_ui/space_project_settings.py
index cfed8889580..899218acf87 100644
--- a/release/scripts/startup/bl_ui/space_project_settings.py
+++ b/release/scripts/startup/bl_ui/space_project_settings.py
@@ -80,6 +80,15 @@ class PROJECTSETTINGS_MT_view(Menu):
layout.menu("INFO_MT_area")
+class PROJECTSETTINGS_MT_advanced_operations(Menu):
+ bl_label = "Advanced Project Settings Operations"
+
+ def draw(self, _context):
+ layout = self.layout
+
+ layout.operator("wm.delete_project_setup")
+
+
class PROJECTSETTINGS_PT_save_project_settings(Panel):
bl_label = "Save Project Settings"
bl_space_type = 'PROJECT_SETTINGS'
@@ -99,6 +108,8 @@ class PROJECTSETTINGS_PT_save_project_settings(Panel):
layout = self.layout.row()
layout.operator_context = 'EXEC_AREA'
+ layout.menu("PROJECTSETTINGS_MT_advanced_operations", text="", icon='COLLAPSEMENU')
+
PROJECTSETTINGS_HT_header.draw_buttons(layout, context)
@@ -138,6 +149,7 @@ classes = (
PROJECTSETTINGS_HT_header,
PROJECTSETTINGS_MT_editor_menus,
PROJECTSETTINGS_MT_view,
+ PROJECTSETTINGS_MT_advanced_operations,
PROJECTSETTINGS_PT_navigation_bar,
PROJECTSETTINGS_PT_save_project_settings,
PROJECTSETTINGS_PT_no_project,
diff --git a/source/blender/blenkernel/BKE_blender_project.h b/source/blender/blenkernel/BKE_blender_project.h
index 6eb7cca19fb..0646e017d1f 100644
--- a/source/blender/blenkernel/BKE_blender_project.h
+++ b/source/blender/blenkernel/BKE_blender_project.h
@@ -19,6 +19,8 @@ typedef struct BlenderProject BlenderProject;
/** See #bke::ProjectSettings::create_settings_directory(). */
bool BKE_project_create_settings_directory(const char *project_root_path) ATTR_NONNULL();
+/** See #bke::ProjectSettings::delete_settings_directory(). */
+bool BKE_project_delete_settings_directory(const BlenderProject *project) ATTR_NONNULL();
BlenderProject *BKE_project_active_get(void) ATTR_WARN_UNUSED_RESULT;
/**
diff --git a/source/blender/blenkernel/BKE_blender_project.hh b/source/blender/blenkernel/BKE_blender_project.hh
index c4f836e0578..c77e2513b51 100644
--- a/source/blender/blenkernel/BKE_blender_project.hh
+++ b/source/blender/blenkernel/BKE_blender_project.hh
@@ -78,6 +78,12 @@ class ProjectSettings {
* failure.
*/
auto save_to_disk(StringRef project_path) -> bool;
+ /**
+ * Remove the .blender_project directory with all of its contents. Does not unload the active
+ * project but marks it as having unsaved changes. Runtime project data is still valid.
+ * \return True on success.
+ */
+ auto delete_settings_directory() -> bool;
explicit ProjectSettings(StringRef project_root_path);
diff --git a/source/blender/blenkernel/intern/blender_project.cc b/source/blender/blenkernel/intern/blender_project.cc
index 339ec71dd4c..7b5027bb487 100644
--- a/source/blender/blenkernel/intern/blender_project.cc
+++ b/source/blender/blenkernel/intern/blender_project.cc
@@ -254,6 +254,20 @@ bool ProjectSettings::save_to_disk(StringRef project_path)
return true;
}
+bool ProjectSettings::delete_settings_directory()
+{
+ BLI_assert(project_root_path_[0] == SEP);
+ std::string dot_blender_project_dir_path = project_root_path_ + SETTINGS_DIRNAME;
+
+ /* Returns 0 on success. */
+ if (BLI_delete(dot_blender_project_dir_path.c_str(), true, true)) {
+ return false;
+ }
+
+ has_unsaved_changes_ = true;
+ return true;
+}
+
StringRefNull ProjectSettings::project_root_path() const
{
return project_root_path_;
@@ -286,6 +300,14 @@ bool BKE_project_create_settings_directory(const char *project_root_path)
return bke::ProjectSettings::create_settings_directory(project_root_path);
}
+bool BKE_project_delete_settings_directory(const BlenderProject *project_handle)
+{
+ const bke::BlenderProject *project = reinterpret_cast<const bke::BlenderProject *>(
+ project_handle);
+ bke::ProjectSettings &settings = project->get_settings();
+ return settings.delete_settings_directory();
+}
+
BlenderProject *BKE_project_active_get(void)
{
return reinterpret_cast<BlenderProject *>(bke::BlenderProject::get_active());
diff --git a/source/blender/blenkernel/intern/blender_project_test.cc b/source/blender/blenkernel/intern/blender_project_test.cc
index f5bba2c0f06..48206e447d7 100644
--- a/source/blender/blenkernel/intern/blender_project_test.cc
+++ b/source/blender/blenkernel/intern/blender_project_test.cc
@@ -108,6 +108,11 @@ class ProjectTest : public testing::Test {
fn(temp_project_path.project_path_, temp_project_path.native_project_path_);
}
}
+
+ void TearDown() override
+ {
+ BKE_project_active_unset();
+ }
};
TEST_F(ProjectTest, settings_create)
@@ -279,4 +284,27 @@ TEST_F(BlendfileProjectLoadingTest, load_blend_file)
EXPECT_EQ(BKE_project_active_get(), nullptr);
}
+TEST_F(ProjectTest, project_load_and_delete)
+{
+ test_foreach_project_path([](StringRefNull project_path, StringRefNull project_path_native) {
+ ProjectSettings::create_settings_directory(project_path);
+
+ ::BlenderProject *project = BKE_project_active_load_from_path(project_path.c_str());
+ EXPECT_NE(project, nullptr);
+ EXPECT_FALSE(BKE_project_has_unsaved_changes(project));
+
+ std::string project_settings_dir = project_path_native + SEP_STR +
+ ProjectSettings::SETTINGS_DIRNAME;
+
+ EXPECT_TRUE(BLI_exists(project_settings_dir.c_str()));
+ if (!BKE_project_delete_settings_directory(project)) {
+ FAIL();
+ }
+ /* Runtime project should still exist, but with unsaved changes. */
+ EXPECT_NE(project, nullptr);
+ EXPECT_TRUE(BKE_project_has_unsaved_changes(project));
+ EXPECT_FALSE(BLI_exists(project_settings_dir.c_str()));
+ });
+}
+
} // namespace blender::bke::tests
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 07254a5a4a3..35b7a4d61e6 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -2316,7 +2316,7 @@ void WM_OT_read_factory_userpref(wmOperatorType *ot)
/** \name Write Project Settings Operator
* \{ */
-static bool wm_save_project_settings_poll(bContext *C)
+static bool wm_project_has_active_poll(bContext *C)
{
const BlenderProject *active_project = CTX_wm_project();
CTX_wm_operator_poll_msg_set(C, TIP_("No active project loaded"));
@@ -2342,7 +2342,7 @@ void WM_OT_save_project_settings(wmOperatorType *ot)
ot->description = "Make the current changes to the project settings permanent";
ot->invoke = WM_operator_confirm;
- ot->poll = wm_save_project_settings_poll;
+ ot->poll = wm_project_has_active_poll;
ot->exec = wm_save_project_settings_exec;
}
@@ -2424,6 +2424,43 @@ void WM_OT_new_project(wmOperatorType *ot)
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Delete project setup operator
+ * \{ */
+
+static int wm_delete_project_setup_exec(bContext *C, wmOperator *op)
+{
+ if (!BKE_project_delete_settings_directory(CTX_wm_project())) {
+ BKE_report(op->reports,
+ RPT_ERROR,
+ "Failed to delete project settings. Is the project directory read-only?");
+ return OPERATOR_CANCELLED;
+ }
+ BKE_project_active_unset();
+
+ WM_main_add_notifier(NC_PROJECT, NULL);
+ /* Update the window title. */
+ WM_event_add_notifier_ex(CTX_wm_manager(C), CTX_wm_window(C), NC_WM | ND_DATACHANGED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void WM_OT_delete_project_setup(wmOperatorType *ot)
+{
+ ot->name = "Delete Project Setup";
+ ot->idname = "WM_OT_delete_project_setup";
+ ot->description =
+ "Remove the configuration of the current project with all settings, but keep project files "
+ "(such as .blend files) untouched.";
+
+ ot->invoke = WM_operator_confirm;
+ ot->exec = wm_delete_project_setup_exec;
+ /* omit window poll so this can work in background mode */
+ ot->poll = wm_project_has_active_poll;
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Read File History Operator
* \{ */
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index f97030c7d2b..dab91f538cf 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3758,6 +3758,7 @@ void wm_operatortypes_register(void)
WM_operatortype_append(WM_OT_save_as_mainfile);
WM_operatortype_append(WM_OT_save_mainfile);
WM_operatortype_append(WM_OT_new_project);
+ WM_operatortype_append(WM_OT_delete_project_setup);
WM_operatortype_append(WM_OT_redraw_timer);
WM_operatortype_append(WM_OT_memory_statistics);
WM_operatortype_append(WM_OT_debug_menu);
diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h
index 3f01058688c..ffcd0ff8eab 100644
--- a/source/blender/windowmanager/wm_files.h
+++ b/source/blender/windowmanager/wm_files.h
@@ -93,6 +93,7 @@ void WM_OT_read_userpref(struct wmOperatorType *ot);
void WM_OT_read_factory_userpref(struct wmOperatorType *ot);
void WM_OT_save_project_settings(struct wmOperatorType *ot);
void WM_OT_new_project(struct wmOperatorType *ot);
+void WM_OT_delete_project_setup(struct wmOperatorType *ot);
void WM_OT_read_history(struct wmOperatorType *ot);
void WM_OT_read_homefile(struct wmOperatorType *ot);
void WM_OT_read_factory_settings(struct wmOperatorType *ot);
More information about the Bf-blender-cvs
mailing list