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:
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user