Added commands
This commit is contained in:
115
main.go
115
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)
|
||||
|
||||
Reference in New Issue
Block a user