Allow dialogues to be hidden or shown
To do this, MENU and SUBMENU are split into two types (at last), and a Widget type is introduced. This should allow lots of code to be removed at some point.
This commit is contained in:
@@ -9,11 +9,6 @@ import (
|
||||
"code.ur.gs/lupine/ordoor/internal/menus"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registerBuilder(menus.TypeCheckbox, noChildren(registerCheckbox))
|
||||
registerBuilder(menus.TypeSlider, noChildren(registerSlider))
|
||||
}
|
||||
|
||||
// A checkbox can be a fancy button
|
||||
type checkbox struct {
|
||||
button
|
||||
@@ -23,7 +18,7 @@ type checkbox struct {
|
||||
|
||||
// A slider is harder. Two separate elements to render
|
||||
type slider struct {
|
||||
path string
|
||||
locator string
|
||||
|
||||
baseSpr *assetstore.Sprite
|
||||
clickSpr *assetstore.Sprite
|
||||
@@ -38,52 +33,56 @@ type slider struct {
|
||||
}
|
||||
|
||||
// A checkbox has 3 sprites, and 3 states: unchecked, checked, disabled.
|
||||
func registerCheckbox(d *Driver, r *menus.Record) error {
|
||||
sprites, err := d.menu.Sprites(r.ObjectIdx, r.Share, 3) // unchecked, disabled, checked
|
||||
func (d *Driver) buildCheckbox(p *menus.Properties) (*checkbox, *Widget, error) {
|
||||
sprites, err := d.menu.Sprites(p.ObjectIdx, p.Share, 3) // unchecked, disabled, checked
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
checkbox := &checkbox{
|
||||
button: button{
|
||||
path: r.Path(),
|
||||
locator: p.Locator,
|
||||
baseSpr: sprites[0], // unchecked
|
||||
clickSpr: sprites[2], // checked
|
||||
frozenSpr: sprites[1],
|
||||
hoverImpl: hoverImpl{text: r.Text},
|
||||
frozenSpr: sprites[1], // disabled
|
||||
hoverImpl: hoverImpl{text: p.Text},
|
||||
},
|
||||
valueImpl: valueImpl{str: "0"},
|
||||
}
|
||||
|
||||
d.clickables = append(d.clickables, checkbox)
|
||||
d.freezables = append(d.freezables, checkbox)
|
||||
d.hoverables = append(d.hoverables, checkbox)
|
||||
d.paintables = append(d.paintables, checkbox)
|
||||
d.valueables = append(d.valueables, checkbox)
|
||||
widget := &Widget{
|
||||
ownClickables: []clickable{checkbox},
|
||||
ownFreezables: []freezable{checkbox},
|
||||
ownHoverables: []hoverable{checkbox},
|
||||
ownPaintables: []paintable{checkbox},
|
||||
ownValueables: []valueable{checkbox},
|
||||
}
|
||||
|
||||
return nil
|
||||
return checkbox, widget, nil
|
||||
}
|
||||
|
||||
func registerSlider(d *Driver, r *menus.Record) error {
|
||||
sprites, err := d.menu.Sprites(r.ObjectIdx, r.Share, 3) // base, clicked, slider element
|
||||
func (d *Driver) buildSlider(p *menus.Properties) (*slider, *Widget, error) {
|
||||
sprites, err := d.menu.Sprites(p.ObjectIdx, p.Share, 3) // base, clicked, slider element
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
slider := &slider{
|
||||
path: r.Path(),
|
||||
locator: p.Locator,
|
||||
baseSpr: sprites[0],
|
||||
clickSpr: sprites[1],
|
||||
sliderSpr: sprites[2],
|
||||
hv: sprites[0].Rect.Dy() > sprites[0].Rect.Dx(), // A best guess
|
||||
}
|
||||
|
||||
d.clickables = append(d.clickables, slider)
|
||||
d.mouseables = append(d.mouseables, slider)
|
||||
d.paintables = append(d.paintables, slider)
|
||||
d.valueables = append(d.valueables, slider)
|
||||
widget := &Widget{
|
||||
ownClickables: []clickable{slider},
|
||||
ownMouseables: []mouseable{slider},
|
||||
ownPaintables: []paintable{slider},
|
||||
ownValueables: []valueable{slider},
|
||||
}
|
||||
|
||||
return nil
|
||||
return slider, widget, nil
|
||||
}
|
||||
|
||||
func (c *checkbox) registerMouseClick() {
|
||||
@@ -107,7 +106,7 @@ func (c *checkbox) regions(tick int) []region {
|
||||
}
|
||||
|
||||
func (s *slider) id() string {
|
||||
return s.path
|
||||
return s.locator
|
||||
}
|
||||
|
||||
// The bounds of the slider are the whole thing
|
||||
|
Reference in New Issue
Block a user