注册 登录

清河洛

wails中的菜单

qingheluo2024-08-27清河洛365
在wails中,菜单相关实现在"github.com/wailsapp/wails/v2/pkg/menu"包中定义type menu.Menu表示一个包含若干菜单元素的菜单 type Menu struct { Items []*MenuItem } 创建菜单 NewMenu() *Menu :创建一个空菜单 NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu 菜单实例的常用方法 Append(item *MenuItem) 添加一个菜单元素 Merge(menu *Menu) 添加一个菜单中的所...

在wails中,菜单相关实现在"github.com/wailsapp/wails/v2/pkg/menu"包中定义

type menu.Menu

表示一个包含若干菜单元素的菜单

type Menu struct {
    Items []*MenuItem
}

创建菜单

NewMenu() *Menu  :创建一个空菜单
NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu

菜单实例的常用方法

Append(item *MenuItem)  添加一个菜单元素
Merge(menu *Menu)       添加一个菜单中的所有元素

AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem
                        // 创建一个文本菜单并添加至菜单,最后返回该菜单元素
AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem
AddRadio(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem
AddSeparator()
AddSubmenu(label string) *Menu

Prepend(item *MenuItem)   // 添加item至子菜单中并把item作为第一个元素

type menu.MenuItem

表示一个菜单中的菜单元素

type MenuItem struct {
    Label string
    Role Role       // 菜单的类型,仅Mac支持
                    type Role int
                    const (
                        AppMenuRole    Role = 1
                        EditMenuRole        = 2
                        WindowMenuRole      = 3
                    }
    Accelerator *keys.Accelerator  // 绑定快捷键
    Type Type       // 菜单元素类型
                    type Type string
                    const (
                        TextType Type = "Text"
                        SeparatorType Type = "Separator"
                        SubmenuType Type = "Submenu"
                        CheckboxType Type = "Checkbox"
                        RadioType Type = "Radio"
                    )
                    "Submenu"表示一个子菜单入口,此类菜单元素可以包含其他菜单元素作为子菜单
    Disabled bool
    Hidden bool
    Checked bool    // 表示该菜单元素是否已选中,仅限Checkbox and Radio
    SubMenu *Menu   // 子菜单
    Click Callback  // 设置点击后的回调函数
                    type Callback func(*CallbackData)
                    type CallbackData struct {
                        MenuItem    *MenuItem
                    }
                    函数接收一个CallbackData,指示哪个菜单项触发了回调
}

创建一个菜单元素

文本类型菜单元素
Label(label string) *MenuItem
Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem

分割线
Separator() *MenuItem

单选
Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem

多选
Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem

子菜单
SubMenu(label string, menu *Menu) *MenuItem

菜单元素的方法

IsSeparator() bool
IsCheckbox() bool
IsRadio() bool

SetLabel(name string)
Disable() *MenuItem
Enable() *MenuItem
OnClick(click Callback) *MenuItem
SetAccelerator(acc *keys.Accelerator) *MenuItem
SetChecked(value bool) *MenuItem  // 如果该菜单元素类型不是RadioType则自动设置为CheckboxType
Hide() *MenuItem
Show() *MenuItem


子菜单相关
Parent() *MenuItem   // 获取一个菜单元素的父菜单元素
Append(item *MenuItem) bool   // 将item添加到此项目的子菜单中,此菜单元素不是SubmenuType返回false
Prepend(item *MenuItem) bool  // 将item添加为此项目的子菜单第一项,此菜单元素不是SubmenuType类型返回false
Remove()    // 从此菜单的父菜单中删除此项
InsertAfter(item *MenuItem) bool  // 尝试将item作为子菜单项添加到此项之后,此项没有父菜单返回false
InsertBefore(item *MenuItem) bool // 尝试将item作为子菜单项添加到此项之前,此项没有父菜单返回false

type keys.Accelerator

用于绑定菜单元素的快捷键,在"github.com/wailsapp/wails/v2/pkg/menu/keys"包中定义

type Accelerator struct {
    Key       string
    Modifiers []Modifier
}

Key表示按键,多个按键使用加号(+)连接

Key字符串的解析过程

1、转化为小写
2、使用加号(+)将字符串分割为切片
3、使用循环解析每个切片元素
4、每个切片元素的长度除了已经定义的字符串外只能长度为1

已定义的按键字符串
"f1", "f2", ..., "f35"
"space", "tab", "delete", "backspace"
"return", "enter", "escape", "numlock"
"left", "right", "up", "down", "home", "end"
 "page up", "page down"
"plus"   //由于加号(+)有特殊意义,使用plus表示加号(+)按键

Modifier表示按键修饰符,有ctrl、alt、shift和win四个

type Modifier string

const (
    CmdOrCtrlKey   Modifier = "cmdorctrl"    // Mac上的Command或其他平台的ctrl
    OptionOrAltKey Modifier = "optionoralt"  // Mac上的Option或其他平台的alt
    ShiftKey       Modifier = "shift"        // shift
    // SuperKey    Modifier = "super"        // Mac上的Command或其他平台的win
                                             // 该常量源码中处于注释状态,不可用
    ControlKey     Modifier = "ctrl"         // ctrl
)

我们可以通过创建结构体示例的方式创建*keys.Accelerator,也可以通过已经定义的函数来创建

Key(key string) *Accelerator    // 没有修饰符
CmdOrCtrl(key string) *Accelerator
OptionOrAlt(key string) *Accelerator
Shift(key string) *Accelerator
Control(key string) *Accelerator
Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier) *Accelerator
    创建两个及两个以上修饰符的快捷键

// Super(key string) *Accelerator  // 源码中注释的方法


网址导航