package layouts import ( "image" "math" "git.milar.in/milarin/gui" ) func min(x, y int) int { if x < y { return x } return y } func max(x, y int) int { if x > y { return x } return y } func limit(v, minv, maxv int) int { return min(max(v, minv), maxv) } func iff[T any](condition bool, trueValue, falseValue T) T { if condition { return trueValue } return falseValue } type LayoutResult struct { Sizes map[gui.View]gui.Size Sum gui.Size Min gui.Size Max gui.Size Pref gui.Size Count int VerticalNegativeCount int HorizontalNegativeCount int } func CalculateLayoutResult(ctx gui.AppContext, views []gui.View) *LayoutResult { result := &LayoutResult{ Sizes: map[gui.View]gui.Size{}, Sum: gui.Size{Width: 0, Height: 0}, Min: gui.Size{Width: math.MaxInt, Height: math.MaxInt}, Max: gui.Size{Width: -1, Height: -1}, Count: 0, VerticalNegativeCount: 0, HorizontalNegativeCount: 0, } for _, view := range views { if view == nil { continue } result.Count++ width, height := view.Layout(ctx) result.Sizes[view] = gui.Size{Width: width, Height: height} if width > 0 { result.Sum.Width += width result.Min.Width = min(result.Min.Width, width) result.Max.Width = max(result.Max.Width, width) } else if width < 0 { result.HorizontalNegativeCount++ } if height > 0 { result.Sum.Height += height result.Min.Height = min(result.Min.Height, height) result.Max.Height = max(result.Max.Height, height) } else if height < 0 { result.VerticalNegativeCount++ } } return result } func rect(x, y, w, h int) image.Rectangle { return image.Rect(x, y, x+w, y+h) }