[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