Added support for the menu API
This commit is contained in:
parent
2dde2a79e7
commit
d0dea7122b
|
@ -0,0 +1,129 @@
|
||||||
|
package ui
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// #include "ui.h"
|
||||||
|
// extern void doMenuItemOnClicked(uiMenuItem *, uiWindow *, void *);
|
||||||
|
// static inline void realuiMenuItemOnClicked(uiMenuItem *i)
|
||||||
|
// {
|
||||||
|
// uiMenuItemOnClicked(i, doMenuItemOnClicked, NULL);
|
||||||
|
// }
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
var menuItems = make(map[*C.uiMenuItem]*MenuItem)
|
||||||
|
|
||||||
|
// Menu represents a menu on the menu bar located at the top
|
||||||
|
// of a Window. Currently, every window has the same menu bar
|
||||||
|
// and thus the same menus and menu items.
|
||||||
|
type Menu struct {
|
||||||
|
m *C.uiMenu
|
||||||
|
}
|
||||||
|
|
||||||
|
// MenuItem represents an item in a Menu.
|
||||||
|
type MenuItem struct {
|
||||||
|
i *C.uiMenuItem
|
||||||
|
|
||||||
|
onClicked func(*MenuItem, *Window)
|
||||||
|
onClickedAllowed bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMenu creates a new Menu.
|
||||||
|
func NewMenu(name string) *Menu {
|
||||||
|
m := new(Menu)
|
||||||
|
|
||||||
|
cname := C.CString(name)
|
||||||
|
m.m = C.uiNewMenu(cname)
|
||||||
|
freestr(cname)
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendSeparator appends a separator to the Menu.
|
||||||
|
func (m *Menu) AppendSeparator() {
|
||||||
|
C.uiMenuAppendSeparator(m.m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendItem appends a new item to the Menu.
|
||||||
|
func (m *Menu) AppendItem(name string) *MenuItem {
|
||||||
|
cname := C.CString(name)
|
||||||
|
i := C.uiMenuAppendItem(m.m, cname)
|
||||||
|
freestr(cname)
|
||||||
|
|
||||||
|
return newMenuItem(i, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendCheckItem appends a check item to the Menu.
|
||||||
|
func (m *Menu) AppendCheckItem(name string) *MenuItem {
|
||||||
|
cname := C.CString(name)
|
||||||
|
i := C.uiMenuAppendCheckItem(m.m, cname)
|
||||||
|
freestr(cname)
|
||||||
|
|
||||||
|
return newMenuItem(i, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendQuitItem appends a quit item to the Menu.
|
||||||
|
func (m *Menu) AppendQuitItem() *MenuItem {
|
||||||
|
i := C.uiMenuAppendQuitItem(m.m)
|
||||||
|
return newMenuItem(i, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendPreferencesItem appends a preferences item to the Menu.
|
||||||
|
func (m *Menu) AppendPreferencesItem() *MenuItem {
|
||||||
|
i := C.uiMenuAppendPreferencesItem(m.m)
|
||||||
|
return newMenuItem(i, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendAboutItem appends an about item to the Menu.
|
||||||
|
func (m *Menu) AppendAboutItem() *MenuItem {
|
||||||
|
i := C.uiMenuAppendAboutItem(m.m)
|
||||||
|
return newMenuItem(i, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable enables the MenuItem.
|
||||||
|
func (i *MenuItem) Enable() {
|
||||||
|
C.uiMenuItemEnable(i.i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable disables the MenuItem.
|
||||||
|
func (i *MenuItem) Disable() {
|
||||||
|
C.uiMenuItemDisable(i.i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checked returns the check status of a menu item.
|
||||||
|
func (i *MenuItem) Checked() bool {
|
||||||
|
return tobool(C.uiMenuItemChecked(i.i))
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetChecked sets the check status of a menu item.
|
||||||
|
func (i *MenuItem) SetChecked(checked bool) {
|
||||||
|
C.uiMenuItemSetChecked(i.i, frombool(checked))
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnClicked registers f to be run when the user clicks the MenuItem.
|
||||||
|
// Only one function can be registered at a time.
|
||||||
|
func (i *MenuItem) OnClicked(f func(*MenuItem, *Window)) {
|
||||||
|
i.onClicked = f
|
||||||
|
}
|
||||||
|
|
||||||
|
//export doMenuItemOnClicked
|
||||||
|
func doMenuItemOnClicked(i *C.uiMenuItem, w *C.uiWindow, data unsafe.Pointer) {
|
||||||
|
ii := menuItems[i]
|
||||||
|
ww := windows[w]
|
||||||
|
|
||||||
|
if ii.onClicked != nil {
|
||||||
|
ii.onClicked(ii, ww)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMenuItem(i *C.uiMenuItem, onClickedAllowed bool) *MenuItem {
|
||||||
|
if onClickedAllowed {
|
||||||
|
C.realuiMenuItemOnClicked(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := &MenuItem{i: i, onClickedAllowed: onClickedAllowed}
|
||||||
|
menuItems[i] = result
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
Loading…
Reference in New Issue