gui/pkg/menu/wails.go
Snider 12a612bba0 feat(menu): add Manager with platform abstraction and builder
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:15:32 +00:00

86 lines
1.9 KiB
Go

// pkg/menu/wails.go
package menu
import "github.com/wailsapp/wails/v3/pkg/application"
// WailsPlatform implements Platform using Wails v3.
type WailsPlatform struct {
app *application.App
}
func NewWailsPlatform(app *application.App) *WailsPlatform {
return &WailsPlatform{app: app}
}
func (wp *WailsPlatform) NewMenu() PlatformMenu {
return &wailsMenu{menu: application.NewMenu()}
}
func (wp *WailsPlatform) SetApplicationMenu(menu PlatformMenu) {
if wm, ok := menu.(*wailsMenu); ok {
wp.app.Menu.SetApplicationMenu(wm.menu)
}
}
type wailsMenu struct {
menu *application.Menu
}
func (wm *wailsMenu) Add(label string) PlatformMenuItem {
return &wailsMenuItem{item: wm.menu.Add(label)}
}
func (wm *wailsMenu) AddSeparator() {
wm.menu.AddSeparator()
}
func (wm *wailsMenu) AddSubmenu(label string) PlatformMenu {
sub := wm.menu.AddSubmenu(label)
return &wailsMenu{menu: sub}
}
func (wm *wailsMenu) AddRole(role MenuRole) {
switch role {
case RoleAppMenu:
wm.menu.AddRole(application.AppMenu)
case RoleFileMenu:
wm.menu.AddRole(application.FileMenu)
case RoleEditMenu:
wm.menu.AddRole(application.EditMenu)
case RoleViewMenu:
wm.menu.AddRole(application.ViewMenu)
case RoleWindowMenu:
wm.menu.AddRole(application.WindowMenu)
case RoleHelpMenu:
wm.menu.AddRole(application.HelpMenu)
}
}
type wailsMenuItem struct {
item *application.MenuItem
}
func (mi *wailsMenuItem) SetAccelerator(accel string) PlatformMenuItem {
mi.item.SetAccelerator(accel)
return mi
}
func (mi *wailsMenuItem) SetTooltip(text string) PlatformMenuItem {
mi.item.SetTooltip(text)
return mi
}
func (mi *wailsMenuItem) SetChecked(checked bool) PlatformMenuItem {
mi.item.SetChecked(checked)
return mi
}
func (mi *wailsMenuItem) SetEnabled(enabled bool) PlatformMenuItem {
mi.item.SetEnabled(enabled)
return mi
}
func (mi *wailsMenuItem) OnClick(fn func()) PlatformMenuItem {
mi.item.OnClick(func(ctx *application.Context) { fn() })
return mi
}