Allow menu records to be processed hierarchically by the UI driver

Nothing is actually processed in this way yet, but there is a new
assertion forbidding certain types of records from having children.

Because of this new assertion, our menutype tweaks must be moved up a
layer into internal/menus. They fit better there anyway.
This commit is contained in:
2020-03-31 23:29:43 +01:00
parent 7586b90f8a
commit 2ae3611d7f
5 changed files with 61 additions and 34 deletions

View File

@@ -56,18 +56,26 @@ var (
)
// Used to add widgets to a driver
type builderFunc func(d *Driver, r *menus.Record) error
type builderFunc func(d *Driver, r *menus.Record) (children []*menus.Record, err error)
func registerDebug(reason string, onward builderFunc) builderFunc {
return func(d *Driver, r *menus.Record) error {
return func(d *Driver, r *menus.Record) ([]*menus.Record, error) {
log.Printf("%v: %#+v", reason, r)
if onward == nil {
return registerStatic(d, r)
} else {
return onward(d, r)
return r.Children, nil
}
return nil
return onward(d, r)
}
}
func noChildren(f func(d *Driver, r *menus.Record) error) builderFunc {
return func(d *Driver, r *menus.Record) ([]*menus.Record, error) {
if len(r.Children) > 0 {
return nil, fmt.Errorf("Children in record %v:%v (%#+v)", r.Menu.Name, r.Path(), r)
}
return nil, f(d, r)
}
}
@@ -132,7 +140,7 @@ func (d *Driver) Value(id string, into *string) error {
}
}
return fmt.Errorf("Couldn't find valueable widget %q", id)
return fmt.Errorf("Couldn't find valueable widget %v:%v", d.menu.Name, id)
}
func (d *Driver) SetValue(id, value string) error {
@@ -143,7 +151,7 @@ func (d *Driver) SetValue(id, value string) error {
}
}
return fmt.Errorf("Couldn't find valueable widget %q", id)
return fmt.Errorf("Couldn't find valueable widget %v:%v", d.menu.Name, id)
}
func (d *Driver) ValueBool(id string, into *bool) error {
@@ -173,7 +181,7 @@ func (d *Driver) SetFreeze(id string, value bool) error {
}
}
return fmt.Errorf("Couldn't find clickable widget %q", id)
return fmt.Errorf("Couldn't find clickable widget %v:%v", d.menu.Name, id)
}
func (d *Driver) OnClick(id string, f func()) error {
@@ -184,7 +192,7 @@ func (d *Driver) OnClick(id string, f func()) error {
}
}
return fmt.Errorf("Couldn't find clickable widget %q", id)
return fmt.Errorf("Couldn't find clickable widget %v:%v", d.menu.Name, id)
}
// FIXME: HURK. Surely I'm missing something? steps is value:offset
@@ -197,7 +205,7 @@ func (d *Driver) ConfigureSlider(id string, steps map[int]int) error {
}
}
return fmt.Errorf("Couldn't find slider %q", id)
return fmt.Errorf("Couldn't find slider %v:%v", d.menu.Name, id)
}
func (d *Driver) ValueInt(id string, into *int) error {
@@ -306,6 +314,7 @@ func (d *Driver) Draw(screen *ebiten.Image) error {
func (d *Driver) addRecord(record *menus.Record) error {
//log.Printf("Adding record: %#+v", record)
children := record.Children
handler, ok := widgetBuilders[record.Type]
if !ok {
@@ -313,13 +322,15 @@ func (d *Driver) addRecord(record *menus.Record) error {
}
if handler != nil {
if err := handler(d, record); err != nil {
var err error
children, err = handler(d, record)
if err != nil {
return err
}
}
// Recursively add all children of this record
for _, record := range record.Children {
// Recursively add all remaining children of this record
for _, record := range children {
if err := d.addRecord(record); err != nil {
return err
}