From 27f14e99c29b48545a2688036929bd70e2b7c45c Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 13 Sep 2025 16:43:35 +1000 Subject: [PATCH] make tree recurse without recursive functions --- src/editor/ui.d | 84 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/src/editor/ui.d b/src/editor/ui.d index eb80b2c..c8c5c1a 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -446,75 +446,103 @@ DrawNodes(UIItem* item) void CalcFixedSizes(UIItem* item) { - if (!Nil(item)) + for(UIItem* i = item; !Nil(i); i = Recurse(i)) { static foreach(axis; A2D.min .. A2D.max) { - if (item.size_info[axis].type == ST.Pixels) + if (i.size_info[axis].type == ST.Pixels) { - item.size.v[axis] = item.size_info[axis].value + item.adjustment.v[axis]; + i.size.v[axis] = i.size_info[axis].value + i.adjustment.v[axis]; } } - - CalcFixedSizes(item.first); - CalcFixedSizes(item.next); } } void CalcPercentageSizes(UIItem* item) { - if (!Nil(item)) + for(UIItem* i = item; !Nil(i); i = Recurse(i)) { static foreach(axis; A2D.min .. A2D.max) { - if (item.size_info[axis].type == ST.Percentage) + if (i.size_info[axis].type == ST.Percentage) { - item.size.v[axis] = (item.parent.size.v[axis]*item.size_info[axis].value) + item.adjustment.v[axis]; + i.size.v[axis] = (i.parent.size.v[axis]*i.size_info[axis].value) + i.adjustment.v[axis]; } } - - CalcPercentageSizes(item.first); - CalcPercentageSizes(item.next); } } void -CalcPositions(alias axis)(UIItem* item, f32 pos = 0.0) +CalcPositions(alias axis)(UIItem* item) { - if (!Nil(item)) + f32 pos = 0.0; + for(UIItem* i = item; !Nil(i);) { - f32 end_pos = pos + item.size.v[axis]; - item.rect.vec0.v[axis] = pos; - item.rect.vec1.v[axis] = end_pos; + f32 end_pos = pos + i.size.v[axis]; + i.rect.vec0.v[axis] = pos; + i.rect.vec1.v[axis] = end_pos; - f32 next_pos = item.parent.layout_axis == axis ? end_pos : pos; + f32 next_pos = i.parent.layout_axis == axis ? end_pos : pos; - CalcPositions!(axis)(item.first, pos); - CalcPositions!(axis)(item.next, next_pos); + if (!Nil(i.first)) + { + i = i.first; + } + else if (!Nil(i.next)) + { + i = i.next; + pos = next_pos; + } + else if (!Nil(i.parent.next)) + { + i = i.parent.next; + pos = i.parent.layout_axis == axis ? i.prev.rect.vec1.v[axis] : i.prev.rect.vec0.v[axis]; + } + else + { + break; + } } } void DrawUI(UICtx* ctx, UIItem* item) { - if (!Nil(item)) + for(UIItem* i = item; !Nil(i); i = Recurse(i)) { - if (item.flags & UIF.DrawBackground) + if (i.flags & UIF.DrawBackground) { - DrawRect(ctx, item); + DrawRect(ctx, i); } - if (item.flags & UIF.DrawText) + if (i.flags & UIF.DrawText) { - DrawLine(item); + DrawLine(i); } - - DrawUI(ctx, item.first); - DrawUI(ctx, item.next); } } +UIItem* +Recurse(UIItem* item) +{ + UIItem* result = g_UI_NIL; + if (!Nil(item.first)) + { + result = item.first; + } + else if (!Nil(item.next)) + { + result = item.next; + } + else if (!Nil(item.parent.next)) + { + result = item.parent.next; + } + + return result; +} + void BuildItem(UIItem* item, UISize size_x, UISize size_y, UIFlags properties) {