Init
This commit is contained in:
commit
d9dae02ffc
17 changed files with 1742 additions and 0 deletions
119
gui.go
Normal file
119
gui.go
Normal file
|
@ -0,0 +1,119 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
rl "github.com/gen2brain/raylib-go/raylib"
|
||||
)
|
||||
|
||||
// ShowUpdateWindow displays the update GUI.
|
||||
func ShowUpdateWindow() {
|
||||
screenW := 300
|
||||
screenH := 450
|
||||
rl.SetConfigFlags(rl.FlagWindowUndecorated)
|
||||
rl.InitWindow(int32(screenW), int32(screenH), "Updating Spitfire")
|
||||
|
||||
// 1) Use actual monitor refresh rate
|
||||
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)
|
||||
|
||||
var sf StateFile
|
||||
|
||||
sf = ReadState()
|
||||
|
||||
// 2) 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()
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue