diff --git a/internal/ui/inventory_select.go b/internal/ui/inventory_select.go new file mode 100644 index 0000000..4bdff11 --- /dev/null +++ b/internal/ui/inventory_select.go @@ -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") +} diff --git a/internal/ui/selectors.go b/internal/ui/selectors.go index 49baeaf..5fec20c 100644 --- a/internal/ui/selectors.go +++ b/internal/ui/selectors.go @@ -12,7 +12,6 @@ import ( func init() { registerBuilder(menus.TypeCheckbox, noChildren(registerCheckbox)) registerBuilder(menus.TypeSlider, noChildren(registerSlider)) - registerBuilder(menus.TypeInventorySelect, ownedByMenu) } // A checkbox can be a fancy button @@ -38,15 +37,6 @@ 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 @@ -96,37 +86,6 @@ func registerSlider(d *Driver, r *menus.Record) error { 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() { if c.value() == "1" { // Click disables c.setValue("0") @@ -295,17 +254,3 @@ 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") -}