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:
@@ -7,20 +7,11 @@ import (
|
||||
"code.ur.gs/lupine/ordoor/internal/menus"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registerBuilder(menus.TypeSimpleButton, noChildren(registerSimpleButton))
|
||||
registerBuilder(menus.TypeInvokeButton, noChildren(registerInvokeButton))
|
||||
registerBuilder(menus.TypeMainButton, noChildren(registerMainButton))
|
||||
registerBuilder(menus.TypeDoorHotspot, noChildren(registerDoorHotspot))
|
||||
registerBuilder(menus.TypeDoorHotspot2, noChildren(registerDoorHotspot))
|
||||
registerBuilder(menus.TypeDoorHotspot3, noChildren(registerDoorHotspot))
|
||||
}
|
||||
|
||||
// A button without hover animation
|
||||
// FIXME: Keyboard.mnu has TypeSimpleButton instances that seem to include a
|
||||
// hover in the SpriteId field
|
||||
type button struct {
|
||||
path string
|
||||
locator string
|
||||
|
||||
baseSpr *assetstore.Sprite
|
||||
clickSpr *assetstore.Sprite
|
||||
@@ -38,95 +29,89 @@ type mainButton struct {
|
||||
button
|
||||
}
|
||||
|
||||
func registerSimpleButton(d *Driver, r *menus.Record) error {
|
||||
_, err := registerButton(d, r, r.SpriteId[0])
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func registerInvokeButton(d *Driver, r *menus.Record) error {
|
||||
_, err := registerButton(d, r, r.Share)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func registerMainButton(d *Driver, r *menus.Record) error {
|
||||
sprites, err := d.menu.Sprites(r.ObjectIdx, r.Share, 3) // base, pressed, disabled
|
||||
func (d *Driver) buildButton(p *menus.Properties) (*button, *Widget, error) {
|
||||
sprites, err := d.menu.Sprites(p.ObjectIdx, p.BaseSpriteID(), 3) // base, pressed, disabled
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
hovers, err := d.menu.Images(r.ObjectIdx, r.SpriteId[0], r.DrawType)
|
||||
btn := &button{
|
||||
locator: p.Locator,
|
||||
baseSpr: sprites[0],
|
||||
clickSpr: sprites[1],
|
||||
frozenSpr: sprites[2],
|
||||
hoverImpl: hoverImpl{text: p.Text},
|
||||
}
|
||||
|
||||
widget := &Widget{
|
||||
ownClickables: []clickable{btn},
|
||||
ownFreezables: []freezable{btn},
|
||||
ownHoverables: []hoverable{btn},
|
||||
ownPaintables: []paintable{btn},
|
||||
}
|
||||
|
||||
return btn, widget, nil
|
||||
}
|
||||
|
||||
func (d *Driver) buildMainButton(p *menus.Properties) (*mainButton, *Widget, error) {
|
||||
sprites, err := d.menu.Sprites(p.ObjectIdx, p.Share, 3) // base, pressed, disabled
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
hovers, err := d.menu.Images(p.ObjectIdx, p.SpriteId[0], p.DrawType)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
btn := &mainButton{
|
||||
hoverAnim: animation(hovers),
|
||||
button: button{
|
||||
path: r.Path(),
|
||||
locator: p.Locator,
|
||||
baseSpr: sprites[0],
|
||||
clickSpr: sprites[1],
|
||||
frozenSpr: sprites[2],
|
||||
hoverImpl: hoverImpl{text: r.Text},
|
||||
hoverImpl: hoverImpl{text: p.Text},
|
||||
},
|
||||
}
|
||||
|
||||
d.clickables = append(d.clickables, btn)
|
||||
d.freezables = append(d.freezables, btn)
|
||||
d.hoverables = append(d.hoverables, btn)
|
||||
d.paintables = append(d.paintables, btn)
|
||||
widget := &Widget{
|
||||
ownClickables: []clickable{btn},
|
||||
ownFreezables: []freezable{btn},
|
||||
ownHoverables: []hoverable{btn},
|
||||
ownPaintables: []paintable{btn},
|
||||
}
|
||||
|
||||
return nil
|
||||
return btn, widget, nil
|
||||
}
|
||||
|
||||
func registerDoorHotspot(d *Driver, r *menus.Record) error {
|
||||
sprites, err := d.menu.Sprites(r.ObjectIdx, r.Share, 2) // base, pressed
|
||||
func (d *Driver) buildDoorHotspot(p *menus.Properties) (*button, *Widget, error) {
|
||||
sprites, err := d.menu.Sprites(p.ObjectIdx, p.Share, 2) // base, pressed
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
btn := &button{
|
||||
path: r.Path(),
|
||||
locator: p.Locator,
|
||||
baseSpr: sprites[0],
|
||||
clickSpr: sprites[1],
|
||||
frozenSpr: sprites[0], // No disabled sprite
|
||||
hoverImpl: hoverImpl{text: r.Text},
|
||||
hoverImpl: hoverImpl{text: p.Text},
|
||||
}
|
||||
|
||||
d.clickables = append(d.clickables, btn)
|
||||
d.freezables = append(d.freezables, btn)
|
||||
d.hoverables = append(d.hoverables, btn)
|
||||
d.paintables = append(d.paintables, btn)
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func registerButton(d *Driver, r *menus.Record, spriteId int) (*button, error) {
|
||||
sprites, err := d.menu.Sprites(r.ObjectIdx, spriteId, 3) // base, pressed, disabled
|
||||
if err != nil {
|
||||
return nil, err
|
||||
widget := &Widget{
|
||||
ownClickables: []clickable{btn},
|
||||
ownFreezables: []freezable{btn},
|
||||
ownHoverables: []hoverable{btn},
|
||||
ownPaintables: []paintable{btn},
|
||||
}
|
||||
|
||||
btn := &button{
|
||||
path: r.Path(),
|
||||
baseSpr: sprites[0],
|
||||
clickSpr: sprites[1],
|
||||
frozenSpr: sprites[2],
|
||||
hoverImpl: hoverImpl{text: r.Text},
|
||||
}
|
||||
return btn, widget, nil
|
||||
|
||||
d.clickables = append(d.clickables, btn)
|
||||
d.freezables = append(d.freezables, btn)
|
||||
d.hoverables = append(d.hoverables, btn)
|
||||
d.paintables = append(d.paintables, btn)
|
||||
|
||||
return btn, nil
|
||||
}
|
||||
|
||||
func (b *button) id() string {
|
||||
return b.path
|
||||
return b.locator
|
||||
}
|
||||
|
||||
func (b *button) bounds() image.Rectangle {
|
||||
|
Reference in New Issue
Block a user