From 95647334eebf19c7e0eb82aa7846bd31ca9f666c Mon Sep 17 00:00:00 2001 From: NeilClack Date: Mon, 30 Mar 2026 09:58:00 -0500 Subject: [PATCH] Add message page for displaying errors --- internal/application/application.go | 2 +- internal/page/message.go | 111 ++++++++++++++++++++++++++++ internal/page/router.go | 6 +- 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 internal/page/message.go diff --git a/internal/application/application.go b/internal/application/application.go index 8ad82c5..a725d94 100644 --- a/internal/application/application.go +++ b/internal/application/application.go @@ -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() { diff --git a/internal/page/message.go b/internal/page/message.go new file mode 100644 index 0000000..f05bc7d --- /dev/null +++ b/internal/page/message.go @@ -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 +} diff --git a/internal/page/router.go b/internal/page/router.go index 53236cd..fb5d4bf 100644 --- a/internal/page/router.go +++ b/internal/page/router.go @@ -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)