[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