72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package ui
|
|
|
|
import (
|
|
"opslag.de/schobers/geom"
|
|
)
|
|
|
|
type ContainerBase struct {
|
|
ControlBase
|
|
Children []Control
|
|
}
|
|
|
|
func BuildContainerBase(controls ...Control) ContainerBase {
|
|
return ContainerBase{
|
|
Children: controls,
|
|
}
|
|
}
|
|
|
|
func (c *ContainerBase) AddChild(child ...Control) {
|
|
c.Children = append(c.Children, child...)
|
|
for _, child := range child {
|
|
child.SetSelf(child)
|
|
}
|
|
}
|
|
|
|
func (c *ContainerBase) Arrange(ctx Context, bounds geom.RectangleF32, offset geom.PointF32, parent Control) {
|
|
for _, child := range c.Children {
|
|
child.Arrange(ctx, bounds, offset, c)
|
|
}
|
|
c.ControlBase.Arrange(ctx, bounds, offset, parent)
|
|
}
|
|
|
|
func (c *ContainerBase) BoundsUnclipped(ctx Context, path ControlPath) geom.RectangleF32 {
|
|
if len(path) == 0 {
|
|
return c.bounds
|
|
}
|
|
next := path[0]
|
|
for _, child := range c.Children {
|
|
if child == next {
|
|
return child.BoundsUnclipped(ctx, path[1:])
|
|
}
|
|
}
|
|
panic("child not found in path")
|
|
}
|
|
|
|
func (c *ContainerBase) DesiredSize(ctx Context, size geom.PointF32) geom.PointF32 {
|
|
var max geom.PointF32
|
|
for _, child := range c.Children {
|
|
s := child.DesiredSize(ctx, size)
|
|
max = geom.MaxPtF32(max, s)
|
|
}
|
|
return max
|
|
}
|
|
|
|
func (c *ContainerBase) Handle(ctx Context, e Event) bool {
|
|
if c.ControlBase.Handle(ctx, e) {
|
|
return true
|
|
}
|
|
for _, child := range c.Children {
|
|
if child.Handle(ctx, e) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (c *ContainerBase) Render(ctx Context) {
|
|
c.RenderBackground(ctx)
|
|
for _, child := range c.Children {
|
|
child.Render(ctx)
|
|
}
|
|
}
|