1
0
Fork 0
tetris-go/game/ui/layouts/list_box.go

84 lines
1.5 KiB
Go

package layouts
import (
"tetris/game/ui"
"tetris/game/ui/base"
rl "github.com/gen2brain/raylib-go/raylib"
)
type OnSelectCallback func()
type ListBox struct {
*base.WithFocus
selected int
entries []ui.InputWidget
onSelect OnSelectCallback
spacing int
}
func NewListBox(entries []ui.InputWidget) *ListBox {
lb := &ListBox{
WithFocus: &base.WithFocus{},
entries: entries,
onSelect: func() {},
}
lb.entries[0].SetFocus(true)
return lb
}
func (lb *ListBox) Spacing(value int) *ListBox {
lb.spacing = value
return lb
}
func (lb *ListBox) OnSelect(callback OnSelectCallback) *ListBox {
lb.onSelect = callback
return lb
}
func (lb ListBox) Entries() []ui.InputWidget {
return lb.entries
}
func (lb *ListBox) Select(index int) {
if index >= 0 && index < len(lb.entries) {
lb.entries[lb.selected].SetFocus(false)
lb.selected = index
lb.entries[lb.selected].SetFocus(true)
lb.onSelect()
}
}
func (lb ListBox) Selected() ui.InputWidget {
return lb.entries[lb.selected]
}
func (lb ListBox) IsSelected(index int) bool {
return lb.selected == index
}
func (lb *ListBox) Next() {
lb.Select(lb.selected + 1)
}
func (lb *ListBox) Previous() {
lb.Select(lb.selected - 1)
}
func (lb *ListBox) HandleInput() {
if rl.IsKeyPressed(rl.KeyDown) {
lb.Next()
} else if rl.IsKeyPressed(rl.KeyUp) {
lb.Previous()
} else {
lb.Selected().HandleInput()
}
}
func (lb *ListBox) Draw(x, y int32) {
for _, ent := range lb.entries {
ent.Draw(x, y)
y += int32(ent.Size().Y + lb.spacing)
}
}