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?"
103 lines
1.8 KiB
Go
103 lines
1.8 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.kirsle.net/apps/doodle/render"
|
|
)
|
|
|
|
// Window is a frame with a title bar.
|
|
type Window struct {
|
|
BaseWidget
|
|
Title string
|
|
Active bool
|
|
|
|
// Private widgets.
|
|
body *Frame
|
|
titleBar *Label
|
|
content *Frame
|
|
}
|
|
|
|
// NewWindow creates a new window.
|
|
func NewWindow(title string) *Window {
|
|
w := &Window{
|
|
Title: title,
|
|
body: NewFrame("body:" + title),
|
|
}
|
|
w.IDFunc(func() string {
|
|
return fmt.Sprintf("Window<%s>",
|
|
w.Title,
|
|
)
|
|
})
|
|
|
|
w.body.Configure(Config{
|
|
Background: render.Grey,
|
|
BorderSize: 2,
|
|
BorderStyle: BorderRaised,
|
|
})
|
|
|
|
// Title bar widget.
|
|
titleBar := NewLabel(Label{
|
|
TextVariable: &w.Title,
|
|
Font: render.Text{
|
|
Color: render.White,
|
|
Size: 10,
|
|
Stroke: render.DarkBlue,
|
|
Padding: 2,
|
|
},
|
|
})
|
|
titleBar.Configure(Config{
|
|
Background: render.Blue,
|
|
})
|
|
w.body.Pack(titleBar, Pack{
|
|
Anchor: N,
|
|
Fill: true,
|
|
})
|
|
w.titleBar = titleBar
|
|
|
|
// Window content frame.
|
|
content := NewFrame("content:" + title)
|
|
content.Configure(Config{
|
|
Background: render.Grey,
|
|
})
|
|
w.body.Pack(content, Pack{
|
|
Anchor: N,
|
|
Fill: true,
|
|
})
|
|
w.content = content
|
|
|
|
return w
|
|
}
|
|
|
|
// TitleBar returns the title bar widget.
|
|
func (w *Window) TitleBar() *Label {
|
|
return w.titleBar
|
|
}
|
|
|
|
// Configure the widget. Color and style changes are passed down to the inner
|
|
// content frame of the window.
|
|
func (w *Window) Configure(C Config) {
|
|
w.BaseWidget.Configure(C)
|
|
w.body.Configure(C)
|
|
}
|
|
|
|
// ConfigureTitle configures the title bar widget.
|
|
func (w *Window) ConfigureTitle(C Config) {
|
|
w.titleBar.Configure(C)
|
|
}
|
|
|
|
// Compute the window.
|
|
func (w *Window) Compute(e render.Engine) {
|
|
w.body.Compute(e)
|
|
}
|
|
|
|
// Present the window.
|
|
func (w *Window) Present(e render.Engine, P render.Point) {
|
|
w.body.Present(e, P)
|
|
}
|
|
|
|
// Pack a widget into the window's frame.
|
|
func (w *Window) Pack(child Widget, config ...Pack) {
|
|
w.content.Pack(child, config...)
|
|
}
|