Files
unreal-launcher/main.go
2025-03-21 15:59:00 +01:00

122 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
type Project struct {
Path string `json:"path"`
Version float64 `json:"version"`
}
const jsonFilePath = "projects.json"
func loadProjects() ([]Project, error) {
file, err := os.ReadFile(jsonFilePath)
if err != nil {
return nil, err
}
var projects []Project
if err := json.Unmarshal(file, &projects); err != nil {
return nil, err
}
return projects, nil
}
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Unreal Project Launcher")
myWindow.Resize(fyne.NewSize(800, 600))
projects, err := loadProjects()
if err != nil {
fmt.Println("Error while loading projects")
}
logText := widget.NewMultiLineEntry()
logText.SetMinRowsVisible(5)
logText.Disable()
logMessage := func(msg string) {
logText.SetText(logText.Text + msg + "\n")
}
var projectList *fyne.Container
reloadUI := func() {
projectList.RemoveAll()
for _, project := range projects {
projectName := filepath.Base(project.Path)
iconPath := projectName + ".png"
var projectIcon fyne.Resource
if _, err := os.Stat(iconPath); err == nil {
icon, err := fyne.LoadResourceFromPath(iconPath)
if err == nil {
projectIcon = icon
}
}
if projectIcon == nil {
projectIcon = theme.FileIcon()
}
icon := canvas.NewImageFromResource(projectIcon)
icon.SetMinSize(fyne.NewSize(32, 32))
nameLabel := widget.NewLabel(projectName)
nameLabel.Alignment = fyne.TextAlignLeading
generateBtn := widget.NewButton("Generate", func() {
logMessage("Generate Project: " + projectName)
})
generateBtn.Resize(fyne.NewSize(150, 40))
generateBtn.Size().Min(fyne.NewSize(150, 40))
launchBtn := widget.NewButton("Start", func() {
logMessage("Start Project " + projectName)
})
launchBtn.Size().Min(fyne.NewSize(150, 40))
deleteBtn := widget.NewButton("X", func() {
logMessage("Delete Project " + projectName)
})
row := container.NewHBox(
icon,
nameLabel,
layout.NewSpacer(),
generateBtn,
launchBtn,
deleteBtn,
)
projectList.Add(row)
}
}
projectList = container.NewVBox()
reloadUI()
scrollContainer := container.NewVScroll(projectList)
mainContainer := container.NewBorder(nil, logText, nil, nil, scrollContainer)
myWindow.SetContent(mainContainer)
myWindow.ShowAndRun()
}