65 lines
1.1 KiB
Go
65 lines
1.1 KiB
Go
package ui
|
|
|
|
import (
|
|
rl "github.com/gen2brain/raylib-go/raylib"
|
|
)
|
|
|
|
type OnSelectCallback func()
|
|
|
|
type Menu struct {
|
|
selected int
|
|
entries []Widget
|
|
onSelect OnSelectCallback
|
|
}
|
|
|
|
func NewMenu(entries []Widget) *Menu {
|
|
return &Menu{
|
|
entries: entries,
|
|
onSelect: func() {},
|
|
}
|
|
}
|
|
|
|
func (menu *Menu) OnSelect(callback OnSelectCallback) *Menu {
|
|
menu.onSelect = callback
|
|
return menu
|
|
}
|
|
|
|
func (menu Menu) Entries() []Widget {
|
|
return menu.entries
|
|
}
|
|
|
|
func (menu *Menu) Select(index int) {
|
|
menu.selected = min(index, len(menu.entries)-1)
|
|
}
|
|
|
|
func (menu Menu) Selected() Widget {
|
|
return menu.entries[menu.selected]
|
|
}
|
|
|
|
func (menu Menu) IsSelected(index int) bool {
|
|
return menu.selected == index
|
|
}
|
|
|
|
func (menu *Menu) Next() {
|
|
if menu.selected+1 < len(menu.entries) {
|
|
menu.selected = menu.selected + 1
|
|
menu.onSelect()
|
|
}
|
|
}
|
|
|
|
func (menu *Menu) Previous() {
|
|
if menu.selected-1 >= 0 {
|
|
menu.selected = menu.selected - 1
|
|
menu.onSelect()
|
|
}
|
|
}
|
|
|
|
func (menu *Menu) HandleInput() {
|
|
if rl.IsKeyPressed(rl.KeyDown) {
|
|
menu.Next()
|
|
} else if rl.IsKeyPressed(rl.KeyUp) {
|
|
menu.Previous()
|
|
} else {
|
|
menu.Selected().HandleInput()
|
|
}
|
|
}
|