[Bf-blender-cvs] [68fdcf07a17] blender2.8: Fix T53415: Outliner: Crash when deleting collections

Dalai Felinto noreply at git.blender.org
Mon Dec 4 10:43:29 CET 2017


Commit: 68fdcf07a1795d1c0b4c121286e28a9f0a57f05e
Author: Dalai Felinto
Date:   Mon Dec 4 07:40:23 2017 -0200
Branches: blender2.8
https://developer.blender.org/rB68fdcf07a1795d1c0b4c121286e28a9f0a57f05e

Fix T53415: Outliner: Crash when deleting collections

Updated collection_delete_exec() so we don't try to delete elements as we search
the outliner tree anymore.

Now we search the whole tree first for the selected nodes that need to be
deleted and delete them afterward.

Reviewers: dfelinto

Tags: #bf_blender_2.8

Differential Revision: https://developer.blender.org/D2936
Differential Revision: https://developer.blender.org/D2940

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

M	source/blender/editors/space_outliner/outliner_collections.c

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

diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c
index a32a9c5f523..68bc732d0e6 100644
--- a/source/blender/editors/space_outliner/outliner_collections.c
+++ b/source/blender/editors/space_outliner/outliner_collections.c
@@ -334,9 +334,10 @@ void OUTLINER_OT_collection_override_new(wmOperatorType *ot)
 struct CollectionDeleteData {
 	Scene *scene;
 	SpaceOops *soops;
+	GSet *collections_to_delete;
 };
 
-static TreeTraversalAction collection_delete_cb(TreeElement *te, void *customdata)
+static TreeTraversalAction collection_find_data_to_delete(TreeElement *te, void *customdata)
 {
 	struct CollectionDeleteData *data = customdata;
 	SceneCollection *scene_collection = outliner_scene_collection_from_tree_element(te);
@@ -350,7 +351,7 @@ static TreeTraversalAction collection_delete_cb(TreeElement *te, void *customdat
 		 * when deleting multiple collections, so just do nothing */
 	}
 	else {
-		BKE_collection_remove(&data->scene->id, scene_collection);
+		BLI_gset_add(data->collections_to_delete, scene_collection);
 	}
 
 	return TRAVERSE_CONTINUE;
@@ -360,10 +361,24 @@ static int collection_delete_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	Scene *scene = CTX_data_scene(C);
 	SpaceOops *soops = CTX_wm_space_outliner(C);
-	struct CollectionDeleteData data = {.scene = scene, .soops = soops};
+	struct CollectionDeleteData data = {.scene = scene, .soops = soops };
+
+	data.collections_to_delete = BLI_gset_ptr_new(__func__);
 
 	TODO_LAYER_OVERRIDE; /* handle overrides */
-	outliner_tree_traverse(soops, &soops->tree, 0, TSE_SELECTED, collection_delete_cb, &data);
+
+	/* We first walk over and find the SceneCollections we actually want to delete (ignoring duplicates). */
+	outliner_tree_traverse(soops, &soops->tree, 0, TSE_SELECTED, collection_find_data_to_delete, &data);
+
+	/* Effectively delete the collections. */
+	GSetIterator collections_to_delete_iter;
+	GSET_ITER(collections_to_delete_iter, data.collections_to_delete) {
+
+		SceneCollection *sc = BLI_gsetIterator_getKey(&collections_to_delete_iter);
+		BKE_collection_remove(&data.scene->id, sc);
+	}
+
+	BLI_gset_free(data.collections_to_delete, NULL);
 
 	DEG_relations_tag_update(CTX_data_main(C));



More information about the Bf-blender-cvs mailing list