[Bf-blender-cvs] [6282b33] soc-2016-layer_manager: Invert layer drawing order: Top to bottom instead of bottom to top

Julian Eisel noreply at git.blender.org
Sat Jun 4 20:17:06 CEST 2016


Commit: 6282b3335ffc67a1d9fb4499ed634600d52256f3
Author: Julian Eisel
Date:   Sat Jun 4 20:15:36 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB6282b3335ffc67a1d9fb4499ed634600d52256f3

Invert layer drawing order: Top to bottom instead of bottom to top

Convention in Blender is to use top to bottom, not the other way around.

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

M	source/blender/blenkernel/BKE_layer.h
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
M	source/blender/editors/space_layers/layers_util.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 8f9795c..1596ec6 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -55,7 +55,7 @@ typedef enum eLayerTree_Type {
 LayerTree *BKE_layertree_new(const eLayerTree_Type type);
 void BKE_layertree_delete(LayerTree *ltree);
 
-bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata);
+bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata, const bool inverse);
 int  BKE_layertree_get_totitems(const LayerTree *ltree);
 
 /* -------------------------------------------------------------------- */
@@ -79,7 +79,9 @@ void BKE_layeritem_remove(LayerTreeItem *litem, const bool remove_children);
 
 void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item);
 
-bool BKE_layeritem_iterate_childs(LayerTreeItem *litem, LayerTreeIterFunc foreach, void *customdata);
+bool BKE_layeritem_iterate_childs(
+        LayerTreeItem *litem, LayerTreeIterFunc foreach, void *customdata,
+        const bool inverse);
 
 #endif  /* __BKE_LAYER_H__ */
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 31be0c8..d78aa7a 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -74,12 +74,17 @@ void BKE_layertree_delete(LayerTree *ltree)
  * Iterate over \a itemlist and all of its children, wrapped by #BKE_layertree_iterate.
  * \note Recursive
  */
-static bool layertree_iterate_list(const ListBase *itemlist, LayerTreeIterFunc foreach, void *customdata)
+static bool layertree_iterate_list(
+        const ListBase *itemlist, LayerTreeIterFunc foreach, void *customdata,
+        const bool inverse)
 {
-	for (LayerTreeItem *litem = itemlist->first, *litem_next; litem; litem = litem_next) {
-		litem_next = litem->next; /* in case list order is changed in callback */
+	for (LayerTreeItem *litem = (inverse ? itemlist->last : itemlist->first), *litem_next;
+	     litem;
+	     litem = litem_next)
+	{
+		litem_next = inverse ? litem->prev : litem->next; /* in case list order is changed in callback */
 		if (foreach(litem, customdata) == false || /* execute callback for current item */
-		    layertree_iterate_list(&litem->childs, foreach, customdata) == false) /* iterate over childs */
+		    layertree_iterate_list(&litem->childs, foreach, customdata, inverse) == false) /* iterate over childs */
 		{
 			return false;
 		}
@@ -94,9 +99,9 @@ static bool layertree_iterate_list(const ListBase *itemlist, LayerTreeIterFunc f
  * \param foreach: Callback that can return false to stop the iteration.
  * \return if the iteration has been stopped because of a callback returning false.
  */
-bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata)
+bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata, const bool inverse)
 {
-	return layertree_iterate_list(&ltree->items, foreach, customdata);
+	return layertree_iterate_list(&ltree->items, foreach, customdata, inverse);
 }
 
 int BKE_layertree_get_totitems(const LayerTree *ltree)
@@ -198,9 +203,11 @@ void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item)
  * \param foreach: Callback that can return false to stop the iteration.
  * \return if the iteration has been stopped because of a callback returning false.
  */
-bool BKE_layeritem_iterate_childs(LayerTreeItem *litem, LayerTreeIterFunc foreach, void *customdata)
+bool BKE_layeritem_iterate_childs(
+        LayerTreeItem *litem, LayerTreeIterFunc foreach, void *customdata,
+        const bool inverse)
 {
-	return layertree_iterate_list(&litem->childs, foreach, customdata);
+	return layertree_iterate_list(&litem->childs, foreach, customdata, inverse);
 }
 
 /** \} */ /* Layer Tree Item */
diff --git a/source/blender/editors/space_layers/layers_draw.c b/source/blender/editors/space_layers/layers_draw.c
index aaf55ef..8da2dad 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -164,7 +164,7 @@ void layers_tiles_draw(const bContext *C, ARegion *ar)
 	TileDrawInfo drawinfo = {C, ar, slayer, block, UI_style_get_dpi()};
 
 	/* draw tiles */
-	BKE_layertree_iterate(slayer->act_tree, layer_tile_draw_cb, &drawinfo);
+	BKE_layertree_iterate(slayer->act_tree, layer_tile_draw_cb, &drawinfo, true);
 
 	/* fill remaining space with empty boxes */
 	const float tot_fill_tiles = (-ar->v2d.cur.ymin - drawinfo.size_y) / LAYERTILE_HEADER_HEIGHT + 1;
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index e444520..8e7cbc4 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -154,7 +154,7 @@ static int layer_group_add_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
 
 	/* Add selected items to group */
 	GroupAddSelectedData gadata = {slayer, new_group};
-	BKE_layertree_iterate(slayer->act_tree, layer_group_add_selected_cb, &gadata);
+	BKE_layertree_iterate(slayer->act_tree, layer_group_add_selected_cb, &gadata, true);
 
 	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, NULL);
 	return OPERATOR_FINISHED;
@@ -247,7 +247,7 @@ static bool layer_select_cb(LayerTreeItem *litem, void *customdata)
 static void layers_selection_set_all(SpaceLayers *slayer, const bool enable)
 {
 	LayerSelectData sdata = {slayer, -1, -1, enable};
-	BKE_layertree_iterate(slayer->act_tree, layer_select_cb, &sdata);
+	BKE_layertree_iterate(slayer->act_tree, layer_select_cb, &sdata, true);
 }
 
 /**
@@ -263,7 +263,7 @@ static bool layers_select_fill(SpaceLayers *slayer, const int from, const int to
 	if (min < 0 || min == max)
 		return false;
 
-	BKE_layertree_iterate(slayer->act_tree, layer_select_cb, &sdata);
+	BKE_layertree_iterate(slayer->act_tree, layer_select_cb, &sdata, true);
 
 	return true;
 }
diff --git a/source/blender/editors/space_layers/layers_util.c b/source/blender/editors/space_layers/layers_util.c
index be50876..f210165 100644
--- a/source/blender/editors/space_layers/layers_util.c
+++ b/source/blender/editors/space_layers/layers_util.c
@@ -58,7 +58,7 @@ void layers_data_refresh(const Scene *scene, SpaceLayers *slayer)
 		layers_tilehash_delete(slayer);
 	}
 	slayer->tiles = BLI_ghash_ptr_new_ex("Layer tiles hash", BKE_layertree_get_totitems(slayer->act_tree));
-	BKE_layertree_iterate(slayer->act_tree, layers_tile_recreate_cb, slayer);
+	BKE_layertree_iterate(slayer->act_tree, layers_tile_recreate_cb, slayer, true);
 	slayer->flag &= ~SL_LAYERDATA_REFRESH;
 }
 
@@ -95,7 +95,7 @@ void layers_tile_remove(const SpaceLayers *slayer, LayerTile *tile, const bool r
 {
 	/* remove tiles of children first */
 	if (remove_children) {
-		BKE_layeritem_iterate_childs(tile->litem, layer_tile_remove_children_cb, (void *)slayer);
+		BKE_layeritem_iterate_childs(tile->litem, layer_tile_remove_children_cb, (void *)slayer, true);
 	}
 	/* remove tile */
 	BLI_ghash_remove(slayer->tiles, tile->litem, NULL, MEM_freeN);
@@ -142,7 +142,7 @@ LayerTile *layers_tile_find_at_coordinate(
         int *r_tile_idx)
 {
 	LayerIsectCheckData idata = {slayer, &ar->v2d, co[0], co[1]};
-	BKE_layertree_iterate(slayer->act_tree, layers_tile_find_at_coordinate_cb, &idata);
+	BKE_layertree_iterate(slayer->act_tree, layers_tile_find_at_coordinate_cb, &idata, true);
 
 	/* return values */
 	if (r_tile_idx) {
@@ -166,5 +166,5 @@ static bool layers_has_selected_cb(LayerTreeItem *litem, void *customdata)
 bool layers_any_selected(SpaceLayers *slayer, const LayerTree *ltree)
 {
 	/* returns false if iterator was stopped because layers_has_selected_cb found a selected tile */
-	return BKE_layertree_iterate(ltree, layers_has_selected_cb, slayer) == false;
+	return BKE_layertree_iterate(ltree, layers_has_selected_cb, slayer, true) == false;
 }




More information about the Bf-blender-cvs mailing list