Add message page for displaying errors
This commit is contained in:
@@ -293,7 +293,7 @@ func (app *Application) initializeSDLAndOpenGL() (W, H int32) {
|
|||||||
|
|
||||||
app.initKeybinds()
|
app.initKeybinds()
|
||||||
logger.Info("SDL and OpenGL initialization complete")
|
logger.Info("SDL and OpenGL initialization complete")
|
||||||
return w, h
|
return graphics.VirtualWidth, graphics.VirtualHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *Application) initializeManagers() {
|
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
|
EMAIL_ADDRESS
|
||||||
LOGS
|
LOGS
|
||||||
CHECK_UPDATES
|
CHECK_UPDATES
|
||||||
ERROR
|
MESSAGE
|
||||||
)
|
)
|
||||||
|
|
||||||
type PageCtx struct {
|
type PageCtx struct {
|
||||||
@@ -27,6 +27,8 @@ type PageCtx struct {
|
|||||||
W, H int32
|
W, H int32
|
||||||
RefreshConfig func()
|
RefreshConfig func()
|
||||||
NavigateTo func(pageType)
|
NavigateTo func(pageType)
|
||||||
|
Msg string // Message to be displayed by MessagePage
|
||||||
|
Inst string // Instructions to be displayed on MessagePage
|
||||||
}
|
}
|
||||||
|
|
||||||
type Router struct {
|
type Router struct {
|
||||||
@@ -69,6 +71,8 @@ func (r *Router) NavigateTo(p pageType) {
|
|||||||
r.ActivePage = &LogViewerPage{}
|
r.ActivePage = &LogViewerPage{}
|
||||||
case CHECK_UPDATES:
|
case CHECK_UPDATES:
|
||||||
r.ActivePage = &UpdateCheckPage{}
|
r.ActivePage = &UpdateCheckPage{}
|
||||||
|
case MESSAGE:
|
||||||
|
r.ActivePage = &MessagePage{}
|
||||||
}
|
}
|
||||||
|
|
||||||
r.ActivePage.Init(&r.Context)
|
r.ActivePage.Init(&r.Context)
|
||||||
|
|||||||
Reference in New Issue
Block a user