[Bf-blender-cvs] [f91e0577861] blender2.8: Groups and collection: editing group collections

Dalai Felinto noreply at git.blender.org
Fri Dec 1 17:16:25 CET 2017


Commit: f91e05778612712050ed6f19ce9a2223c0404653
Author: Dalai Felinto
Date:   Thu Nov 30 18:38:07 2017 -0200
Branches: blender2.8
https://developer.blender.org/rBf91e05778612712050ed6f19ce9a2223c0404653

Groups and collection: editing group collections

Allow users to edit either the object group active collection or view layer one

We can't support users selecting the group collections from the outliner group
because that would be imply having an active group for the scene or workspace.

But the way it is now allows to see and edit the collection values after the
group is instanced.

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

M	release/scripts/startup/bl_ui/properties_collection.py
M	source/blender/editors/space_buttons/buttons_context.c
M	source/blender/editors/space_buttons/buttons_intern.h
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_group.c
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py
index dab9def37f4..cc6d606d27e 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -27,6 +27,16 @@ class CollectionButtonsPanel:
     bl_context = "collection"
 
 
+def get_collection_from_context(context):
+    active_object = context.active_object
+
+    if active_object and active_object.dupli_group and context.space_data.collection_context == 'GROUP':
+        group = active_object.dupli_group
+        return group.view_layer.collections.active
+    else:
+        return context.layer_collection
+
+
 class COLLECTION_PT_context_collection(CollectionButtonsPanel, Panel):
     bl_label = ""
     bl_options = {'HIDE_HEADER'}
@@ -34,8 +44,14 @@ class COLLECTION_PT_context_collection(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         space = context.space_data
+        active_object = context.active_object
+
+        if active_object and active_object.dupli_group:
+            split = layout.split(percentage=0.2)
+            split.row().prop(space, "collection_context", expand=True)
+            layout = split
 
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         name = collection.name
         if name == 'Master Collection':
             layout.label(text=name, icon='COLLAPSEMENU')
@@ -54,7 +70,7 @@ class COLLECTION_PT_clay_settings(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         scene_props = context.scene.collection_properties['BLENDER_CLAY']
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         collection_props = collection.engine_overrides['BLENDER_CLAY']
 
         col = layout.column()
@@ -81,7 +97,7 @@ class COLLECTION_PT_object_mode_settings(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         scene_props = context.scene.collection_properties['ObjectMode']
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         collection_props = collection.engine_overrides['ObjectMode']
 
         col = layout.column()
@@ -100,7 +116,7 @@ class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         scene_props = context.scene.collection_properties['EditMode']
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         collection_props = collection.engine_overrides['EditMode']
 
         col = layout.column()
@@ -124,7 +140,7 @@ class COLLECTION_PT_paint_weight_mode_settings(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         scene_props = context.scene.collection_properties['WeightPaintMode']
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         collection_props = collection.engine_overrides['WeightPaintMode']
 
         col = layout.column()
@@ -143,7 +159,7 @@ class COLLECTION_PT_paint_vertex_mode_settings(CollectionButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
         scene_props = context.scene.collection_properties['VertexPaintMode']
-        collection = context.layer_collection
+        collection = get_collection_from_context(context)
         collection_props = collection.engine_overrides['VertexPaintMode']
 
         col = layout.column()
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 183d715a93e..8866c6b6c40 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -39,6 +39,7 @@
 #include "BLT_translation.h"
 
 #include "DNA_armature_types.h"
+#include "DNA_group_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
@@ -177,7 +178,7 @@ static int buttons_context_path_workspace(ButsContextPath *path)
 	return RNA_struct_is_a(ptr->type, &RNA_WorkSpace);
 }
 
-static int buttons_context_path_collection(ButsContextPath *path)
+static int buttons_context_path_collection(ButsContextPath *path, eSpaceButtons_Collection_Context collection_context)
 {
 	PointerRNA *ptr = &path->ptr[path->len - 1];
 
@@ -187,10 +188,21 @@ static int buttons_context_path_collection(ButsContextPath *path)
 	}
 
 	ViewLayer *view_layer = ptr->data;
-	LayerCollection *sc = BKE_layer_collection_get_active(view_layer);
 
-	if (sc) {
-		RNA_pointer_create(NULL, &RNA_LayerCollection, sc, &path->ptr[path->len]);
+	if (collection_context == SB_COLLECTION_CTX_GROUP) {
+		Object *ob = OBACT(view_layer);
+		if (ob && ob->dup_group) {
+			view_layer = ob->dup_group->view_layer;
+
+			/* Replace the view layer by the group in the context path. */
+			RNA_pointer_create(NULL, &RNA_Group, ob->dup_group, &path->ptr[path->len - 1]);
+		}
+	}
+
+	LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer);
+
+	if (layer_collection) {
+		RNA_pointer_create(NULL, &RNA_LayerCollection, layer_collection, &path->ptr[path->len]);
 		path->len++;
 		return 1;
 	}
@@ -650,7 +662,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
 			found = buttons_context_path_workspace(path);
 			break;
 		case BCONTEXT_COLLECTION:
-			found = buttons_context_path_collection(path);
+			found = buttons_context_path_collection(path, sbuts->collection_context);
 			break;
 		case BCONTEXT_OBJECT:
 		case BCONTEXT_PHYSICS:
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index 7fc35a6b1e7..e6d19caad47 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -65,6 +65,7 @@ typedef struct ButsContextPath {
 	int len;
 	int flag;
 	int tex_ctx;
+	int collection_ctx;
 } ButsContextPath;
 
 typedef struct ButsTextureUser {
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 70d01007d89..08b5f337936 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -781,15 +781,24 @@ static eOLDrawState tree_element_active_collection(
 	/* don't allow selecting a scene collection, it can have multiple layer collection
 	 * instances (which one would the user want to be selected then?) */
 	else if (tselem->type == TSE_LAYER_COLLECTION) {
-		ViewLayer *view_layer = CTX_data_view_layer(C);
-		LayerCollection *lc = te->directdata;
-		const int collection_index = BKE_layer_collection_findindex(view_layer, lc);
+		LayerCollection *layer_collection = te->directdata;
+
+		switch (layer_collection->scene_collection->type) {
+			case COLLECTION_TYPE_NONE:
+			case COLLECTION_TYPE_GROUP_INTERNAL:
+			{
+				ViewLayer *view_layer = BKE_view_layer_find_from_collection(tselem->id, layer_collection);
+				const int collection_index = BKE_layer_collection_findindex(view_layer, layer_collection);
 
-		/* If the collection is part of a group we don't change active collection. */
-		if (collection_index > -1) {
-			view_layer->active_collection = collection_index;
-			WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
+				if (collection_index > -1) {
+					view_layer->active_collection = collection_index;
+				}
+				break;
+			}
+			default:
+				BLI_assert(!"Collection type not fully implemented");
 		}
+		WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
 	}
 
 	return OL_DRAWSEL_NONE;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index a1db47e54f2..0e0d40a38f1 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -126,7 +126,9 @@ typedef struct SpaceButs {
 	short preview;                  /* preview is signal to refresh */
 	/* texture context selector (material, lamp, particles, world, other) */
 	short texture_context, texture_context_prev;
-	char flag, pad[7];
+	char flag;
+	char collection_context;
+	char pad[6];
 	
 	void *path;                     /* runtime */
 	int pathflag, dataicon;         /* runtime */
@@ -208,6 +210,12 @@ typedef enum eSpaceButtons_Texture_Context {
 	SB_TEXC_LINESTYLE = 5,
 } eSpaceButtons_Texture_Context;
 
+/* sbuts->collection_context */
+typedef enum eSpaceButtons_Collection_Context {
+	SB_COLLECTION_CTX_VIEW_LAYER = 0,
+	SB_COLLECTION_CTX_GROUP = 1,
+} eSpaceButtons_Collection_Context;
+
 /* sbuts->align */
 typedef enum eSpaceButtons_Align {
 	BUT_FREE = 0,
diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c
index ec67370b14f..bf64bb1181f 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -132,10 +132,11 @@ void RNA_def_group(BlenderRNA *brna)
 	RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, "rna_Group_objects_get", NULL, NULL, NULL, NULL);
 	rna_def_group_objects(brna, prop);
 
-	prop = RNA_def_property(srna, "collections", PROP_COLLECTION, PROP_NONE);
-	RNA_def_property_collection_sdna(prop, NULL, "view_layer->layer_collections", NULL);
-	RNA_def_property_struct_type(prop, "LayerCollection");
-	RNA_def_property_ui_text(prop, "Layer Collections", "");
+	prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE);
+	RNA_def_property_struct_type(prop, "ViewLayer");
+	RNA_def_property_flag(prop, PROP_NEVER_NULL);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "View Layer", "Group internal view layer");
 }
 
 #endif
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 3a496d13429..aa3f159af40 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -225,6 +225,11 @@ static const EnumPr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list