We can reach the bridge \o/

This commit is contained in:
2020-03-26 23:35:34 +00:00
parent e4ce932324
commit 79bfab7d6b
9 changed files with 230 additions and 69 deletions

View File

@@ -12,6 +12,7 @@ import (
func init() {
registerBuilder(menus.TypeCheckbox, registerCheckbox)
registerBuilder(menus.TypeSlider, registerSlider)
registerBuilder(menus.TypeInventorySelect, registerInventorySelect)
}
// A checkbox can be a fancy button
@@ -37,6 +38,15 @@ type slider struct {
valueImpl
}
// An inventory select is a sort of radio button. If 2 share the same menu,
// selecting one deselects the other. Otherwise, they act like checkboxes
type inventorySelect struct {
checkbox
parentPath string
others []*inventorySelect
}
// 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.Share, 3) // unchecked, disabled, checked
@@ -86,6 +96,60 @@ func registerSlider(d *Driver, r *menus.Record) error {
return nil
}
func registerInventorySelect(d *Driver, r *menus.Record) error {
sprites, err := d.menu.Sprites(r.Share, 3) // unchecked, checked, disabled
if err != nil {
return err
}
element := &inventorySelect{
checkbox: checkbox{
button: button{
path: r.Path(),
baseSpr: sprites[0], // unchecked
clickSpr: sprites[1], // checked
frozenSpr: sprites[2], // disabled
hoverImpl: hoverImpl{text: r.Text},
},
valueImpl: valueImpl{str: "0"},
},
}
d.clickables = append(d.clickables, element)
d.freezables = append(d.freezables, element)
d.hoverables = append(d.hoverables, element)
d.paintables = append(d.paintables, element)
d.valueables = append(d.valueables, element)
if r.Parent == nil {
return nil
}
element.parentPath = r.Parent.Path()
// Now update all inventory selects belonging to the same menu so they share
// a list of all inventory selects. This will be replaced several times as
// the menu is built.
var inventorySelects []*inventorySelect
for _, valueable := range d.valueables {
if is, ok := valueable.(*inventorySelect); ok && is.parentPath == element.parentPath {
inventorySelects = append(inventorySelects, is)
}
}
for _, is := range inventorySelects {
is.others = inventorySelects
}
// Select the first in the list
if len(inventorySelects) == 1 {
element.setValue("1")
}
return nil
}
func (c *checkbox) registerMouseClick() {
if c.value() == "1" { // Click disables
c.setValue("0")
@@ -254,3 +318,17 @@ func (s *slider) valueInt() int {
func (s *slider) value() string {
return strconv.Itoa(s.valueInt())
}
func (i *inventorySelect) registerMouseClick() {
// Do nothing if we're already selected
if i.value() == "1" {
return
}
// Turn us on, turn everyone else off
for _, other := range i.others {
other.setValue("0")
}
i.setValue("1")
}