package ui import ( "image/color" rl "github.com/gen2brain/raylib-go/raylib" ) var defaultGridPadding float32 = 0 var defaultGridRoundness float32 = 0 var defaultGridStyle = &Style { BacgroundColor: &color.RGBA{0, 0, 0, 0}, FontColor: &rl.DarkGray, Padding: &defaultGridPadding, Roundness: &defaultGridRoundness, } // A dynamically shrinking element that contains other elements type flexElement interface { GetElements() []UIElement GetSpacing() float32 RecalculateCache(*rl.Rectangle) } // Calculates the element weight to pixel ratio func getWeightToPixelsRatio(base flexElement, totalSpace float32) float32 { var elements = base.GetElements() var totalWeights float32 = 0 for _, v := range elements { totalWeights += v.GetOccupationWeight() } var spacingPx = totalSpace * base.GetSpacing() var totalSpacing = float32(len(elements) - 1) * spacingPx if totalSpace < 0 { totalSpace = 0 } return (totalSpace - totalSpacing) / totalWeights } type layoutCache struct { // The screen resolution the cache was calculated for ScreenResolution rl.Vector2 // The resolution the cache was calculated for SpanResolution rl.Vector2 // Horizontal offset in pixels OffsetX float32 // Vertical offset in pixels OffsetY float32 // The X size of a row Width float32 // The Y size of a row Height float32 // The horizontal start and end of each row. // Index of an array is representive with row index RowLocations []rl.Vector2 } func (base layoutCache) IsValid() bool { return base.ScreenResolution.X == float32(rl.GetScreenWidth()) && base.ScreenResolution.Y == float32(rl.GetScreenHeight()) } func (base *layoutCache) CalculateOffsets(X float32, Y float32, paddingX float32, paddingY float32) { base.OffsetX = (X * paddingX) base.OffsetY = (Y * paddingY) base.Width = X - base.OffsetX * 2 base.Height = Y - base.OffsetY * 2 } func (base *layoutCache) CalculateRowsLocations (rows []UIElement, WeightToPixels float32, spacing float32, baseOffset float32) { base.RowLocations = make([]rl.Vector2, len(rows)) var ptr float32 = baseOffset for i, v := range rows { // The spacing should be accounted for in the WeightToPixels param var elemSpace = (WeightToPixels * v.GetOccupationWeight()) base.RowLocations[i] = rl.Vector2 { X: ptr, Y: elemSpace, } ptr += elemSpace + spacing } }