Implement the options menu, part 1
This commit implements loading and saving options from/to config, and enough UI toolkit magic to allow changes to boolean options to be persisted. We now respect the "play movies" setting and take screen resolution from the config file.
This commit is contained in:
@@ -3,6 +3,7 @@ package ui
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
"log"
|
||||
"reflect" // For DeepEqual
|
||||
|
||||
"github.com/hajimehoshi/ebiten"
|
||||
@@ -30,7 +31,6 @@ type Interface struct {
|
||||
func NewInterface(menu *assetstore.Menu) (*Interface, error) {
|
||||
iface := &Interface{
|
||||
Name: menu.Name,
|
||||
|
||||
menu: menu,
|
||||
}
|
||||
|
||||
@@ -112,25 +112,19 @@ func (i *Interface) Draw(screen *ebiten.Image) error {
|
||||
}
|
||||
|
||||
func (i *Interface) addRecord(record *menus.Record) error {
|
||||
switch record.Type {
|
||||
case menus.TypeStatic: // These are static
|
||||
if sprite, err := i.menu.Sprite(record.SpriteId[0]); err != nil {
|
||||
return err
|
||||
} else {
|
||||
i.static = append(i.static, sprite)
|
||||
}
|
||||
case menus.TypeMenu: // These aren't drawable and can be ignored
|
||||
case menus.TypeOverlay, menus.TypeMainButton: // Widgets \o/
|
||||
if widget, err := i.widgetFromRecord(record); err != nil {
|
||||
return err
|
||||
} else {
|
||||
i.widgets = append(i.widgets, widget)
|
||||
}
|
||||
log.Printf("Adding record: %#+v", record)
|
||||
|
||||
default:
|
||||
handler, ok := setupHandlers[record.Type]
|
||||
if !ok {
|
||||
return fmt.Errorf("ui.interface: encountered unknown menu record: %#+v", record)
|
||||
}
|
||||
|
||||
if handler != nil {
|
||||
if err := handler(i, record); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Recursively add all children
|
||||
for _, record := range record.Children {
|
||||
if err := i.addRecord(record); err != nil {
|
||||
@@ -166,47 +160,3 @@ func (i *Interface) getMousePos(w, h int) image.Point {
|
||||
|
||||
return image.Pt(int(sX), int(sY))
|
||||
}
|
||||
|
||||
func (i *Interface) widgetFromRecord(record *menus.Record) (*Widget, error) {
|
||||
// FIXME: we assume that all widgets have a share sprite, but is that true?
|
||||
sprite, err := i.menu.Sprite(record.Share)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var path []int
|
||||
for r := record; r != nil; r = r.Parent {
|
||||
path = append([]int{r.Id}, path...)
|
||||
}
|
||||
|
||||
widget := &Widget{
|
||||
Bounds: sprite.Rect,
|
||||
Tooltip: record.Desc,
|
||||
path: path,
|
||||
record: record,
|
||||
sprite: sprite,
|
||||
}
|
||||
|
||||
switch record.Type {
|
||||
case menus.TypeMainButton:
|
||||
hovers, err := i.menu.Images(record.SpriteId[0], record.DrawType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
widget.hoverAnimation = hovers
|
||||
|
||||
pressed, err := i.menu.Sprite(record.Share + 1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
widget.mouseButtonDownImage = pressed.Image
|
||||
|
||||
disabled, err := i.menu.Sprite(record.Share + 2)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
widget.disabledImage = disabled.Image
|
||||
}
|
||||
|
||||
return widget, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user