package views import ( "fmt" "image" "git.milar.in/milarin/gui" ) type ScrollbarView struct { gui.ViewTmpl Orientation gui.Orientation Thickness int ViewSize int ViewportPos int ViewportSize int width, height int } var _ gui.View = &ScrollbarView{} func NewScrollbarView(orientation gui.Orientation) *ScrollbarView { return &ScrollbarView{ Orientation: orientation, Thickness: 15, } } func (v *ScrollbarView) Layout(ctx gui.AppContext) (prefWidth, prefHeight int) { if v.Orientation == gui.Horizontal { return -1, v.Thickness } return v.Thickness, -1 } func (v *ScrollbarView) Draw(img *gui.Image, ctx gui.AppContext) { v.ViewTmpl.Draw(img, ctx) v.width, v.height = img.Bounds().Dx(), img.Bounds().Dy() var x, y, w, h int if v.Orientation == gui.Vertical { x = img.Bounds().Min.X y = img.Bounds().Min.Y + v.ViewportPos*img.Bounds().Dy()/v.ViewSize w = img.Bounds().Max.X h = v.ViewportSize*img.Bounds().Dy()/v.ViewSize + 1 } else if v.Orientation == gui.Horizontal { x = img.Bounds().Min.X + v.ViewportPos*img.Bounds().Dx()/v.ViewSize y = img.Bounds().Min.Y w = v.ViewportSize*img.Bounds().Dx()/v.ViewSize + 1 h = img.Bounds().Max.Y } img.DrawRect(image.Rect(x, y, x+w, y+h), v.Foreground(ctx)) } func (v *ScrollbarView) OnMouseMove(event gui.MouseEvent) (consumed bool) { if v.Orientation == gui.Vertical { y := v.ViewportPos * v.height / v.ViewSize h := v.ViewportSize*v.height/v.ViewSize + 1 fmt.Println(event.Buttons) // TODO because MouseMove is only fired when mouse is moved, JustPressed button events don't work if event.Position.Y > y && event.Position.Y < y+h && event.JustPressed(gui.MouseButtonLeft) { fmt.Println("move start") } } return true }