Move inventorySelect to its own file
This commit is contained in:
64
internal/ui/inventory_select.go
Normal file
64
internal/ui/inventory_select.go
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
package ui
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.ur.gs/lupine/ordoor/internal/menus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerBuilder(menus.TypeInventorySelect, ownedByMenu)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 registerInventorySelect(d *Driver, r *menus.Record) (*inventorySelect, error) {
|
||||||
|
sprites, err := d.menu.Sprites(r.Share, 3) // unchecked, checked, disabled
|
||||||
|
if err != nil {
|
||||||
|
return nil, 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)
|
||||||
|
|
||||||
|
return element, 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")
|
||||||
|
}
|
@@ -12,7 +12,6 @@ import (
|
|||||||
func init() {
|
func init() {
|
||||||
registerBuilder(menus.TypeCheckbox, noChildren(registerCheckbox))
|
registerBuilder(menus.TypeCheckbox, noChildren(registerCheckbox))
|
||||||
registerBuilder(menus.TypeSlider, noChildren(registerSlider))
|
registerBuilder(menus.TypeSlider, noChildren(registerSlider))
|
||||||
registerBuilder(menus.TypeInventorySelect, ownedByMenu)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// A checkbox can be a fancy button
|
// A checkbox can be a fancy button
|
||||||
@@ -38,15 +37,6 @@ type slider struct {
|
|||||||
valueImpl
|
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.
|
// A checkbox has 3 sprites, and 3 states: unchecked, checked, disabled.
|
||||||
func registerCheckbox(d *Driver, r *menus.Record) error {
|
func registerCheckbox(d *Driver, r *menus.Record) error {
|
||||||
sprites, err := d.menu.Sprites(r.Share, 3) // unchecked, disabled, checked
|
sprites, err := d.menu.Sprites(r.Share, 3) // unchecked, disabled, checked
|
||||||
@@ -96,37 +86,6 @@ func registerSlider(d *Driver, r *menus.Record) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called from the menu, which fills "others"
|
|
||||||
// TODO: make this a single call? A single component with multiple choices?
|
|
||||||
func registerInventorySelect(d *Driver, r *menus.Record) (*inventorySelect, error) {
|
|
||||||
sprites, err := d.menu.Sprites(r.Share, 3) // unchecked, checked, disabled
|
|
||||||
if err != nil {
|
|
||||||
return nil, 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)
|
|
||||||
|
|
||||||
return element, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *checkbox) registerMouseClick() {
|
func (c *checkbox) registerMouseClick() {
|
||||||
if c.value() == "1" { // Click disables
|
if c.value() == "1" { // Click disables
|
||||||
c.setValue("0")
|
c.setValue("0")
|
||||||
@@ -295,17 +254,3 @@ func (s *slider) valueInt() int {
|
|||||||
func (s *slider) value() string {
|
func (s *slider) value() string {
|
||||||
return strconv.Itoa(s.valueInt())
|
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")
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user