aboutsummaryrefslogtreecommitdiffstats
path: root/layout/region.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2026-02-11 17:42:51 -0500
committerSam Anthony <sam@samanthony.xyz>2026-02-11 17:42:51 -0500
commitc8610ea4164403c418c3fc13aee13685aeff447f (patch)
tree06e0d4b2012b791fd6bec059d6cde0fd22a3d5e1 /layout/region.go
parentebc5d96f0614ab3b4f2073eadf22fbe554b0ec8f (diff)
downloadgui-c8610ea4164403c418c3fc13aee13685aeff447f.zip
add border layout
Diffstat (limited to 'layout/region.go')
-rw-r--r--layout/region.go45
1 files changed, 23 insertions, 22 deletions
diff --git a/layout/region.go b/layout/region.go
index 1e4d4b1..08fa48d 100644
--- a/layout/region.go
+++ b/layout/region.go
@@ -17,45 +17,46 @@ type Region struct {
// NewRegion creates a region layout that occupies part of the parent env's area, as determined by the resize function.
// Resize takes the area of the parent and returns the area of the region.
// It returns the child Env.
-func NewRegion(env gui.Env, clr color.Color, resize func(image.Rectangle) image.Rectangle) gui.Env {
- events := make(chan gui.Event) // to child
- drw := make(chan func(draw.Image) image.Rectangle) // from child
+func NewRegion(env gui.Env, clr color.Color, resize ResizeFunc) gui.Env {
+ events := make(chan gui.Event) // to child
+ draws := make(chan func(draw.Image) image.Rectangle) // from child
- go func(events chan<- gui.Event, drw <-chan func(draw.Image) image.Rectangle) {
- // Forward first resize event to child
- event := <-env.Events()
- area := resize(event.(gui.Resize).Rectangle) // first event guaranteed to be Resize
- events <- gui.Resize{area}
+ go func(events chan<- gui.Event, draws <-chan func(draw.Image) image.Rectangle) {
+ defer close(env.Draw())
+ defer close(events)
- // Draw background
- redrawBg := func(area image.Rectangle) func(draw.Image) image.Rectangle {
- return drawSubImage(drawBackground(clr), area)
+ redraw := func(area, childArea image.Rectangle) {
+ env.Draw() <- drawSubImage(drawBackground(clr), area)
+ events <- gui.Resize{childArea}
}
- env.Draw() <- redrawBg(area)
+
+ // Draw background and forward first resize event to child
+ event := (<-env.Events()).(gui.Resize) // first event guaranteed to be Resize
+ area := event.Rectangle
+ childArea := resize(area)
+ go redraw(area, childArea)
for {
select {
case event := <-env.Events(): // event from parent
switch event := event.(type) {
case gui.Resize:
- env.Draw() <- redrawBg(area)
- area = resize(event.Rectangle)
- events <- gui.Resize{area} // forward to child
+ area = event.Rectangle
+ childArea = resize(area)
+ go redraw(area, childArea)
default:
- events <- event
+ go func() { events <- event }() // forward to child
}
- case f, ok := <-drw: // draw call from child
+ case f, ok := <-draws: // draw call from child
if !ok {
- close(events)
- close(env.Draw())
return
}
- env.Draw() <- drawSubImage(f, area)
+ env.Draw() <- drawSubImage(f, childArea)
}
}
- }(events, drw)
+ }(events, draws)
- return Region{events, drw}
+ return Region{events, draws}
}
// Events implements the Env interface.