Luncher/gui.go
2025-02-04 17:11:27 +01:00

127 lines
2.9 KiB
Go

package main
import (
"fmt"
"log"
"path/filepath"
"time"
rl "github.com/gen2brain/raylib-go/raylib"
)
// ShowUpdateWindow displays the update GUI.
func ShowUpdateWindow() {
var sf StateFile
sf = ReadState()
if sf.IsUpdating == true {
log.Println("Stage=Installing => show update window.")
screenW := 300
screenH := 450
rl.SetConfigFlags(rl.FlagWindowUndecorated)
rl.InitWindow(int32(screenW), int32(screenH), "Updating Spitfire")
monitor := rl.GetCurrentMonitor()
refreshRate := rl.GetMonitorRefreshRate(monitor)
rl.SetTargetFPS(int32(refreshRate))
InitBackground(screenW, screenH)
logoPath := filepath.Join(getSpmDir(), "logo.png")
logo := rl.LoadTexture(logoPath)
defer rl.UnloadTexture(logo)
var displayed float32
scale := float32(0.5)
// Update state asynchronously in a separate goroutine
go func() {
for {
sf = ReadState()
time.Sleep(1 * time.Second)
}
}()
for {
tgt := float32(sf.Progress)
if rl.WindowShouldClose() {
break
}
// Smooth interpolation for displayed progress
displayed += (tgt - displayed) * 0.15
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
// 2 px inside border for visibility
rl.DrawRectangleLinesEx(
rl.Rectangle{X: 1, Y: 1, Width: float32(screenW - 2), Height: float32(screenH - 2)},
2,
rl.White,
)
UpdateBackground(screenW, screenH)
DrawBackground(screenW, screenH)
// Draw logo scaled
lw := float32(logo.Width) * scale
lx := float32(screenW)/2 - lw/2
ly := float32(20)
rl.DrawTextureEx(logo, rl.Vector2{X: lx, Y: ly}, 0, scale, rl.White)
// Progress bar
barW := float32(screenW - 60)
barH := float32(20)
barX := float32(30)
barY := float32(screenH/2 + 40)
frac := displayed / 100.0
if frac < 0 {
frac = 0
} else if frac > 1 {
frac = 1
}
fillRect := rl.Rectangle{X: barX, Y: barY, Width: barW * frac, Height: barH}
fullRect := rl.Rectangle{X: barX, Y: barY, Width: barW, Height: barH}
corner := float32(0.4)
rl.DrawRectangleRounded(fillRect, corner, 6, rl.RayWhite)
rl.DrawRectangleRoundedLines(fullRect, corner, 6, rl.White)
// Display status text
msg := updateStatusMsg
if !sf.IsUpdating {
msg = "Update complete!"
}
fontSize := int32(20)
txtW := rl.MeasureText(msg, fontSize)
txtX := (int32(screenW) - txtW) / 2
txtY := int32(barY) - 30
rl.DrawText(msg, txtX, txtY, fontSize, rl.White)
// Display numeric progress
progStr := fmt.Sprintf("%.0f%%", displayed)
pw := rl.MeasureText(progStr, 20)
px := (int32(screenW) - pw) / 2
py := int32(barY) + 30
rl.DrawText(progStr, px, py, 20, rl.White)
rl.EndDrawing()
// If no longer updating => break window loop
if !sf.IsUpdating {
break
}
}
rl.CloseWindow()
}
LaunchBrowser()
}