krampus19/alui/fonts.go
Sander Schobers 0cd5cb4ad1 Added simple main menu.
Refactored some structs from public to internal.
Separated navigation from game.
Added utility methods for drawing text.
Stackpanel will uses all available width when layouting.
2019-12-24 01:27:05 +01:00

94 lines
2.4 KiB
Go

package alui
import (
"opslag.de/schobers/allg5"
"opslag.de/schobers/geom"
)
type Fonts struct {
fonts map[string]*allg5.Font
}
type FontDescription struct {
Path string
Size int
Name string
}
func NewFonts() *Fonts {
return &Fonts{map[string]*allg5.Font{}}
}
func (f *Fonts) Destroy() {
for _, font := range f.fonts {
font.Destroy()
}
f.fonts = nil
}
func (f *Fonts) Draw(font string, left, top float32, color allg5.Color, text string) {
f.DrawFont(f.Get(font), left, top, color, text)
}
func (f *Fonts) DrawAlign(font string, left, top, right float32, color allg5.Color, align allg5.HorizontalAlignment, text string) {
f.DrawAlignFont(f.Get(font), left, top, right, color, align, text)
}
func (f *Fonts) DrawAlignFont(font *allg5.Font, left, top, right float32, color allg5.Color, align allg5.HorizontalAlignment, text string) {
switch align {
case allg5.AlignCenter:
center, top := geom.Round32(.5*(left+right)), geom.Round32(top)
font.Draw(center, top, color, allg5.AlignCenter, text)
case allg5.AlignRight:
right, top = geom.Round32(right), geom.Round32(top)
font.Draw(right, top, color, allg5.AlignRight, text)
default:
left, top = geom.Round32(left), geom.Round32(top)
font.Draw(left, top, color, allg5.AlignRight, text)
}
}
func (f *Fonts) DrawCenter(font string, center, top float32, color allg5.Color, text string) {
f.DrawCenterFont(f.Get(font), center, top, color, text)
}
func (f *Fonts) DrawCenterFont(font *allg5.Font, center, top float32, color allg5.Color, text string) {
f.DrawAlignFont(font, center, top, center, color, allg5.AlignCenter, text)
}
func (f *Fonts) DrawFont(font *allg5.Font, left, top float32, color allg5.Color, text string) {
left, top = geom.Round32(left), geom.Round32(top)
font.Draw(left, top, color, allg5.AlignLeft, text)
}
func (f *Fonts) Len() int { return len(f.fonts) }
func (f *Fonts) Load(path string, size int, name string) error {
font, err := allg5.LoadTTFFont(path, size)
if err != nil {
return err
}
if old := f.fonts[name]; old != nil {
old.Destroy()
}
f.fonts[name] = font
return nil
}
func (f *Fonts) LoadFonts(descriptions ...FontDescription) error {
for _, desc := range descriptions {
err := f.Load(desc.Path, desc.Size, desc.Name)
if err != nil {
return err
}
}
return nil
}
func (f *Fonts) Get(name string) *allg5.Font {
if name == "" {
return f.Get("default")
}
return f.fonts[name]
}