package ui import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "gitea.unprism.ru/KRBL/FemaInstaller/pkg/config" ) // MainWindow represents the main application window type MainWindow struct { Window fyne.Window IPEntry *widget.Entry PortEntry *widget.Entry LoginEntry *widget.Entry PasswordEntry *widget.Entry SerialEntry *widget.Entry TailNumberEntry *widget.Entry DefaultHostEntry *widget.Entry ArchivePathEntry *widget.Entry StatusLabel *widget.Label InstallButton *widget.Button } // NewMainWindow creates a new main window for the application func NewMainWindow(app fyne.App, installHandler func(*config.SSHConfig) error) *MainWindow { window := app.NewWindow("Fema Installer") // Create form fields mainWindow := &MainWindow{ Window: window, IPEntry: widget.NewEntry(), PortEntry: widget.NewEntry(), LoginEntry: widget.NewEntry(), PasswordEntry: widget.NewPasswordEntry(), SerialEntry: widget.NewEntry(), TailNumberEntry: widget.NewEntry(), DefaultHostEntry: widget.NewEntry(), ArchivePathEntry: widget.NewEntry(), StatusLabel: widget.NewLabel(""), } // Disable archive path entry (will be set by file selector) mainWindow.ArchivePathEntry.Disable() // Create archive selection button selectArchiveBtn := widget.NewButton("Select Archive", func() { CustomFileSelector(window, func(path string) { mainWindow.ArchivePathEntry.SetText(path) }) }) // Create install button mainWindow.InstallButton = widget.NewButton("Install", func() { config := &config.SSHConfig{ IP: mainWindow.IPEntry.Text, Port: mainWindow.PortEntry.Text, Login: mainWindow.LoginEntry.Text, Password: mainWindow.PasswordEntry.Text, Serial: mainWindow.SerialEntry.Text, TailNumber: mainWindow.TailNumberEntry.Text, DefaultHost: mainWindow.DefaultHostEntry.Text, ArchivePath: mainWindow.ArchivePathEntry.Text, } mainWindow.StatusLabel.SetText("Starting installation...") go func() { // Validate serial number if len([]rune(config.Serial)) != 16 { mainWindow.StatusLabel.SetText("Serial number must be 16 characters") dialog.ShowInformation("Error", "Serial number must be 16 characters", window) return } // Perform installation err := installHandler(config) if err != nil { dialog.ShowError(err, window) mainWindow.StatusLabel.SetText("Installation failed") } else { mainWindow.StatusLabel.SetText("Installation completed successfully!") dialog.ShowInformation("Success", "Installation completed successfully!", window) } }() }) // Create form layout form := container.NewVBox( widget.NewForm( widget.NewFormItem("IP", mainWindow.IPEntry), widget.NewFormItem("Port", mainWindow.PortEntry), widget.NewFormItem("Login", mainWindow.LoginEntry), widget.NewFormItem("Password", mainWindow.PasswordEntry), widget.NewFormItem("Serial Number", mainWindow.SerialEntry), widget.NewFormItem("Tail Number", mainWindow.TailNumberEntry), widget.NewFormItem("Default Server", mainWindow.DefaultHostEntry), widget.NewFormItem("Archive", container.NewHBox(mainWindow.ArchivePathEntry, selectArchiveBtn)), ), mainWindow.InstallButton, mainWindow.StatusLabel, ) // Set window content and size window.SetContent(form) window.Resize(fyne.NewSize(400, 300)) return mainWindow } // Show displays the main window func (w *MainWindow) Show() { w.Window.Show() } // ShowAndRun displays the main window and starts the application func (w *MainWindow) ShowAndRun() { w.Window.ShowAndRun() }