[Bf-blender-cvs] [d514efb] soc-2016-layer_manager: Layer group support

Julian Eisel noreply at git.blender.org
Thu May 26 23:02:50 CEST 2016


Commit: d514efb2e8348d4efe7b5142f9d3ec7f8511f290
Author: Julian Eisel
Date:   Thu May 26 22:57:36 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBd514efb2e8348d4efe7b5142f9d3ec7f8511f290

Layer group support

Adding a new group inserts all selected layers/layer-groups in the new one. Things like "add to group" are not supported yet.
Groups have a folder icon, their members are drawn with indentation.

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

M	release/scripts/startup/bl_ui/space_layers.py
M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/editors/object/object_layer.c
M	source/blender/editors/space_layers/layers_draw.c
M	source/blender/editors/space_layers/layers_intern.h
M	source/blender/editors/space_layers/layers_ops.c

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

diff --git a/release/scripts/startup/bl_ui/space_layers.py b/release/scripts/startup/bl_ui/space_layers.py
index 9860f47..e46f9d5 100644
--- a/release/scripts/startup/bl_ui/space_layers.py
+++ b/release/scripts/startup/bl_ui/space_layers.py
@@ -29,6 +29,7 @@ class LAYERS_HT_header(Header):
 
         layout.template_header()
         layout.operator("layers.layer_add", text="", icon='NEW')
+        layout.operator("layers.group_add", text="", icon='NEWFOLDER')
 
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 1350b0e..cff3933 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -108,5 +108,7 @@ struct LayerTreeItem *BKE_layeritem_add(
         const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
 void BKE_layeritem_remove(struct LayerTree *tree, struct LayerTreeItem *litem);
 
+void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item);
+
 #endif  /* __BKE_LAYER_H__ */
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 706832b..eaa9372 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -122,4 +122,13 @@ void BKE_layeritem_remove(LayerTree *tree, LayerTreeItem *litem)
 	MEM_freeN(litem);
 }
 
+/**
+ * Assign \a item to \a group.
+ */
+void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item)
+{
+	BLI_assert(group->type == LAYER_ITEMTYPE_GROUP);
+	item->parent = group;
+}
+
 /** \} */ /* Layer Tree Item */
diff --git a/source/blender/editors/object/object_layer.c b/source/blender/editors/object/object_layer.c
index 2ba31b4..400a952 100644
--- a/source/blender/editors/object/object_layer.c
+++ b/source/blender/editors/object/object_layer.c
@@ -60,6 +60,6 @@ static void object_layer_draw_settings(LayerTreeItem *UNUSED(litem), uiLayout *U
 LayerTreeItem *ED_object_layer_add(LayerTree *ltree, const char *name)
 {
 	return BKE_layeritem_add(
-	            ltree, NULL, LAYER_TREETYPE_OBJECT, name ? name : OBJECTLAYER_DEFAULT_NAME,
+	            ltree, NULL, LAYER_ITEMTYPE_LAYER, name ? name : OBJECTLAYER_DEFAULT_NAME,
 	            NULL, object_layer_draw, object_layer_draw_settings);
 }
diff --git a/source/blender/editors/space_layers/layers_draw.c b/source/blender/editors/space_layers/layers_draw.c
index fb3afa1..0388fb7 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -43,6 +43,23 @@
 
 #include "layers_intern.h" /* own include */
 
+/* Using icon size makes items align nicely with icons */
+#define LAYERITEM_INDENT_SIZE UI_DPI_ICON_SIZE
+
+
+static int layer_tile_indent_level_get(const LayerTile *tile)
+{
+	LayerTreeItem *parent = tile->litem->parent;
+	int indent_level = 0;
+
+	while (parent) {
+		parent = parent->parent;
+		indent_level++;
+	}
+
+	return indent_level;
+}
+
 static void layer_tile_draw(
         LayerTile *tile, const bContext *C, ARegion *ar,
         uiBlock *block, uiStyle *style,
@@ -51,7 +68,8 @@ static void layer_tile_draw(
 	View2D *v2d = &ar->v2d;
 	LayerTreeItem *litem = tile->litem;
 	const float padx = 4.0f * UI_DPI_FAC;
-	rctf rect = {padx, ar->winx - padx, -v2d->cur.ymin - ofs_y - litem->height};
+	const float ofs_x = layer_tile_indent_level_get(tile) * LAYERITEM_INDENT_SIZE;
+	rctf rect = {padx + ofs_x, ar->winx - padx, -v2d->cur.ymin - ofs_y - litem->height};
 	rect.ymax = rect.ymin + litem->height;
 
 	/* draw selection */
@@ -64,7 +82,7 @@ static void layer_tile_draw(
 	if (litem->draw) {
 		uiLayout *layout = UI_block_layout(
 		                       block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER,
-		                       -v2d->cur.xmin, -v2d->cur.ymin - ofs_y, litem->height, 0, 0, style);
+		                       -v2d->cur.xmin + ofs_x, -v2d->cur.ymin - ofs_y, litem->height, 0, 0, style);
 		if (tile->flag & LAYERTILE_RENAME) {
 			uiBut *but = uiDefBut(
 			        block, UI_BTYPE_TEXT, 1, "", rect.xmin, rect.ymin,
@@ -107,3 +125,12 @@ void layers_tiles_draw(const bContext *C, ARegion *ar)
 	/* update size of tot-rect (extents of data/viewable area) */
 	UI_view2d_totRect_set(&ar->v2d, ar->winx - BLI_rcti_size_x(&ar->v2d.vert), size_y);
 }
+
+
+/* -------------------------------------------------------------------- */
+/* Layer draw callbacks */
+
+void layer_group_draw(LayerTreeItem *litem, uiLayout *layout)
+{
+	uiItemL(layout, litem->name, ICON_FILE_FOLDER);
+}
diff --git a/source/blender/editors/space_layers/layers_intern.h b/source/blender/editors/space_layers/layers_intern.h
index fe5ccb2..8cefa13 100644
--- a/source/blender/editors/space_layers/layers_intern.h
+++ b/source/blender/editors/space_layers/layers_intern.h
@@ -46,6 +46,7 @@ typedef struct LayerTile {
 
 /* layers_draw.c */
 void layers_tiles_draw(const struct bContext *C, struct ARegion *ar);
+void layer_group_draw(struct LayerTreeItem *litem, struct uiLayout *layout);
 
 /* layers_util.c */
 LayerTile *layers_tile_add(struct SpaceLayers *slayer, struct LayerTreeItem *litem);
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index f28c00c..0c15972 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -26,6 +26,7 @@
 #include "BKE_layer.h"
 
 #include "BLI_compiler_attrs.h"
+#include "BLI_listbase.h"
 
 #include "DNA_windowmanager_types.h"
 
@@ -40,6 +41,8 @@
 
 #include "layers_intern.h" /* own include */
 
+#define LAYERGROUP_DEFAULT_NAME "Untitled Group"
+
 
 static int layer_add_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
 {
@@ -75,6 +78,48 @@ static void LAYERS_OT_layer_add(wmOperatorType *ot)
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+static int layer_group_add_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
+{
+	Scene *scene = CTX_data_scene(C);
+	SpaceLayers *slayer = CTX_wm_space_layers(C);
+
+	LayerTreeItem *new_group = BKE_layeritem_add(
+		            scene->object_layers, NULL, LAYER_ITEMTYPE_GROUP, LAYERGROUP_DEFAULT_NAME,
+		            NULL, layer_group_draw, NULL);
+	LayerTile *new_tile = layers_tile_add(slayer, new_group);
+
+	LayerTile *last_in_group = NULL; /* the last item added to the group, the next one is placed after it */
+	/* Add selected items to group */
+	for (LayerTile *tile = slayer->layer_tiles.first, *next_tile; tile; tile = next_tile) {
+		next_tile = tile->next; /* we change listbase so store old pointer */
+		if (tile->flag & LAYERTILE_SELECTED) {
+			BKE_layeritem_group_assign(new_group, tile->litem);
+			BLI_remlink(&slayer->layer_tiles, tile);
+			BLI_insertlinkafter(&slayer->layer_tiles, last_in_group ? last_in_group : new_tile, tile);
+			last_in_group = tile;
+		}
+	}
+
+	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static void LAYERS_OT_group_add(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Add Layer Group";
+	ot->idname = "LAYERS_OT_group_add";
+	ot->description = "Add a new layer group to the layer list and place selected elements inside of it";
+
+	/* api callbacks */
+	ot->invoke = layer_group_add_invoke;
+	ot->poll = ED_operator_layers_active;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
 static int layer_rename_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 {
 	SpaceLayers *slayer = CTX_wm_space_layers(C);
@@ -249,6 +294,7 @@ void layers_operatortypes(void)
 {
 	/* organization */
 	WM_operatortype_append(LAYERS_OT_layer_add);
+	WM_operatortype_append(LAYERS_OT_group_add);
 	WM_operatortype_append(LAYERS_OT_layer_rename);
 
 	/* states (activating selecting, highlighting) */




More information about the Bf-blender-cvs mailing list