[Bf-blender-cvs] [bc788929aa2] master: Scenes: forbid deleting last local scene

Jacques Lucke noreply at git.blender.org
Fri Jan 8 16:40:00 CET 2021


Commit: bc788929aa2bd259670a5562a1f403f25cad4625
Author: Jacques Lucke
Date:   Fri Jan 8 16:30:44 2021 +0100
Branches: master
https://developer.blender.org/rBbc788929aa2bd259670a5562a1f403f25cad4625

Scenes: forbid deleting last local scene

Previously, it was only forbidden to delete the last scene. This can
lead to the situation where a .blend file only contains linked scenes.
This is problematic, because linked data might not always be available
or can be removed from a .blend file without having an additional check
for remaining scenes.

Now there always has to be at least one local scene.

Reviewers: mont29

Differential Revision: https://developer.blender.org/D10049

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/scene/scene_edit.c
M	source/blender/makesrna/intern/rna_main_api.c

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

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 7ac980e9d94..a3d40e093d9 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -110,6 +110,8 @@ void BKE_toolsettings_free(struct ToolSettings *toolsettings);
 struct Scene *BKE_scene_duplicate(struct Main *bmain, struct Scene *sce, eSceneCopyMethod type);
 void BKE_scene_groups_relink(struct Scene *sce);
 
+bool BKE_scene_can_be_removed(const struct Main *bmain, const struct Scene *scene);
+
 bool BKE_scene_has_view_layer(const struct Scene *scene, const struct ViewLayer *layer);
 struct Scene *BKE_scene_find_from_collection(const struct Main *bmain,
                                              const struct Collection *collection);
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index adc50c2247b..11cdf67cb82 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2032,6 +2032,21 @@ void BKE_scene_groups_relink(Scene *sce)
   }
 }
 
+bool BKE_scene_can_be_removed(const Main *bmain, const Scene *scene)
+{
+  /* Linked scenes can always be removed. */
+  if (ID_IS_LINKED(scene)) {
+    return true;
+  }
+  /* Local scenes can only be removed, when there is at least one local scene left. */
+  LISTBASE_FOREACH (Scene *, other_scene, &bmain->scenes) {
+    if (other_scene != scene && !ID_IS_LINKED(other_scene)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 Scene *BKE_scene_add(Main *bmain, const char *name)
 {
   Scene *sce;
diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c
index 47edb322701..2b2a0d10e29 100644
--- a/source/blender/editors/scene/scene_edit.c
+++ b/source/blender/editors/scene/scene_edit.c
@@ -240,8 +240,9 @@ static void SCENE_OT_new(wmOperatorType *ot)
 
 static bool scene_delete_poll(bContext *C)
 {
+  Main *bmain = CTX_data_main(C);
   Scene *scene = CTX_data_scene(C);
-  return (scene->id.prev || scene->id.next);
+  return BKE_scene_can_be_removed(bmain, scene);
 }
 
 static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 5170d598ab5..d24be91f731 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -194,9 +194,9 @@ static void rna_Main_scenes_remove(
 {
   /* don't call BKE_id_free(...) directly */
   Scene *scene = scene_ptr->data;
-  Scene *scene_new;
 
-  if ((scene_new = scene->id.prev) || (scene_new = scene->id.next)) {
+  if (BKE_scene_can_be_removed(bmain, scene)) {
+    Scene *scene_new = scene->id.prev ? scene->id.prev : scene->id.next;
     if (do_unlink) {
       wmWindow *win = CTX_wm_window(C);
 
@@ -216,8 +216,10 @@ static void rna_Main_scenes_remove(
     rna_Main_ID_remove(bmain, reports, scene_ptr, do_unlink, true, true);
   }
   else {
-    BKE_reportf(
-        reports, RPT_ERROR, "Scene '%s' is the last, cannot be removed", scene->id.name + 2);
+    BKE_reportf(reports,
+                RPT_ERROR,
+                "Scene '%s' is the last local one, cannot be removed",
+                scene->id.name + 2);
   }
 }



More information about the Bf-blender-cvs mailing list