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) */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to