1
0
Fork 0
anymenu/window.go

115 lines
2.4 KiB
Go

package menu
import (
"github.com/juju/errors"
"github.com/localhots/themenu/fonts"
"github.com/veandco/go-sdl2/sdl"
"github.com/veandco/go-sdl2/ttf"
)
const (
paddingX = 8
paddingY = 8
)
var (
windowWidth = 600
windowHeight = 800
borderWidth = 0
fontName = "InconsolataGo Regular"
fontSize = 24
font *ttf.Font
)
type window struct {
window *sdl.Window
allItems, curItems []menuItem
}
func (w window) render(r *sdl.Renderer) error {
// Resize window
windowHeight = borderWidth*2 + // Border
len(w.curItems)*itemHeight() + // Backgrounds
(len(w.curItems)+1)*paddingY // Paddings
w.window.SetSize(int32(windowWidth), int32(windowHeight))
// Reset background
if err := drawWindowBackground(r); err != nil {
return errors.Annotate(err, "draw window background")
}
if err := drawWindowBorder(r, int32(borderWidth)); err != nil {
return errors.Annotate(err, "draw window border")
}
// Draw items
for i, itm := range w.curItems {
offsetY := int32(i*(itemHeight()+paddingY) + paddingY + borderWidth)
if err := itm.render(r, offsetY); err != nil {
return errors.Annotate(err, "render item")
}
}
return nil
}
func drawWindowBackground(r *sdl.Renderer) error {
if err := setDrawColor(r, theme.Background); err != nil {
return errors.Annotate(err, "set background color")
}
backgroundFrame := &sdl.Rect{
X: 0,
Y: 0,
W: int32(windowWidth),
H: int32(windowHeight),
}
if err := r.FillRect(backgroundFrame); err != nil {
return errors.Annotate(err, "draw background")
}
return nil
}
func drawWindowBorder(r *sdl.Renderer, width int32) error {
if err := setDrawColor(r, theme.ItemBackground); err != nil {
return errors.Annotate(err, "set border color")
}
for i := int32(1); i <= width; i++ {
borderFrame := &sdl.Rect{
X: i,
Y: i,
W: int32(windowWidth) - i*2,
H: int32(windowHeight) - i*2,
}
if err := r.DrawRect(borderFrame); err != nil {
return errors.Annotate(err, "draw border")
}
}
return nil
}
func useFont(name string) error {
fontPath, err := fonts.Find(name)
if err != nil {
return err
}
if fontPath == "" {
return errors.New("font not found")
}
font, err = ttf.OpenFont(fontPath, fontSize)
if err != nil {
return errors.Annotatef(err, "load font %s", name)
}
return nil
}
func itemHeight() int {
return fontSize + 2*paddingY
}
func setDrawColor(r *sdl.Renderer, c sdl.Color) error {
return r.SetDrawColor(c.R, c.G, c.B, c.A)
}