We can reach the bridge \o/
This commit is contained in:
@@ -21,36 +21,35 @@ func init() {
|
||||
// FIXME: these need implementing
|
||||
|
||||
// Needed for Keyboard.mnu (main -> options -> keyboard)
|
||||
registerBuilder(menus.TypeLineKbd, nil)
|
||||
registerBuilder(menus.TypeDialogue, nil)
|
||||
registerBuilder(menus.TypeLineKbd, registerDebug("Unimplemented LineKbd", nil))
|
||||
registerBuilder(menus.TypeDialogue, registerDebug("Unimplemented Dialogue", nil))
|
||||
|
||||
// Needed for Arrange.mnu (???)
|
||||
registerBuilder(menus.TypeSquadButton, nil)
|
||||
registerBuilder(menus.TypeAnimationToo, nil)
|
||||
registerBuilder(menus.TypeSquadButton, registerDebug("Unimplemented SquadButton", nil))
|
||||
registerBuilder(menus.TypeAnimationToo, registerDebug("Unimplemented AnimationToo", nil))
|
||||
|
||||
// Needed for Bridge.mnu
|
||||
registerBuilder(menus.TypeDoorHotspot, nil)
|
||||
registerBuilder(menus.TypeDoorHotspot, registerDebug("Unimplemented DoorHotspot", nil))
|
||||
|
||||
// Needed for Briefing.mnu
|
||||
registerBuilder(menus.TypeLineBriefing, nil)
|
||||
registerBuilder(menus.TypeLineBriefing, registerDebug("Unimplemented LineBriefing", nil))
|
||||
|
||||
// Needed for ChaEquip.mnu
|
||||
registerBuilder(menus.TypeUnknown1, nil)
|
||||
registerBuilder(menus.TypeThumb, nil)
|
||||
registerBuilder(menus.TypeInventorySelect, nil)
|
||||
registerBuilder(menus.TypeUnknown1, registerDebug("Unimplemented Unknown1", nil))
|
||||
registerBuilder(menus.TypeThumb, registerDebug("Unimplemented Thumb", nil))
|
||||
|
||||
// Needed for MainGameChaos.mnu
|
||||
registerBuilder(menus.TypeStatusBar, nil)
|
||||
registerBuilder(menus.TypeStatusBar, registerDebug("Unimplemented StatusBar", nil))
|
||||
|
||||
// Needed for Multiplayer_Choose.mnu
|
||||
registerBuilder(menus.TypeComboBoxItem, nil)
|
||||
registerBuilder(menus.TypeDropdownButton, nil)
|
||||
registerBuilder(menus.TypeComboBoxItem, registerDebug("Unimplemented ComboBoxItem", nil))
|
||||
registerBuilder(menus.TypeDropdownButton, registerDebug("Unimplemented DropdownButton", nil))
|
||||
|
||||
// Needed for Multiplayer_Configure.mnu
|
||||
registerBuilder(menus.TypeEditBox, nil)
|
||||
registerBuilder(menus.TypeEditBox, registerDebug("Unimplemented EditBox", nil))
|
||||
|
||||
// Needed for Multiplayer_Connect.mnu
|
||||
registerBuilder(menus.TypeRadioButton, nil)
|
||||
registerBuilder(menus.TypeRadioButton, registerDebug("Unimplemented RadioButton", nil))
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -66,6 +65,19 @@ var (
|
||||
// Used to add widgets to a driver
|
||||
type builderFunc func(d *Driver, r *menus.Record) error
|
||||
|
||||
func registerDebug(reason string, onward builderFunc) builderFunc {
|
||||
return func(d *Driver, r *menus.Record) error {
|
||||
log.Printf("%v: %#+v", reason, r)
|
||||
if onward == nil {
|
||||
return registerStatic(d, r)
|
||||
} else {
|
||||
return onward(d, r)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func registerBuilder(t menus.MenuType, f builderFunc) {
|
||||
if _, ok := widgetBuilders[t]; ok {
|
||||
panic(fmt.Sprintf("A builder for menu type %v already exists", t))
|
||||
@@ -187,7 +199,6 @@ func (d *Driver) ConfigureSlider(id string, steps map[int]int) error {
|
||||
for _, clickable := range d.clickables {
|
||||
if slider, ok := clickable.(*slider); ok && slider.id() == id {
|
||||
slider.steps = steps
|
||||
log.Printf("Found slider %#+v", slider)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package ui
|
||||
|
||||
import (
|
||||
"image"
|
||||
"log"
|
||||
|
||||
"github.com/hajimehoshi/ebiten"
|
||||
"github.com/hajimehoshi/ebiten/ebitenutil"
|
||||
@@ -91,6 +92,8 @@ func registerOverlay(d *Driver, r *menus.Record) error {
|
||||
|
||||
ebitenutil.DebugPrint(textImg, r.Text)
|
||||
ni.textImg = textImg
|
||||
} else {
|
||||
log.Printf("Overlay without text detected: %#+v", r)
|
||||
}
|
||||
|
||||
d.paintables = append(d.paintables, ni)
|
||||
|
@@ -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")
|
||||
}
|
||||
|
Reference in New Issue
Block a user