Commit: c90a2bd0d6c8572e0a5ee7ac5e5d7fb72c2b5812
Author: Julian Eisel
Date:   Thu Jun 30 02:15:14 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBc90a2bd0d6c8572e0a5ee7ac5e5d7fb72c2b5812

Place new groups at just before first selected element

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

M       source/blender/blenkernel/intern/layer.c
M       source/blender/editors/space_layers/layers_draw.c
M       source/blender/editors/space_layers/layers_ops.c

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

diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index a3dd991..b6f5ed5 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -275,16 +275,13 @@ void BKE_layeritem_remove(LayerTreeItem *litem, const 
bool remove_children)
        ltree->items_all = MEM_reallocN(ltree->items_all, 
sizeof(*ltree->items_all) * ltree->tot_items);
 }
 
-/**
- * Move \a litem that's already in the layer tree to slot \a newidx.
- */
-void BKE_layeritem_move(LayerTreeItem *litem, const int newidx)
+static bool layeritem_move_array(LayerTreeItem *litem, const int newidx)
 {
        const bool is_higher = litem->index < newidx;
 
-       /* Already where we want to move it to. */
+       BLI_assert(litem->tree->tot_items > newidx);
        if (litem->index == newidx)
-               return;
+               return false;
 
        for (int i = is_higher ? litem->index + 1 : litem->index - 1;
             i < litem->tree->tot_items && i >= 0;
@@ -299,6 +296,32 @@ void BKE_layeritem_move(LayerTreeItem *litem, const int 
newidx)
                        break;
                }
        }
+
+       return true;
+}
+
+/**
+ * Move \a litem that's already in the layer tree to slot \a newidx.
+ */
+void BKE_layeritem_move(LayerTreeItem *litem, const int newidx)
+{
+       /* Already where we want to move it to. */
+
+       /* move in array (return if failed) */
+       if (!layeritem_move_array(litem, newidx)) {
+               return;
+       }
+
+       /* move in listbase */
+       BLI_remlink(litem->parent ? &litem->parent->childs : 
&litem->tree->items, litem);
+       if (newidx == litem->tree->tot_items - 1) {
+               LayerTreeItem *last = 
litem->tree->items_all[litem->tree->tot_items - 1];
+               BLI_addtail(last->parent ? &last->parent->childs : 
&litem->tree->items, litem);
+       }
+       else {
+               LayerTreeItem *moved = litem->tree->items_all[newidx + 1];
+               BLI_insertlinkbefore(moved->parent ? &moved->parent->childs : 
&litem->tree->items, moved, litem);
+       }
 }
 
 /**
@@ -312,8 +335,12 @@ void BKE_layeritem_group_assign(LayerTreeItem *group, 
LayerTreeItem *item)
        BLI_assert(BLI_findindex(oldlist, item) != -1);
 
        item->parent = group;
+       /* insert into list */
        BLI_remlink(oldlist, item);
        BLI_addtail(&group->childs, item);
+       /* move in array */
+       /* XXX we could/should limit iterations to one in case multiple 
elmenents are assigned to a group */
+       layeritem_move_array(item, (item->prev ? item->prev->index : 
item->parent->index) + 1);
 }
 
 /**
diff --git a/source/blender/editors/space_layers/layers_draw.c 
b/source/blender/editors/space_layers/layers_draw.c
index 5e03db9..1075615 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -176,6 +176,9 @@ static void layers_tiles_draw_floating(const bContext *C, 
struct FloatingTileDra
        UI_block_draw(C, block);
 }
 
+/**
+ * \note Recursive.
+ */
 static void layers_tiles_draw_childs(
         const ListBase *childs, const bContext *C, uiBlock *block,
         float *r_ofs_y, int *r_idx)
diff --git a/source/blender/editors/space_layers/layers_ops.c 
b/source/blender/editors/space_layers/layers_ops.c
index b6401ec..891d3e3 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -248,10 +248,15 @@ static int layer_group_add_invoke(bContext *C, wmOperator 
*UNUSED(op), const wmE
        layers_tile_add(slayer, new_group);
 
        /* Add selected items to group */
+       bool is_first = true;
        BKE_LAYERTREE_ITER_START(slayer->act_tree, 0, i, litem)
        {
                LayerTile *tile = BLI_ghash_lookup(slayer->tiles, litem);
                if (tile->flag & LAYERTILE_SELECTED) {
+                       if (is_first) {
+                               BKE_layeritem_move(new_group, litem->index);
+                               is_first = false;
+                       }
                        BKE_layeritem_group_assign(new_group, litem);
                }
        }

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

Reply via email to