[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