added SPM
All checks were successful
/ test-on-windows (push) Successful in 9s
/ test-on-alpine (push) Successful in 4s

This commit is contained in:
partisan 2024-12-25 10:58:31 +01:00
parent 17bb547c74
commit 9e5457c2ec
8 changed files with 779 additions and 18 deletions

230
main.go
View file

@ -2,18 +2,23 @@ package main
import (
"fmt"
"os"
rl "github.com/gen2brain/raylib-go/raylib"
)
var transition = NewTransitionManager()
var currentStep = 0
var targetStep = 0
var useDefault = false
// Keep your global variables for steps and transitions
var (
transition = NewTransitionManager()
currentStep = 0
targetStep = 0
useDefault = false
var step1DefaultRect rl.Rectangle
var step1CustomRect rl.Rectangle
step1DefaultRect rl.Rectangle
step1CustomRect rl.Rectangle
// Our global Installer from installer.go
installer = NewInstaller()
)
func main() {
monitor := rl.GetCurrentMonitor()
@ -32,6 +37,9 @@ func main() {
InitBackground(rl.GetScreenWidth(), rl.GetScreenHeight())
// Start the download+decompress in background immediately:
installer.StartDownloadDecompress()
targetStep = 0
for !rl.WindowShouldClose() {
@ -46,12 +54,24 @@ func main() {
nextX := int32(screenW - 150)
nextY := prevY
// Update transition
oldAlpha, oldScale, oldOffsetX, newAlpha, newScale, newOffsetX := transition.Update()
if !transition.IsActive() && currentStep != targetStep {
currentStep = targetStep
}
// Poll SPM progress for the GUI
installer.PollProgress()
// If an unrecoverable error occurred, you could handle it here:
// (For now, we just print it in the console.)
if installer.LastError != nil {
fmt.Println("SPM Error:", installer.LastError)
// You might choose to show a popup or do something else
}
// GUI input
if !transition.IsActive() && rl.IsMouseButtonPressed(rl.MouseLeftButton) {
handleInput(mousePos, screenW, screenH, buttonW, buttonH, prevX, prevY, nextX, nextY)
}
@ -93,20 +113,27 @@ func main() {
}
}
// Draw the semi-transparent loading circle if user is downloading or installing
if installer.IsDownloading || installer.IsInstalling {
drawInstallProgress(screenW, installer.Progress, installer.Task)
}
rl.EndDrawing()
}
}
func startTransition(from, to int) {
targetStep = to
transition.Start(from, to)
}
// handleInput acts on mouse clicks in each step
func handleInput(mousePos rl.Vector2, screenW, screenH, buttonW, buttonH int,
prevX, prevY, nextX, nextY int32) {
func handleInput(mousePos rl.Vector2, screenW, screenH, buttonW, buttonH int, prevX, prevY, nextX, nextY int32) {
if currentStep == 0 {
if overRect(mousePos, step1DefaultRect) {
fmt.Println("Installation complete with default settings.")
os.Exit(0)
// user clicked "Default" => do final install if not already installing
useDefault = true
if !installer.IsInstalling && !installer.DoneInstall {
installer.FinalInstall()
}
fmt.Println("Installation started with default settings.")
}
if overRect(mousePos, step1CustomRect) {
useDefault = false
@ -124,9 +151,12 @@ func handleInput(mousePos rl.Vector2, screenW, screenH, buttonW, buttonH int, pr
selectTheme(mousePos)
} else if currentStep == 2 {
if overButton(mousePos, nextX, nextY, int32(buttonW), int32(buttonH)) {
fmt.Printf("Installation complete:\nDefault: %v\nColor: %s\nTheme: %s\nLayout: %s\n",
// user clicked "Finish" => final install if not already installing
if !installer.IsInstalling && !installer.DoneInstall {
installer.FinalInstall()
}
fmt.Printf("Installation started:\nDefault: %v\nColor: %s\nTheme: %s\nLayout: %s\n",
useDefault, selectedColor, selectedTheme, selectedLayout)
os.Exit(0)
}
if overButton(mousePos, int32(prevX), int32(prevY), int32(buttonW), int32(buttonH)) {
startTransition(currentStep, 1)
@ -135,6 +165,7 @@ func handleInput(mousePos rl.Vector2, screenW, screenH, buttonW, buttonH int, pr
}
}
// drawHeader is your original function
func drawHeader(screenW int) {
title := "Spitfire Browser Installer"
titleFontSize := int32(30)
@ -142,3 +173,170 @@ func drawHeader(screenW int) {
rl.DrawText(title, (int32(screenW)-titleWidth)/2, 20, titleFontSize, rl.RayWhite)
rl.DrawLine(50, 60, int32(screenW)-50, 60, rl.Fade(rl.White, 0.5))
}
// drawInstallProgress displays a simple white circle with partial alpha,
// plus the current task text below it, in the top-right area.
func drawInstallProgress(screenW int, progress int, task string) {
circleX := float32(screenW - 80)
circleY := float32(100)
radius := float32(30)
// Colors for the circle
bgColor := rl.Color{R: 255, G: 255, B: 255, A: 80}
fillColor := rl.Color{R: 255, G: 255, B: 255, A: 200}
// Draw background circle
rl.DrawCircle(int32(circleX), int32(circleY), radius, bgColor)
// Draw progress arc
angle := float32(progress) / 100.0 * 360.0
rl.DrawCircleSector(
rl.Vector2{X: circleX, Y: circleY},
radius,
0,
angle,
40,
fillColor,
)
// Print numeric progress
txt := fmt.Sprintf("%3d%%", progress)
rl.DrawText(txt, int32(circleX)-rl.MeasureText(txt, 18)/2, int32(circleY)-10, 18, rl.White)
// Draw wrapped task text below the circle
drawTextWrapped(task, int32(circleX)-100, int32(circleY)+40, 200, 18, rl.White)
}
// Custom function to draw text with wrapping
func drawTextWrapped(text string, x, y int32, maxWidth, fontSize int32, color rl.Color) {
words := splitIntoWords(text)
line := ""
offsetY := int32(0)
for _, word := range words {
testLine := line + word + " "
if rl.MeasureText(testLine, fontSize) > int32(maxWidth) {
rl.DrawText(line, x, y+offsetY, fontSize, color)
line = word + " "
offsetY += fontSize + 2
} else {
line = testLine
}
}
// Draw the last line
if line != "" {
rl.DrawText(line, x, y+offsetY, fontSize, color)
}
}
// Helper function to split text into words
func splitIntoWords(text string) []string {
words := []string{}
word := ""
for _, char := range text {
if char == ' ' || char == '\n' {
if word != "" {
words = append(words, word)
word = ""
}
if char == '\n' {
words = append(words, "\n")
}
} else {
word += string(char)
}
}
if word != "" {
words = append(words, word)
}
return words
}
// startTransition is your existing function
func startTransition(from, to int) {
targetStep = to
transition.Start(from, to)
}
// SPM example
// package main
// import (
// "fmt"
// "os"
// "path/filepath"
// "spitfire-installer/spm"
// "time"
// )
// func main() {
// // Start a goroutine to display progress updates
// done := make(chan bool)
// go func() {
// for {
// select {
// case <-done:
// return
// default:
// percentage, task := spm.GetProgress()
// fmt.Printf("\r[%3d%%] %s", percentage, task)
// time.Sleep(500 * time.Millisecond)
// }
// }
// }()
// // Set up the download directory
// downloadDir := spm.GetTempDownloadDir()
// fmt.Println("\nTemporary download directory:", downloadDir)
// // Download the APPINDEX
// appIndexPath := filepath.Join(downloadDir, "APPINDEX")
// spm.UpdateProgress(0, "Starting APPINDEX download")
// if err := spm.DownloadAppIndex(appIndexPath); err != nil {
// fmt.Println("\nError downloading APPINDEX:", err)
// done <- true
// os.Exit(1)
// }
// // Download the desired package version (e.g., nightly)
// packageName := "spitfire-browser"
// release := "nightly"
// spm.UpdateProgress(0, "Starting package download")
// if err := spm.DownloadPackageFromAppIndex(appIndexPath, packageName, release, downloadDir); err != nil {
// fmt.Println("\nError downloading package:", err)
// done <- true
// os.Exit(1)
// }
// // Decompress and install
// packagePath := filepath.Join(downloadDir, "browser-amd64-nightly-linux.tar.gz")
// spm.UpdateProgress(0, "Starting decompression")
// tempDir, err := spm.DecompressToTemp(packagePath)
// if err != nil {
// fmt.Println("\nError decompressing package:", err)
// done <- true
// os.Exit(1)
// }
// fmt.Println("\nDecompressed package to:", tempDir)
// // Generate default install directory
// installDir, err := spm.GetDefaultInstallDir()
// if err != nil {
// inst.LastError = fmt.Errorf("failed to determine default install directory: %w", err)
// return
// }
// spm.UpdateProgress(0, "Starting installation")
// if err := spm.MoveFilesToInstallDir(tempDir, installDir); err != nil {
// fmt.Println("\nError installing package:", err)
// done <- true
// os.Exit(1)
// }
// // Notify progress display to stop and finalize
// done <- true
// fmt.Printf("\nSuccessfully installed %s (%s) to %s\n", packageName, release, installDir)
// }