package ui import ( "encoding/json" "fmt" rl "github.com/gen2brain/raylib-go/raylib" ) const GridRowTypeName string = "gridrow" type GridRow struct { // A portion of the screen the row will occupy. Works similar to CSS's 'flex-grow' Weight float32 // The objects that lay in this row Objects []UIElement // Spaces between the columns Spacing float32 // Styling preferences Style Style `json:"-"` location rl.Rectangle cache layoutCache } func (base *GridRow) GetElements() []UIElement { return base.Objects } func (base *GridRow) GetSpacing() float32 { return base.Spacing } func (base *GridRow) Init(parent *Menu) { base.Style.FillMissing(defaultGridStyle) for _, v := range base.Objects { v.Init(parent) } base.cache = layoutCache { ScreenResolution: rl.Vector2{ X:0, Y:0 }, } } func (base *GridRow) Destroy() { } // Gets the scale width of the element. Works similar to CSS's 'flex-grow' func (base *GridRow) GetOccupationWeight() float32 { return base.Weight } // Draw the element with the given size func (base *GridRow) Draw(span *rl.Rectangle) { if !base.cache.IsValid() { base.RecalculateCache(span) } for i, v := range base.Objects { var offset = base.cache.RowLocations[i] // rl.TraceLog(rl.LogInfo, "Cache: %v", base.cache) var elemSpan = rl.Rectangle { X: offset.X, Y: span.Y + *base.Style.Padding, Width: offset.Y, Height: span.Height - *base.Style.Padding * 2, } v.Draw(&elemSpan) } } func (base *GridRow) 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()), } rl.TraceLog(rl.LogInfo, "Span: %vx%v \tPadding: %v", span.Width, span.Height, *base.Style.Padding) base.cache.CalculateOffsets(span.Width, span.Height, *base.Style.Padding, *base.Style.Padding) var weightToScale = getWeightToPixelsRatio(base, base.cache.Width) rl.TraceLog(rl.LogInfo, "Ratio: %v", weightToScale) var spacingPx = base.Spacing * span.Width base.cache.CalculateRowsLocations(base.Objects, weightToScale, spacingPx, span.X) } func (base GridRow) String() string { var outp, jsonErr = json.Marshal(base) if jsonErr != nil { return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error()) } return string(outp) }