From ba7c06e5fd3b4e55fe57a2c0211b0d9e4f4bc677 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Sun, 22 Mar 2020 15:37:48 +0000 Subject: [PATCH] Show tooltips when hovering --- cmd/view-menu/main.go | 8 -------- internal/assetstore/assetstore.go | 14 +++++++++----- internal/assetstore/i18n.go | 29 +++++++++++++++++++++++++++++ internal/assetstore/menu.go | 7 +++++++ internal/ui/interface.go | 15 +++++++++++---- internal/ui/widget.go | 4 ++-- 6 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 internal/assetstore/i18n.go diff --git a/cmd/view-menu/main.go b/cmd/view-menu/main.go index ccb0850..f459efa 100644 --- a/cmd/view-menu/main.go +++ b/cmd/view-menu/main.go @@ -47,18 +47,10 @@ func main() { log.Fatalf("Couldn't load menu %s: %v", *menuName, err) } - /* TODO: move i18n, fonts into assetstore - if i18n, err := data.LoadI18n(filepath.Join(*gamePath, "Data", data.I18nFile)); err != nil { - log.Printf("Failed to load i18n data, skipping internationalization: %v", err) - } else { - menu.Internationalize(i18n) - } - // loadedFonts, err := loadFonts(menu.FontNames...) // if err != nil { // log.Fatalf("Failed to load font: %v", err) // } - */ iface, err := ui.NewInterface(menu) if err != nil { diff --git a/internal/assetstore/assetstore.go b/internal/assetstore/assetstore.go index ac512e3..775d8ca 100644 --- a/internal/assetstore/assetstore.go +++ b/internal/assetstore/assetstore.go @@ -6,6 +6,8 @@ import ( "os" "path/filepath" "strings" + + "code.ur.gs/lupine/ordoor/internal/data" ) const ( @@ -32,11 +34,12 @@ type AssetStore struct { entries entryMap // These members are used to store things we've already loaded - maps map[string]*Map - menus map[string]*Menu - objs map[string]*Object - sets map[string]*Set - sounds map[string]*Sound + maps map[string]*Map + menus map[string]*Menu + objs map[string]*Object + sets map[string]*Set + sounds map[string]*Sound + strings *data.I18n } // New returns a new AssetStore @@ -86,6 +89,7 @@ func (a *AssetStore) Refresh() error { a.objs = make(map[string]*Object) a.sets = make(map[string]*Set) a.sounds = make(map[string]*Sound) + a.strings = nil return nil } diff --git a/internal/assetstore/i18n.go b/internal/assetstore/i18n.go new file mode 100644 index 0000000..2a3b960 --- /dev/null +++ b/internal/assetstore/i18n.go @@ -0,0 +1,29 @@ +package assetstore + +import ( + "code.ur.gs/lupine/ordoor/internal/data" +) + +// Internationalisation is completely hidden inside the asset store. Everything +// comes out already converted. +// +// FIXME: Allow the language to be set. Right now, it's hardcoded to USEng +// because that's the only copy of Chaos Gate I have. +func (a *AssetStore) i18n() (*data.I18n, error) { + if a.strings != nil { + return a.strings, nil + } + + filename, err := a.lookup(data.I18nFile, "", "Data") + if err != nil { + return nil, err + } + + i18n, err := data.LoadI18n(filename) + if err != nil { + return nil, err + } + + a.strings = i18n + return i18n, nil +} diff --git a/internal/assetstore/menu.go b/internal/assetstore/menu.go index 388a5fe..fb6e608 100644 --- a/internal/assetstore/menu.go +++ b/internal/assetstore/menu.go @@ -54,6 +54,13 @@ func (a *AssetStore) Menu(name string) (*Menu, error) { return nil, err } + i18n, err := a.i18n() + if err != nil { + return nil, err + } + + raw.Internationalize(i18n) + obj, err := a.loadMenuObject(raw) // TODO: multiple objects if err != nil { return nil, err diff --git a/internal/ui/interface.go b/internal/ui/interface.go index b56cf57..ddb692a 100644 --- a/internal/ui/interface.go +++ b/internal/ui/interface.go @@ -6,6 +6,7 @@ import ( "reflect" // For DeepEqual "github.com/hajimehoshi/ebiten" + "github.com/hajimehoshi/ebiten/ebitenutil" "code.ur.gs/lupine/ordoor/internal/assetstore" "code.ur.gs/lupine/ordoor/internal/menus" @@ -93,6 +94,11 @@ func (i *Interface) Draw(screen *ebiten.Image) error { return err } do.GeoM = geo + + if widget.hoverState && widget.Tooltip != "" { + mouseX, mouseY := ebiten.CursorPosition() + ebitenutil.DebugPrintAt(screen, widget.Tooltip, mouseX+16, mouseY-16) + } } return nil @@ -167,10 +173,11 @@ func (i *Interface) widgetFromRecord(record *menus.Record) (*Widget, error) { } widget := &Widget{ - Bounds: sprite.Rect, - path: path, - record: record, - sprite: sprite, + Bounds: sprite.Rect, + Tooltip: record.Desc, + path: path, + record: record, + sprite: sprite, } switch record.Type { diff --git a/internal/ui/widget.go b/internal/ui/widget.go index 397689d..e0e7f39 100644 --- a/internal/ui/widget.go +++ b/internal/ui/widget.go @@ -13,8 +13,8 @@ import ( // non-interactive areas are not widgets. type Widget struct { // Position on the screen in original (i.e., unscaled) coordinates - Bounds image.Rectangle - // Tooltip string // TODO: show the tooltip when hovering? + Bounds image.Rectangle + Tooltip string OnHoverEnter func() OnHoverLeave func()