[Bf-blender-cvs] [c90a2bd] soc-2016-layer_manager: Place new groups at just before first selected element
Julian Eisel
noreply at git.blender.org
Thu Jun 30 02:44:33 CEST 2016
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);
}
}
More information about the Bf-blender-cvs
mailing list