Commit: 25074be697cb5726328aa5d064a60788c1da6aeb
Author: Dalai Felinto
Date:   Fri Feb 9 09:04:00 2018 -0200
Branches: blender2.8
https://developer.blender.org/rB25074be697cb5726328aa5d064a60788c1da6aeb

Fix collection syncing when creating new collections from the outliner

We were not passing a scene collection parent to the BKE_collection_add
function, which in turn made syncing not work.

Right now we:
* Explicitly pass the master collection in this case
* Fallback to the master collection in other cases

With unittest.

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

M       source/blender/blenkernel/intern/collection.c
M       source/blender/blenkernel/intern/layer.c
M       source/blender/editors/space_outliner/outliner_collections.c
M       tests/python/view_layer/CMakeLists.txt
A       tests/python/view_layer/test_collection_new_sync.py

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

diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index 729be02bfc7..69168c4dd3d 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -111,6 +111,10 @@ static SceneCollection *collection_add(ID *owner_id, 
SceneCollection *sc_parent,
  */
 SceneCollection *BKE_collection_add(ID *owner_id, SceneCollection *sc_parent, 
const int type, const char *name_custom)
 {
+       if (sc_parent == NULL) {
+               sc_parent = BKE_collection_master(owner_id);
+       }
+
        SceneCollection *scene_collection = collection_add(owner_id, sc_parent, 
type, name_custom);
        BKE_layer_sync_new_scene_collection(owner_id, sc_parent, 
scene_collection);
        return scene_collection;
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index 9807c6e4f10..cb7b72bdabd 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -375,6 +375,7 @@ static void layer_collection_sync_flags(
 
 static void layer_collections_sync_flags(ListBase *layer_collections_dst, 
const ListBase *layer_collections_src)
 {
+       BLI_assert(BLI_listbase_count(layer_collections_dst) == 
BLI_listbase_count(layer_collections_src));
        LayerCollection *layer_collection_dst = (LayerCollection 
*)layer_collections_dst->first;
        const LayerCollection *layer_collection_src = (const LayerCollection 
*)layer_collections_src->first;
        while (layer_collection_dst != NULL) {
diff --git a/source/blender/editors/space_outliner/outliner_collections.c 
b/source/blender/editors/space_outliner/outliner_collections.c
index be4c8f62085..3d5f12a94fd 100644
--- a/source/blender/editors/space_outliner/outliner_collections.c
+++ b/source/blender/editors/space_outliner/outliner_collections.c
@@ -342,7 +342,8 @@ static int collection_new_exec(bContext *C, wmOperator 
*UNUSED(op))
        Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        ViewLayer *view_layer = CTX_data_view_layer(C);
-       SceneCollection *scene_collection = BKE_collection_add(&scene->id, 
NULL, COLLECTION_TYPE_NONE, NULL);
+       SceneCollection *scene_collection_parent = 
BKE_collection_master(&scene->id);
+       SceneCollection *scene_collection = BKE_collection_add(&scene->id, 
scene_collection_parent, COLLECTION_TYPE_NONE, NULL);
        BKE_collection_link(view_layer, scene_collection);
 
        DEG_relations_tag_update(bmain);
diff --git a/tests/python/view_layer/CMakeLists.txt 
b/tests/python/view_layer/CMakeLists.txt
index e308e2e0952..cc5a3ba54b1 100644
--- a/tests/python/view_layer/CMakeLists.txt
+++ b/tests/python/view_layer/CMakeLists.txt
@@ -62,6 +62,7 @@ endmacro()
 
 VIEW_LAYER_TEST(active_collection)
 VIEW_LAYER_TEST(background_set)
+VIEW_LAYER_TEST(collection_new_sync)
 VIEW_LAYER_TEST(collection_rename_a)
 VIEW_LAYER_TEST(collection_rename_b)
 VIEW_LAYER_TEST(evaluation_render_settings_a)
diff --git a/tests/python/view_layer/test_collection_new_sync.py 
b/tests/python/view_layer/test_collection_new_sync.py
new file mode 100644
index 00000000000..582e6c13d89
--- /dev/null
+++ b/tests/python/view_layer/test_collection_new_sync.py
@@ -0,0 +1,47 @@
+# ############################################################
+# Importing - Same For All Render Layer Tests
+# ############################################################
+
+import unittest
+import os
+import sys
+
+from view_layer_common import *
+
+
+# ############################################################
+# Testing
+# ############################################################
+
+class UnitTesting(ViewLayerTesting):
+    def test_view_layer_syncing(self):
+        """
+        See if we can copy view layers.
+        """
+        import bpy
+        scene = bpy.context.scene
+        view_layer = scene.view_layers.new("All")
+
+        self.assertEqual(len(view_layer.collections), 1)
+        self.assertEqual(view_layer.collections[0].collection, 
scene.master_collection)
+
+        self.assertEqual(
+                {collection.name for collection in 
view_layer.collections[0].collections},
+                {'Collection 1'})
+
+        self.assertEqual(
+                bpy.ops.outliner.collection_new(),
+                {'FINISHED'})
+
+        self.assertEqual(
+                {collection.name for collection in 
view_layer.collections[0].collections},
+                {'Collection 1', 'Collection 2'})
+
+
+# ############################################################
+# Main - Same For All Render Layer Tests
+# ############################################################
+
+if __name__ == '__main__':
+    UnitTesting._extra_arguments = setup_extra_arguments(__file__)
+    unittest.main()

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to