From 36506e1490ef337d1e219fba0c4fa0fb61374e48 Mon Sep 17 00:00:00 2001 From: Yann Date: Tue, 25 Mar 2025 17:33:39 +0100 Subject: [PATCH] Added new commands --- main.go | 185 +++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 135 insertions(+), 50 deletions(-) diff --git a/main.go b/main.go index 0ac2ba9..9cb6970 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,9 @@ import ( "io" "os" "os/exec" + "path/filepath" "runtime" + "strings" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" @@ -29,6 +31,26 @@ const projectsFilePath = "projects.json" var projectList *fyne.Container var logText *widget.Entry var scrollContainer *container.Scroll +var logBuffer []string +var logMaxLines = 7 + +type hoverableButton struct { + widget.Button + onMouseIn func() + onMouseOut func() +} + +func (h *hoverableButton) MouseIn() { + if h.onMouseIn != nil { + h.onMouseIn() + } +} + +func (h *hoverableButton) MouseOut() { + if h.onMouseOut != nil { + h.onMouseOut() + } +} func loadProjects() ([]Project, error) { file, err := os.ReadFile(projectsFilePath) @@ -45,6 +67,46 @@ func loadProjects() ([]Project, error) { return projects, nil } +func removeDir(path string) { + err := os.RemoveAll(path) + if err != nil { + log("Can't remove content at " + path) + } else { + log("Removed " + path) + } +} + +func cleanUnrealProject(project Project) { + dirs := []string { + "Binaries", + "DerivedDataCache", + "Intermediate", + "Saved", + "Script", + } + + for _, dir := range dirs { + fullPath := filepath.Join(project.ProjectPath, dir) + removeDir(fullPath) + } + + pluginsPath := filepath.Join(project.ProjectPath, "Plugins") + entries, err := os.ReadDir(pluginsPath) + if err != nil { + return + } + + for _, entry := range entries { + if !entry.IsDir() { + continue + } + + pluginDir := filepath.Join(pluginsPath, entry.Name()) + removeDir(filepath.Join(pluginDir, "Binaries")) + removeDir(filepath.Join(pluginDir, "Intermediate")) + } +} + func generateUnrealSolution(project Project) { var buildCmd string @@ -64,6 +126,17 @@ func generateUnrealSolution(project Project) { logToOutput(cmd) } +func buildUnrealSolution(project Project) { + switch runtime.GOOS { + case "linux": + cmd := exec.Command("make", "-C", project.ProjectPath, project.ProjectName) + logToOutput(cmd) + default: + fmt.Println("Build Project is not yet supported on Windows") + return + } +} + func runUnrealProject(project Project) { var buildCmd string @@ -100,8 +173,8 @@ func logToOutput(cmd *exec.Cmd) { readPipe := func(reader io.ReadCloser) { scanner := bufio.NewScanner(reader) for scanner.Scan() { - logText.SetText(logText.Text + scanner.Text() + "\n") - scrollContainer.ScrollToTop() + line := scanner.Text() + log(line) } } @@ -113,10 +186,67 @@ func logToOutput(cmd *exec.Cmd) { } } +func log(line string) { + logBuffer = append(logBuffer, line) + if len(logBuffer) > logMaxLines { + logBuffer = logBuffer[1:] + } + + logText.SetText(strings.Join(logBuffer, "\n")) +} + +func newProjectRow(project Project) fyne.CanvasObject { + projectName := project.ProjectName + iconPath := filepath.Join(project.ProjectPath, 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(48, 48)) + + nameLabel := widget.NewLabel(projectName + " / Unreal Engine " + project.Version) + nameLabel.Alignment = fyne.TextAlignLeading + + // Crée les boutons masqués par défaut + clearButton := widget.NewButton("Clean", func() { + cleanUnrealProject(project) + }) + generateBtn := widget.NewButton("Generate", func() { + generateUnrealSolution(project) + }) + buildBtn := widget.NewButton("Build", func() { + buildUnrealSolution(project) + }) + launchBtn := widget.NewButton("Run", func() { + runUnrealProject(project) + }) + + buttons := container.NewHBox(clearButton, generateBtn, buildBtn, launchBtn) + + // Conteneur principal + row := container.NewHBox( + icon, + nameLabel, + layout.NewSpacer(), + buttons, + ) + + return row +} + func main() { myApp := app.New() myWindow := myApp.NewWindow("Unreal Project Launcher") - myWindow.Resize(fyne.NewSize(640, 400)) + myWindow.Resize(fyne.NewSize(730, 460)) projects, err := loadProjects() if err != nil { @@ -124,58 +254,13 @@ func main() { } logText = widget.NewMultiLineEntry() - logText.SetMinRowsVisible(5) + logText.SetMinRowsVisible(logMaxLines); reloadUI := func() { projectList.RemoveAll() for _, project := range projects { - projectName := project.ProjectName - iconPath := project.ProjectPath + "/" + 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(48, 48)) - - nameLabel := widget.NewLabel(projectName + " / Unreal Engine " + project.Version) - nameLabel.Alignment = fyne.TextAlignLeading - - // Buttons - generateBtn := widget.NewButton("Generate", func() { - generateUnrealSolution(project) - }) - generateBtn.Resize(fyne.NewSize(150, 40)) - generateBtn.Size().Min(fyne.NewSize(150, 40)) - - launchBtn := widget.NewButton("Start", func() { - runUnrealProject(project) - }) - launchBtn.Size().Min(fyne.NewSize(150, 40)) - - deleteBtn := widget.NewButton("X", func() { - }) - - // Row - row := container.NewHBox( - icon, - nameLabel, - layout.NewSpacer(), - generateBtn, - launchBtn, - deleteBtn, - ) - + row := newProjectRow(project) projectList.Add(row) } }