From 5f62643b0dfa6e33177116082acd47c1a93a9940 Mon Sep 17 00:00:00 2001 From: Physcik Date: Mon, 2 Feb 2026 13:53:39 +0500 Subject: Flex column --- engine/UI/GridColumn.go | 59 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 5 deletions(-) (limited to 'engine/UI/GridColumn.go') diff --git a/engine/UI/GridColumn.go b/engine/UI/GridColumn.go index 02d441f..359d0d4 100644 --- a/engine/UI/GridColumn.go +++ b/engine/UI/GridColumn.go @@ -3,14 +3,27 @@ package ui import rl "github.com/gen2brain/raylib-go/raylib" type GridColumn struct { - Weight float32 + // A portion of the screen the row will occupy. Works similar to CSS's 'flex-grow' + WidthWeight float32 + // The objects that lay in this row Spacing float32 - Elements []UIElement + // Spaces between the columns + Objects []UIElement + // Styling preferences + Style *Style + location rl.Rectangle cache layoutCache } -func (base *GridColumn) Init(*Menu) { +func (base *GridColumn) Init(parent *Menu) { + base.Style = InitStyle(base.Style, defaultGridStyle) + for _, v := range base.Objects { + v.Init(parent) + } + base.cache = layoutCache { + ScreenResolution: rl.Vector2{ X:0, Y:0 }, + } } func (base *GridColumn) Destroy() { @@ -18,9 +31,45 @@ func (base *GridColumn) Destroy() { // Gets the scale width of the element. Works similar to CSS's 'flex-grow' func (base *GridColumn) GetOccupationWeight() float32 { - return base.Weight + return base.WidthWeight } // Draw the element with the given size -func (base *GridColumn) Draw(*rl.Rectangle) { +func (base *GridColumn) Draw(span *rl.Rectangle) { + if !base.cache.IsValid() { + base.RecalculateCache(span) + } + for i, v := range base.Objects { + var offset = base.cache.RowLocations[i] + var elemSpan = rl.Rectangle { + X: span.X + *base.Style.Padding, + Y: offset.X, + Width: base.cache.Width, + Height: offset.Y, + } + v.Draw(&elemSpan) + } +} + +func (base *GridColumn) RecalculateCache(span *rl.Rectangle) { + base.cache.SpanResolution = rl.Vector2{ + X: span.Width, + Y: span.Height, + } + base.cache.ScreenResolution = rl.Vector2 { + X: float32(rl.GetScreenWidth()), + Y: float32(rl.GetScreenHeight()), + } + base.cache.CalculateOffsets(span.Width, span.Height, *base.Style.Padding, *base.Style.Padding) + var weightToScale = getWeightToPixelsRatio(base, base.cache.Height) + var spacingPx = base.Spacing * span.Height + base.cache.CalculateRowsLocations(base.Objects, weightToScale, spacingPx, span.Y) +} + +func (base *GridColumn) GetElements() []UIElement { + return base.Objects +} + +func (base *GridColumn) GetSpacing() float32 { + return base.Spacing } -- cgit v1.3