package objects import "git.tebibyte.media/tomo/tomo" import "git.tebibyte.media/tomo/tomo/input" import "git.tebibyte.media/tomo/tomo/event" import "git.tebibyte.media/tomo/objects/layouts" var _ tomo.Object = new(MenuItem) // MenuItem is a selectable memu item. type MenuItem struct { box tomo.ContainerBox label *Label icon *Icon labelActive bool on struct { click event.FuncBroadcaster } } // NewMenuItem creates a new menu item with the specified text. func NewMenuItem (text string) *MenuItem { return NewIconMenuItem(tomo.IconUnknown, text) } // NewIconMenuItem creates a new menu item with the specified icon and text. func NewIconMenuItem (icon tomo.Icon, text string) *MenuItem { menuItem := &MenuItem { box: tomo.NewContainerBox(), label: NewLabel(text), icon: NewIcon(icon, tomo.IconSizeSmall), } menuItem.box.SetRole(tomo.R("objects", "MenuItem")) menuItem.label.SetAlign(tomo.AlignStart, tomo.AlignMiddle) menuItem.box.SetAttr(tomo.ALayout(layouts.Row { false, true })) menuItem.box.Add(menuItem.icon) menuItem.box.Add(menuItem.label) menuItem.box.SetInputMask(true) menuItem.box.OnMouseEnter(menuItem.handleMouseEnter) menuItem.box.OnMouseLeave(menuItem.handleMouseLeave) menuItem.box.OnButtonDown(menuItem.handleButtonDown) menuItem.box.OnButtonUp(menuItem.handleButtonUp) menuItem.box.OnKeyDown(menuItem.handleKeyDown) menuItem.box.OnKeyUp(menuItem.handleKeyUp) menuItem.box.SetFocusable(true) return menuItem } // GetBox returns the underlying box. func (this *MenuItem) GetBox () tomo.Box { return this.box } // SetFocused sets whether or not this menu item has keyboard focus. If set to // true, this method will steal focus away from whichever object currently has // focus. func (this *MenuItem) SetFocused (focused bool) { this.box.SetFocused(focused) } // SetText sets the text of the items's label. func (this *MenuItem) SetText (text string) { this.label.SetText(text) } // SetIcon sets an icon for this item. Setting the icon to IconUnknown will // remove it. func (this *MenuItem) SetIcon (id tomo.Icon) { this.icon.SetIcon(id, tomo.IconSizeSmall) } // OnClick specifies a function to be called when the menu item is clicked. func (this *MenuItem) OnClick (callback func ()) event.Cookie { return this.on.click.Connect(callback) } func (this *MenuItem) handleMouseEnter () { this.SetFocused(true) } func (this *MenuItem) handleMouseLeave () { this.SetFocused(false) } func (this *MenuItem) handleKeyDown (key input.Key, numberPad bool) bool { if key != input.KeyEnter && key != input.Key(' ') { return false } return true } func (this *MenuItem) handleKeyUp (key input.Key, numberPad bool) bool { if key != input.KeyEnter && key != input.Key(' ') { return false } this.on.click.Broadcast() return true } func (this *MenuItem) handleButtonDown (button input.Button) bool { if button != input.ButtonLeft { return false } return true } func (this *MenuItem) handleButtonUp (button input.Button) bool { if button != input.ButtonLeft { return false } if this.box.Window().MousePosition().In(this.box.Bounds()) { this.on.click.Broadcast() } return true }