Add message page for displaying errors
This commit is contained in:
@@ -293,7 +293,7 @@ func (app *Application) initializeSDLAndOpenGL() (W, H int32) {
|
||||
|
||||
app.initKeybinds()
|
||||
logger.Info("SDL and OpenGL initialization complete")
|
||||
return w, h
|
||||
return graphics.VirtualWidth, graphics.VirtualHeight
|
||||
}
|
||||
|
||||
func (app *Application) initializeManagers() {
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
package page
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/go-gl/gl/v3.3-core/gl"
|
||||
"github.com/go-gl/mathgl/mgl32"
|
||||
"github.com/veandco/go-sdl2/sdl"
|
||||
"rhemawavetech.com/rhemawave/internal/colors"
|
||||
"rhemawavetech.com/rhemawave/internal/fontManager"
|
||||
"rhemawavetech.com/rhemawave/internal/shaderManager"
|
||||
)
|
||||
|
||||
type MessagePage struct {
|
||||
Base
|
||||
message StringItem
|
||||
instructions StringItem
|
||||
msgDim mgl32.Vec2
|
||||
instDim mgl32.Vec2
|
||||
textShader *shaderManager.Shader
|
||||
msgPos mgl32.Vec2
|
||||
instPos mgl32.Vec2
|
||||
}
|
||||
|
||||
func (p *MessagePage) Init(ctx *PageCtx) error {
|
||||
var err error
|
||||
var ok bool
|
||||
|
||||
if ctx.Msg == "" {
|
||||
ctx.Msg = "This is an example message because no message was passed"
|
||||
}
|
||||
|
||||
if ctx.Inst == "" {
|
||||
ctx.Inst = "Press F1 to exit"
|
||||
}
|
||||
|
||||
if err = p.Base.Init(ctx); err != nil {
|
||||
return fmt.Errorf("failed to init Base page: %w", err)
|
||||
}
|
||||
|
||||
// Fetch and cache shader
|
||||
sm := shaderManager.Get()
|
||||
p.textShader, ok = sm.Get("text")
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to fetch text shader")
|
||||
}
|
||||
|
||||
fm := fontManager.Get()
|
||||
font, ok := fm.GetFont("Roboto-Regular")
|
||||
if !ok {
|
||||
return fmt.Errorf("unable to fetch font")
|
||||
}
|
||||
|
||||
p.message, err = NewStringItem(ctx.Msg, font, colors.Orange)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to create message string texture: %w", err)
|
||||
}
|
||||
|
||||
p.instructions, err = NewStringItem(ctx.Inst, font, colors.White)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to create instructions string texture: %w", err)
|
||||
}
|
||||
|
||||
baseFontSize := float32(p.Base.Context.CfgPtr.StandardFontSize)
|
||||
p.message.Scale(float32(48) / baseFontSize)
|
||||
p.instructions.Scale(float32(28) / baseFontSize)
|
||||
|
||||
// Cache scaled dimensions — never recomputed unless textures are replaced
|
||||
p.msgDim = p.message.RawDimensions()
|
||||
p.instDim = p.instructions.RawDimensions()
|
||||
|
||||
p.msgPos = mgl32.Vec2{
|
||||
float32(p.Base.ScreenCenterX) - p.msgDim[0]/2,
|
||||
float32(p.Base.ScreenCenterY) - p.msgDim[1]/2,
|
||||
}
|
||||
p.instPos = mgl32.Vec2{
|
||||
float32(p.Base.ScreenCenterX) - p.instDim[0]/2,
|
||||
float32(20),
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessagePage) HandleEvent(event *sdl.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessagePage) Update(dt float32) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessagePage) Render() error {
|
||||
p.Base.RenderTexture(p.textShader, p.message.ID, p.msgPos, p.msgDim, colors.Orange)
|
||||
p.Base.RenderTexture(p.textShader, p.instructions.ID, p.instPos, p.instDim, colors.White)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessagePage) Destroy() error {
|
||||
gl.DeleteTextures(1, &p.message.ID)
|
||||
gl.DeleteTextures(1, &p.instructions.ID)
|
||||
return p.Base.Destroy()
|
||||
}
|
||||
|
||||
func (p *MessagePage) SetMessage(msg string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessagePage) SetInstructions(inst string) error {
|
||||
return nil
|
||||
}
|
||||
@@ -18,7 +18,7 @@ const (
|
||||
EMAIL_ADDRESS
|
||||
LOGS
|
||||
CHECK_UPDATES
|
||||
ERROR
|
||||
MESSAGE
|
||||
)
|
||||
|
||||
type PageCtx struct {
|
||||
@@ -27,6 +27,8 @@ type PageCtx struct {
|
||||
W, H int32
|
||||
RefreshConfig func()
|
||||
NavigateTo func(pageType)
|
||||
Msg string // Message to be displayed by MessagePage
|
||||
Inst string // Instructions to be displayed on MessagePage
|
||||
}
|
||||
|
||||
type Router struct {
|
||||
@@ -69,6 +71,8 @@ func (r *Router) NavigateTo(p pageType) {
|
||||
r.ActivePage = &LogViewerPage{}
|
||||
case CHECK_UPDATES:
|
||||
r.ActivePage = &UpdateCheckPage{}
|
||||
case MESSAGE:
|
||||
r.ActivePage = &MessagePage{}
|
||||
}
|
||||
|
||||
r.ActivePage.Init(&r.Context)
|
||||
|
||||
Reference in New Issue
Block a user