From a1756549f9dbefbfcda259f6839dab6159fd5b2a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 19 Oct 2025 11:56:13 +0200 Subject: [PATCH] feat(ui): menu should not call audio module directly, make it more modular with and onSelect event callback --- game/state/handlers/menu.go | 5 +++-- game/ui/menu.go | 22 ++++++++++++++-------- game/uievents/select.go | 10 ++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 game/uievents/select.go diff --git a/game/state/handlers/menu.go b/game/state/handlers/menu.go index e544d76..e026e84 100644 --- a/game/state/handlers/menu.go +++ b/game/state/handlers/menu.go @@ -6,12 +6,13 @@ import ( "tetris/game" "tetris/game/state" "tetris/game/ui" + "tetris/game/uievents" rl "github.com/gen2brain/raylib-go/raylib" ) type MainMenu struct { - menu ui.Menu + menu *ui.Menu } func NewMainMenu(fsm state.Transitioner) *MainMenu { @@ -19,7 +20,7 @@ func NewMainMenu(fsm state.Transitioner) *MainMenu { menu: ui.NewMenu([]ui.Widget{ ui.NewButton("Start", func() { fsm.Switch("gameplay") }), ui.NewButton("Quit", func() { fsm.Switch("quit") }), - }), + }).OnSelect(uievents.MenuSelect), } } diff --git a/game/ui/menu.go b/game/ui/menu.go index a6c61e2..d456b1f 100644 --- a/game/ui/menu.go +++ b/game/ui/menu.go @@ -1,23 +1,29 @@ package ui import ( - "tetris/assets" - "tetris/engine/audio" - 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, +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 } @@ -37,14 +43,14 @@ func (menu Menu) IsSelected(index int) bool { func (menu *Menu) Next() { if menu.selected+1 < len(menu.entries) { menu.selected = menu.selected + 1 - audio.Play(assets.SFX_MENU_SELECT) + menu.onSelect() } } func (menu *Menu) Previous() { if menu.selected-1 >= 0 { menu.selected = menu.selected - 1 - audio.Play(assets.SFX_MENU_SELECT) + menu.onSelect() } } diff --git a/game/uievents/select.go b/game/uievents/select.go new file mode 100644 index 0000000..7fa6d69 --- /dev/null +++ b/game/uievents/select.go @@ -0,0 +1,10 @@ +package uievents + +import ( + "tetris/assets" + "tetris/engine/audio" +) + +func MenuSelect() { + audio.Play(assets.SFX_MENU_SELECT) +}