53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package ui
|
|
|
|
import (
|
|
"code.ur.gs/lupine/ordoor/internal/menus"
|
|
)
|
|
|
|
// 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.
|
|
//
|
|
// TODO: wrap all the behaviour in a single struct to make it easier to drive
|
|
type inventorySelect struct {
|
|
checkbox
|
|
|
|
parentPath string
|
|
others []*inventorySelect
|
|
}
|
|
|
|
// Called from the menu, which fills "others" for us
|
|
func (d *Driver) buildInventorySelect(p *menus.Properties) (*inventorySelect, *Widget, error) {
|
|
c, _, err := d.buildCheckbox(p)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// In an inventorySelect, the frozen and click sprites are reversed
|
|
c.clickSpr, c.frozenSpr = c.frozenSpr, c.clickSpr
|
|
|
|
element := &inventorySelect{checkbox: *c}
|
|
widget := &Widget{
|
|
ownClickables: []clickable{element},
|
|
ownFreezables: []freezable{element},
|
|
ownHoverables: []hoverable{element},
|
|
ownPaintables: []paintable{element},
|
|
ownValueables: []valueable{element},
|
|
}
|
|
|
|
return element, widget, nil
|
|
}
|
|
|
|
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")
|
|
}
|