From c7025aef1e6385a9ef5cd0c77d859f85f5f9d146 Mon Sep 17 00:00:00 2001 From: Yann Date: Mon, 24 Mar 2025 14:58:24 +0100 Subject: [PATCH] Added commands --- main.go | 115 ++++++++++++++++++++++++++++++++++++++++---------- projects.json | 92 +++++++++++----------------------------- 2 files changed, 116 insertions(+), 91 deletions(-) diff --git a/main.go b/main.go index eeab942..0ac2ba9 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,13 @@ package main import ( + "bufio" "encoding/json" "fmt" + "io" "os" - "path/filepath" + "os/exec" + "runtime" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" @@ -16,14 +19,19 @@ import ( ) type Project struct { - Path string `json:"path"` - Version float64 `json:"version"` + EnginePath string `json:"enginePath"` + ProjectPath string `json:"projectPath"` + ProjectName string `json:"projectName"` + Version string `json:"engineVersion"` } -const jsonFilePath = "projects.json" +const projectsFilePath = "projects.json" +var projectList *fyne.Container +var logText *widget.Entry +var scrollContainer *container.Scroll func loadProjects() ([]Project, error) { - file, err := os.ReadFile(jsonFilePath) + file, err := os.ReadFile(projectsFilePath) if err != nil { return nil, err @@ -37,32 +45,93 @@ func loadProjects() ([]Project, error) { return projects, nil } +func generateUnrealSolution(project Project) { + var buildCmd string + + switch runtime.GOOS { + case "linux": + buildCmd = project.EnginePath + "/Engine/Build/BatchFiles/Linux/GenerateProjectFiles.sh"; + case "darwin": + buildCmd = project.EnginePath + "/Engine/Build/BatchFiles/Mac/GenerateProjectFiles.sh" + default: + fmt.Println("Generate Project is not yet supported on Windows") + return + } + + projectCmd := project.ProjectPath + "/" + project.ProjectName + ".uproject" + cmd := exec.Command(buildCmd, projectCmd, "-game") + + logToOutput(cmd) +} + +func runUnrealProject(project Project) { + var buildCmd string + + switch runtime.GOOS { + case "linux": + buildCmd = project.EnginePath + "/Engine/Binaries/Linux/UnrealEditor" + case "darwin": + buildCmd = project.EnginePath + "/Engine/Binaries/Mac/UnrealEditor.app/Contents/MacOS/UnrealEditor" + default: + buildCmd = project.EnginePath + "/Engine/Binaries/Win64/UnrealEditor.exe" + } + + projectCmd := project.ProjectPath + "/" + project.ProjectName + ".uproject" + cmd := exec.Command(buildCmd, projectCmd) + + logToOutput(cmd) +} + +func logToOutput(cmd *exec.Cmd) { + stdout, err := cmd.StdoutPipe() + if err != nil { + fmt.Println("Error during pipe stdout creation") + } + + stderr, err := cmd.StderrPipe() + if err != nil { + fmt.Println("Error during pipe stderr creation") + } + + if err := cmd.Start(); err != nil { + fmt.Println("Error while loading command") + } + + readPipe := func(reader io.ReadCloser) { + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + logText.SetText(logText.Text + scanner.Text() + "\n") + scrollContainer.ScrollToTop() + } + } + + go readPipe(stdout) + go readPipe(stderr) + + if err := cmd.Wait(); err != nil { + fmt.Println("Error") + } +} + func main() { myApp := app.New() myWindow := myApp.NewWindow("Unreal Project Launcher") - myWindow.Resize(fyne.NewSize(800, 600)) + myWindow.Resize(fyne.NewSize(640, 400)) projects, err := loadProjects() if err != nil { fmt.Println("Error while loading projects") } - logText := widget.NewMultiLineEntry() + 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" + projectName := project.ProjectName + iconPath := project.ProjectPath + "/" + projectName + ".png" var projectIcon fyne.Resource if _, err := os.Stat(iconPath); err == nil { @@ -77,26 +146,27 @@ func main() { } icon := canvas.NewImageFromResource(projectIcon) - icon.SetMinSize(fyne.NewSize(32, 32)) + icon.SetMinSize(fyne.NewSize(48, 48)) - nameLabel := widget.NewLabel(projectName) + nameLabel := widget.NewLabel(projectName + " / Unreal Engine " + project.Version) nameLabel.Alignment = fyne.TextAlignLeading + // Buttons generateBtn := widget.NewButton("Generate", func() { - logMessage("Generate Project: " + projectName) + generateUnrealSolution(project) }) generateBtn.Resize(fyne.NewSize(150, 40)) generateBtn.Size().Min(fyne.NewSize(150, 40)) launchBtn := widget.NewButton("Start", func() { - logMessage("Start Project " + projectName) + runUnrealProject(project) }) launchBtn.Size().Min(fyne.NewSize(150, 40)) deleteBtn := widget.NewButton("X", func() { - logMessage("Delete Project " + projectName) }) + // Row row := container.NewHBox( icon, nameLabel, @@ -107,14 +177,13 @@ func main() { ) projectList.Add(row) - } } projectList = container.NewVBox() reloadUI() - scrollContainer := container.NewVScroll(projectList) + scrollContainer = container.NewVScroll(projectList) mainContainer := container.NewBorder(nil, logText, nil, nil, scrollContainer) myWindow.SetContent(mainContainer) diff --git a/projects.json b/projects.json index 8517121..dbd0a60 100644 --- a/projects.json +++ b/projects.json @@ -1,82 +1,38 @@ [ { - "path": "/usr/local/bin/app1", - "version": 1.0 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/home/yann/Projects/unreal/NpcChatbot/", + "projectName": "NpcChatbot", + "engineVersion": "5.5" }, { - "path": "/opt/software/tool2", - "version": 2.5 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/home/yann/Projects/unreal/jsbsim/UnrealEngine/", + "projectName": "UEReferenceApp", + "engineVersion": "5.5" }, { - "path": "/home/user/games/game1", - "version": 3.2 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/run/media/yann/Devel/Unreal/AeroSyncUFS", + "projectName": "MiniFS", + "engineVersion": "5.5" }, { - "path": "/var/lib/serviceX", - "version": 4.8 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/run/media/yann/Devel/Unreal/CyberneticRequiem", + "projectName": "CyberneticRequiem", + "engineVersion": "5.5" }, { - "path": "/usr/bin/editor", - "version": 5.6 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/run/media/yann/Devel/Unreal/DVRSimulator", + "projectName": "DVRSimulator", + "engineVersion": "5.5" }, { - "path": "/usr/sbin/daemonY", - "version": 6.3 - }, - { - "path": "/home/user/tools/cli", - "version": 7.1 - }, - { - "path": "/etc/configurator", - "version": 8.9 - }, - { - "path": "/home/admin/scripts/utility", - "version": 9.4 - }, - { - "path": "/usr/local/share/app2", - "version": 10.2 - }, - { - "path": "/usr/local/bin/app1", - "version": 1.0 - }, - { - "path": "/opt/software/tool2", - "version": 2.5 - }, - { - "path": "/home/user/games/game1", - "version": 3.2 - }, - { - "path": "/var/lib/serviceX", - "version": 4.8 - }, - { - "path": "/usr/bin/editor", - "version": 5.6 - }, - { - "path": "/usr/sbin/daemonY", - "version": 6.3 - }, - { - "path": "/home/user/tools/cli", - "version": 7.1 - }, - { - "path": "/etc/configurator", - "version": 8.9 - }, - { - "path": "/home/admin/scripts/utility", - "version": 9.4 - }, - { - "path": "/usr/local/share/app2", - "version": 10.2 + "enginePath": "/home/yann/Apps/UE_5.5/", + "projectPath": "/run/media/yann/Devel/Unreal/GunSpinningVR", + "projectName": "GSPVR", + "engineVersion": "5.5" } ]