Noah Petherbridge
316456ef03
CheckButton is a generic component based on Button that additionally takes a *bool variable to manage. When the CheckButton is clicked or unclicked, it will toggle the bool var and its border style will "stick" in or out depending on the state. Checkbox is a Frame widget that wraps a CheckButton and another child widget, such as a Label. Interacting with the child widget will forward all of its mouse events to the CheckButton, so that the Label could be clicked instead of just the box itself.
47 lines
947 B
Go
47 lines
947 B
Go
package ui
|
|
|
|
import "git.kirsle.net/apps/doodle/render"
|
|
|
|
// Checkbox combines a CheckButton with a widget like a Label.
|
|
type Checkbox struct {
|
|
Frame
|
|
button *CheckButton
|
|
child Widget
|
|
}
|
|
|
|
// NewCheckbox creates a new Checkbox.
|
|
func NewCheckbox(name string, boolVar *bool, child Widget) *Checkbox {
|
|
// Our custom checkbutton widget.
|
|
mark := NewFrame(name + "_mark")
|
|
|
|
w := &Checkbox{
|
|
button: NewCheckButton(name+"_button", boolVar, mark),
|
|
child: child,
|
|
}
|
|
w.Frame.Setup()
|
|
|
|
// Forward clicks on the child widget to the CheckButton.
|
|
for _, e := range []string{"MouseOver", "MouseOut", "MouseUp", "MouseDown"} {
|
|
func(e string) {
|
|
w.child.Handle(e, func(p render.Point) {
|
|
w.button.Event(e, p)
|
|
})
|
|
}(e)
|
|
}
|
|
|
|
w.Pack(w.button, Pack{
|
|
Anchor: W,
|
|
})
|
|
w.Pack(w.child, Pack{
|
|
Anchor: W,
|
|
})
|
|
|
|
return w
|
|
}
|
|
|
|
// Supervise the checkbutton inside the widget.
|
|
func (w *Checkbox) Supervise(s *Supervisor) {
|
|
s.Add(w.button)
|
|
s.Add(w.child)
|
|
}
|