[Bf-blender-cvs] [f5dde1d] soc-2016-layer_manager: Add layer visibility toggle

Julian Eisel noreply at git.blender.org
Tue Jul 12 23:22:17 CEST 2016


Commit: f5dde1d4a1f8b8afed97a9e09f583b3424e36955
Author: Julian Eisel
Date:   Tue Jul 12 23:14:22 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBf5dde1d4a1f8b8afed97a9e09f583b3424e36955

Add layer visibility toggle

Currently only affects drawing, need to check all object iterations if they need a visibility check individually.

Alignment need to be improved, didn't find a quick solution though. Would need to be solved differently when moving to outliner anyway.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/editors/scene/CMakeLists.txt
M	source/blender/editors/scene/layer_types.c
M	source/blender/editors/space_layers/layers_draw.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_scene_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 1a5f137..4198d5f 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -121,5 +121,7 @@ bool BKE_layeritem_iterate_childs(
         LayerTreeItem *litem, LayerTreeIterFunc foreach, void *customdata,
         const bool inverse);
 
+bool BKE_layeritem_is_visible(LayerTreeItem *litem);
+
 #endif  /* __BKE_LAYER_H__ */
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 97164fb..930ed5c 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -410,4 +410,20 @@ bool BKE_layeritem_iterate_childs(
 	return layertree_iterate_list(&litem->childs, foreach, customdata, inverse);
 }
 
+/**
+ * Check if \a litem and all of its parents are visible.
+ */
+bool BKE_layeritem_is_visible(LayerTreeItem *litem)
+{
+	if (litem->is_hidden)
+		return false;
+
+	for (LayerTreeItem *parent = litem->parent; parent; parent = parent->parent) {
+		if (parent->is_hidden)
+			return false;
+	}
+
+	return true;
+}
+
 /** \} */ /* Layer Tree Item */
diff --git a/source/blender/editors/scene/CMakeLists.txt b/source/blender/editors/scene/CMakeLists.txt
index a324c27..354b154 100644
--- a/source/blender/editors/scene/CMakeLists.txt
+++ b/source/blender/editors/scene/CMakeLists.txt
@@ -25,6 +25,7 @@ set(INC
 	../../blentranslation
 	../../makesdna
 	../../makesrna
+	../../windowmanager
 	../../../../intern/guardedalloc
 )
 
diff --git a/source/blender/editors/scene/layer_types.c b/source/blender/editors/scene/layer_types.c
index ae50410..9b7b494 100644
--- a/source/blender/editors/scene/layer_types.c
+++ b/source/blender/editors/scene/layer_types.c
@@ -45,6 +45,23 @@
 #include "UI_interface_icons.h"
 #include "UI_resources.h"
 
+#include "WM_api.h"
+#include "WM_types.h"
+
+
+static void layer_visibility_update_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
+{
+	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, NULL);
+}
+
+static void layer_visibility_but_draw(uiBlock *block, uiLayout *layout, LayerTreeItem *litem)
+{
+	BLI_assert(uiLayoutGetBlock(layout) == block);
+
+	uiBut *but = uiDefIconButBitC(block, UI_BTYPE_ICON_TOGGLE_N, 1, 0, ICON_VISIBLE_IPO_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+	                 &litem->is_hidden, 0.0f, 0.0f, 0.0f, 0.0f, "Layer Visibility");
+	UI_but_func_set(but, layer_visibility_update_cb, NULL, NULL);
+}
 
 static void object_layer_draw(const bContext *C, LayerTreeItem *litem, uiLayout *layout)
 {
@@ -57,13 +74,20 @@ static void object_layer_draw(const bContext *C, LayerTreeItem *litem, uiLayout
 	const int col_icon = UI_colorset_icon_get(RNA_enum_get(litem->ptr, "color_set"));
 	uiItemL(layout, litem->name, col_icon);
 
+	uiLayoutSetAlignment(layout, UI_LAYOUT_ALIGN_RIGHT);
+
 	if (draw_settingbut) {
-		UI_block_emboss_set(block, UI_EMBOSS_NONE);
 		uiDefIconButBitI(block, UI_BTYPE_TOGGLE, LAYERTILE_EXPANDED, 0,
 		                 ICON_SCRIPTWIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, (int *)&tile->flag,
 		                 0.0f, 0.0f, 0.0f, 0.0f, TIP_("Toggle layer settings"));
-		UI_block_emboss_set(block, UI_EMBOSS);
 	}
+	else {
+		/* dummy button for alignment */
+		uiDefIconBut(block, UI_BTYPE_LABEL, 0, ICON_NONE, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+		             NULL, 0.0f, 0.0f, 0.0f, 0.0f, "");
+	}
+
+	layer_visibility_but_draw(block, layout, litem);
 }
 
 static void object_layer_draw_settings(const bContext *UNUSED(C), LayerTreeItem *litem, uiLayout *layout)
@@ -93,16 +117,17 @@ static void layer_group_draw(const bContext *C, LayerTreeItem *litem, uiLayout *
 	uiBlock *block = uiLayoutGetBlock(layout);
 	uiBut *but;
 
-	UI_block_emboss_set(block, UI_EMBOSS_NONE);
 	but = uiDefIconButBitI(block, UI_BTYPE_ICON_TOGGLE_N, LAYERTILE_CLOSED, 0,
 	                 ICON_TRIA_RIGHT, 0, 0, UI_UNIT_X, UI_UNIT_Y, &tile->flag,
 	                 0.0f, 0.0f, 0.0f, 0.0f, TIP_("Toggle display of layer children"));
-	UI_block_emboss_set(block, UI_EMBOSS);
 	UI_but_drawflag_enable(but, UI_BUT_ICON_LEFT); /* doesn't align nicely without this */
 
 	but = uiDefBut(block, UI_BTYPE_LABEL, 0, litem->name, 0, 0, UI_UNIT_X * 10, UI_UNIT_Y,
 	               NULL, 0.0f, 0.0f, 0.0f, 0.0f, "");
 	UI_but_drawflag_enable(but, UI_BUT_TEXT_NO_MARGIN);
+
+	uiLayoutSetAlignment(layout, UI_LAYOUT_ALIGN_RIGHT);
+	layer_visibility_but_draw(block, layout, litem);
 }
 
 static void LAYERTYPE_group(LayerType *lt)
diff --git a/source/blender/editors/space_layers/layers_draw.c b/source/blender/editors/space_layers/layers_draw.c
index 137aeb0..1cab0b0 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -104,10 +104,17 @@ static float layer_tile_draw(
 	}
 	else {
 		uiLayout *layout = UI_block_layout(
-		        block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER,
-		        rect.xmin, rect.ymax, BLI_rctf_size_y(&rect), 0, 0, style);
-		litem->type->draw(C, litem, layout);
-		uiItemL(layout, "", 0); /* XXX without this editing last item causes crashes */
+		        block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
+		        rect.xmin, rect.ymax, 0, 0, 0, style);
+		uiLayout *row = uiLayoutRow(layout, false);
+
+		/* un-embossed by default */
+		UI_block_emboss_set(block, UI_EMBOSS_NONE);
+
+		litem->type->draw(C, litem, row);
+
+		UI_block_emboss_set(block, UI_EMBOSS);
+		uiItemL(row, "", 0); /* XXX without this editing last item causes crashes */
 		UI_block_layout_resolve(block, NULL, NULL);
 	}
 	tile_size_y = header_y;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 27991f6..3e217a0 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2829,11 +2829,18 @@ static void view3d_objectlayers_drawstep_draw(
         unsigned int *r_lay_used)
 {
 #ifdef WITH_ADVANCED_LAYERS
-	BKE_BASES_ITER_START(scene)
+	BKE_LAYERTREE_ITER_START(scene->object_layers, 0, i, litem)
 	{
-		view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
+		if (BKE_layeritem_is_visible(litem) && litem->type->type == LAYER_ITEMTYPE_LAYER) {
+			LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+			BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base)
+			{
+				view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
+			}
+			BKE_OBJECTLAYER_BASES_ITER_END;
+		}
 	}
-	BKE_BASES_ITER_END;
+	BKE_LAYERTREE_ITER_END;
 
 #else
 	BKE_BASES_ITER_START(scene)
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 0e708a8..49408f7 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -110,9 +110,14 @@ typedef struct LayerTreeItem {
 	struct LayerType *type;
 	char idname[64]; /* LayerType.idname, for finding type on file read */
 
-	int pad, index; /* index of the item - stored to avoid loockups */
+	int index; /* index of the item - stored to avoid loockups */
 	char name[64];  /* MAX_NAME */
 
+	/* Such stuff should usually be handled using custom props but this is
+	 * an exception: We access it a lot and it's useful for all layer types.
+	 * Will/should stay the only exception so not using bit flags. */
+	char is_hidden, pad[3];
+
 	LayerTree *tree; /* pointer back to layer tree - TODO check if needed */
 	struct LayerTreeItem *parent; /* the group this item belongs to */
 	ListBase childs; /* LayerTreeItem */




More information about the Bf-blender-cvs mailing list