package objects import "git.tebibyte.media/tomo/tomo" import "git.tebibyte.media/tomo/tomo/input" import "git.tebibyte.media/tomo/tomo/event" var _ tomo.Object = new(Checkbox) // Checkbox is a control that can be toggled. // // Tags: // - [checked] The checkbox's value is true. // - [unchecked] The checkbox's value is false. type Checkbox struct { box tomo.Box value bool on struct { valueChange event.FuncBroadcaster } } // NewCheckbox creates a new checkbox with the specified value. func NewCheckbox (value bool) *Checkbox { checkbox := &Checkbox { box: tomo.NewBox(), } checkbox.box.SetRole(tomo.R("objects", "Checkbox")) checkbox.SetValue(value) checkbox.box.OnButtonDown(checkbox.handleButtonDown) checkbox.box.OnButtonUp(checkbox.handleButtonUp) checkbox.box.OnKeyDown(checkbox.handleKeyDown) checkbox.box.OnKeyUp(checkbox.handleKeyUp) checkbox.box.SetFocusable(true) return checkbox } // GetBox returns the underlying box. func (this *Checkbox) GetBox () tomo.Box { return this.box } // SetFocused sets whether or not this checkbox has keyboard focus. If set to // true, this method will steal focus away from whichever object currently has // focus. func (this *Checkbox) SetFocused (focused bool) { this.box.SetFocused(focused) } // Value returns the value of the checkbox. func (this *Checkbox) Value () bool { return this.value } // SetValue sets the value of the checkbox. func (this *Checkbox) SetValue (value bool) { this.value = value // the theme shall decide what checked and unchecked states look like this.box.SetTag("checked", value) this.box.SetTag("unchecked", !value) } // Toggle toggles the value of the checkbox between true and false. func (this *Checkbox) Toggle () { this.SetValue(!this.Value()) } // OnValueChange specifies a function to be called when the user checks or // unchecks the checkbox. func (this *Checkbox) OnValueChange (callback func ()) event.Cookie { return this.on.valueChange.Connect(callback) } func (this *Checkbox) handleKeyDown (key input.Key, numberPad bool) bool { if !isClickingKey(key) { return false } this.Toggle() return true } func (this *Checkbox) handleKeyUp (key input.Key, numberPad bool) bool { if !isClickingKey(key) { return false} return true } func (this *Checkbox) handleButtonDown (button input.Button) bool { if !isClickingButton(button) { return false } return true } func (this *Checkbox) handleButtonUp (button input.Button) bool { if !isClickingButton(button) { return false } if this.box.Window().MousePosition().In(this.box.Bounds()) { this.Toggle() } return true }