aboutsummaryrefslogtreecommitdiffstats
path: root/layout/scroller.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-08-24 15:39:09 -0400
committerSam Anthony <sam@samanthony.xyz>2024-08-24 15:39:09 -0400
commit9bf3236dc993a3d8dbf4caf14bd448ab4de70a72 (patch)
tree59a2249503e680eb24a2ed68ec775c3dac8d2b57 /layout/scroller.go
parente725799ad17c575a7a3cd2536f57bd82f85782e5 (diff)
downloadgui-9bf3236dc993a3d8dbf4caf14bd448ab4de70a72.zip
adapt scroller to new layout design
Diffstat (limited to 'layout/scroller.go')
-rw-r--r--layout/scroller.go132
1 files changed, 0 insertions, 132 deletions
diff --git a/layout/scroller.go b/layout/scroller.go
deleted file mode 100644
index c532f93..0000000
--- a/layout/scroller.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package layout
-
-import (
- "image"
- "image/color"
- "image/draw"
- // "log"
- "sync"
-
- "github.com/faiface/gui"
- "github.com/faiface/gui/win"
-)
-
-var _ Layout = &Scroller{}
-
-type Scroller struct {
- Background color.Color
- Length int
- ChildHeight int
- Offset int
- Gap int
- Vertical bool
-}
-
-func (s Scroller) redraw(drw draw.Image, bounds image.Rectangle) {
- col := s.Background
- if col == nil {
- col = image.Black
- }
- draw.Draw(drw, bounds, image.NewUniform(col), image.ZP, draw.Src)
-}
-
-func clamp(val, a, b int) int {
- if a > b {
- if val < b {
- return b
- }
- if val > a {
- return a
- }
- } else {
- if val > b {
- return b
- }
- if val < a {
- return a
- }
- }
- return val
-}
-
-func (s *Scroller) Intercept(env gui.Env) gui.Env {
- out, in := gui.MakeEventsChan()
- drawChan := make(chan func(draw.Image) image.Rectangle)
- ret := &muxEnv{out, drawChan}
- var lastResize gui.Resize
- var img draw.Image
- img = image.NewRGBA(image.ZR)
- var mu sync.Mutex
- var over bool
-
- go func() {
- for dc := range drawChan {
- mu.Lock()
- // draw.Draw will not draw out of bounds, call should be inexpensive if element not visible
- res := dc(img)
- // Only send a draw call up if visibly changed
- if res.Intersect(img.Bounds()) != image.ZR {
- env.Draw() <- func(drw draw.Image) image.Rectangle {
- draw.Draw(drw, lastResize.Rectangle, img, lastResize.Rectangle.Min, draw.Over)
- return img.Bounds()
- }
- }
- mu.Unlock()
- }
- }()
-
- go func() {
- for ev := range env.Events() {
- switch ev := ev.(type) {
- case win.MoMove:
- mu.Lock()
- over = ev.Point.In(lastResize.Rectangle)
- mu.Unlock()
- case win.MoScroll:
- if !over {
- continue
- }
- mu.Lock()
- oldoff := s.Offset
- v := s.Length*s.ChildHeight + ((s.Length + 1) * s.Gap)
- if s.Vertical {
- h := lastResize.Dx()
- s.Offset = clamp(s.Offset+ev.Point.X*16, h-v, 0)
- } else {
- h := lastResize.Dy()
- s.Offset = clamp(s.Offset+ev.Point.Y*16, h-v, 0)
- }
- if oldoff != s.Offset {
- s.redraw(img, img.Bounds())
- in <- lastResize
- }
- mu.Unlock()
- case gui.Resize:
- mu.Lock()
- lastResize = ev
- img = image.NewRGBA(lastResize.Rectangle)
- s.redraw(img, img.Bounds())
- mu.Unlock()
- in <- ev
- default:
- in <- ev
- }
- }
- }()
- return ret
-}
-
-func (s Scroller) Lay(bounds image.Rectangle) []image.Rectangle {
- items := s.Length
- ch := s.ChildHeight
- gap := s.Gap
-
- ret := make([]image.Rectangle, items)
- Y := bounds.Min.Y + s.Offset + gap
- for i := 0; i < items; i++ {
- r := image.Rect(bounds.Min.X+gap, Y, bounds.Max.X-gap, Y+ch)
- ret[i] = r
- Y += ch + gap
- }
- return ret
-}