Files
EpochSilicon/pkg/ui/layout.go

108 lines
3.4 KiB
Go

package ui
import (
"turtlesilicon/pkg/debug"
"turtlesilicon/pkg/paths"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
// createHeaderContainer creates the header with title and subtitle
func createHeaderContainer() fyne.CanvasObject {
// Main title
titleText := widget.NewRichTextFromMarkdown("# TurtleSilicon")
titleText.Wrapping = fyne.TextWrapOff
// Subtitle
subtitleText := widget.NewLabel("A TurtleWoW launcher for Apple Silicon Macs")
subtitleText.Alignment = fyne.TextAlignCenter
// Create header container
headerContainer := container.NewVBox(
container.NewCenter(titleText),
container.NewCenter(subtitleText),
)
return headerContainer
}
// createLogoContainer creates and returns the application logo container
func createLogoContainer() fyne.CanvasObject {
// Load the application logo
logoResource, err := fyne.LoadResourceFromPath("Icon.png")
if err != nil {
debug.Printf("Warning: could not load logo: %v", err)
}
// Create the logo image with a smaller fixed size since we have a header now
var logoImage *canvas.Image
if logoResource != nil {
logoImage = canvas.NewImageFromResource(logoResource)
logoImage.FillMode = canvas.ImageFillContain
logoImage.SetMinSize(fyne.NewSize(80, 80))
}
// Create a container to center the logo
var logoContainer fyne.CanvasObject
if logoImage != nil {
logoContainer = container.NewCenter(logoImage)
} else {
// If logo couldn't be loaded, add an empty space for consistent layout
logoContainer = container.NewCenter(widget.NewLabel(""))
}
return logoContainer
}
// createPathSelectionForm creates the form for selecting CrossOver and TurtleWoW paths
func createPathSelectionForm(myWindow fyne.Window) *widget.Form {
pathSelectionForm := widget.NewForm(
widget.NewFormItem("CrossOver Path:", container.NewBorder(nil, nil, nil, widget.NewButton("Set/Change", func() {
paths.SelectCrossOverPath(myWindow, crossoverPathLabel, UpdateAllStatuses)
}), crossoverPathLabel)),
widget.NewFormItem("TurtleWoW Path:", container.NewBorder(nil, nil, nil, widget.NewButton("Set/Change", func() {
paths.SelectTurtleWoWPath(myWindow, turtlewowPathLabel, UpdateAllStatuses)
}), turtlewowPathLabel)),
)
return pathSelectionForm
}
// createPatchOperationsLayout creates the layout for patch operations
func createPatchOperationsLayout() fyne.CanvasObject {
patchOperationsLayout := container.NewVBox(
widget.NewSeparator(),
container.NewGridWithColumns(4,
widget.NewLabel("TurtleWoW Patch:"), turtlewowStatusLabel, patchTurtleWoWButton, unpatchTurtleWoWButton,
),
container.NewGridWithColumns(4,
widget.NewLabel("CrossOver Patch:"), crossoverStatusLabel, patchCrossOverButton, unpatchCrossOverButton,
),
container.NewGridWithColumns(4,
widget.NewLabel("RosettaX87 Service:"), serviceStatusLabel, startServiceButton, stopServiceButton,
),
widget.NewSeparator(),
)
return patchOperationsLayout
}
// createMainContent creates the main content area of the application
func createMainContent(myWindow fyne.Window) fyne.CanvasObject {
logoContainer := createLogoContainer()
pathSelectionForm := createPathSelectionForm(myWindow)
patchOperationsLayout := createPatchOperationsLayout()
// Create main content area with better spacing
mainContent := container.NewVBox(
logoContainer,
pathSelectionForm,
patchOperationsLayout,
)
return mainContent
}