Noah Petherbridge
e1cbff8c3f
* Add ui.Window to easily create reusable windows with titles. * Add a palette window (panel) to the right edge of the Edit Mode. * Has Radio Buttons listing the colors available in the palette. * Add palette support to Edit Mode so when you draw pixels, they take on the color and attributes of the currently selected Swatch in your palette. * Revise the on-disk format to better serialize the Palette object to JSON. * Break Play Mode: collision detection fails because the Grid key elements are now full Pixel objects (which retain their Palette and Swatch properties). * The Grid will need to be re-worked to separate X,Y coordinates from the Pixel metadata to just test "is something there, and what is it?"
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
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 {
|
|
return makeCheckbox(name, boolVar, nil, "", child)
|
|
}
|
|
|
|
// NewRadiobox creates a new Checkbox in radio mode.
|
|
func NewRadiobox(name string, stringVar *string, value string, child Widget) *Checkbox {
|
|
return makeCheckbox(name, nil, stringVar, value, child)
|
|
}
|
|
|
|
// makeCheckbox constructs an appropriate type of checkbox.
|
|
func makeCheckbox(name string, boolVar *bool, stringVar *string, value string, child Widget) *Checkbox {
|
|
// Our custom checkbutton widget.
|
|
mark := NewFrame(name + "_mark")
|
|
|
|
w := &Checkbox{
|
|
child: child,
|
|
}
|
|
if boolVar != nil {
|
|
w.button = NewCheckButton(name+"_button", boolVar, mark)
|
|
} else if stringVar != nil {
|
|
w.button = NewRadioButton(name+"_button", stringVar, value, mark)
|
|
}
|
|
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
|
|
}
|
|
|
|
// Child returns the child widget.
|
|
func (w *Checkbox) Child() Widget {
|
|
return w.child
|
|
}
|
|
|
|
// Supervise the checkbutton inside the widget.
|
|
func (w *Checkbox) Supervise(s *Supervisor) {
|
|
s.Add(w.button)
|
|
s.Add(w.child)
|
|
}
|