diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-08-24 15:39:09 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-08-24 15:39:09 -0400 |
| commit | 9bf3236dc993a3d8dbf4caf14bd448ab4de70a72 (patch) | |
| tree | 59a2249503e680eb24a2ed68ec775c3dac8d2b57 /layout/scroller.go | |
| parent | e725799ad17c575a7a3cd2536f57bd82f85782e5 (diff) | |
| download | gui-9bf3236dc993a3d8dbf4caf14bd448ab4de70a72.zip | |
adapt scroller to new layout design
Diffstat (limited to 'layout/scroller.go')
| -rw-r--r-- | layout/scroller.go | 132 |
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 -} |