package main import ( "fmt" "image/color" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/widget" ) // RunGUI initializes the Main Window UI where users can configure an error message visually. func RunGUI() { a := app.New() w := a.NewWindow("Error Message Generator") MainWindow = w w.SetIcon(icons[DefaultIcon]) w.SetOnClosed(func() { a.Quit() }) // Create a Dialog template that the UI components will modify. d := Dialog{ Icon: icons[DefaultIcon], Buttons: []*Button{}, } // Preview of the selected icon. currentIcon := canvas.NewImageFromResource(d.Icon) currentIcon.FillMode = canvas.ImageFillOriginal currentIcon.Resize(fyne.NewSize(32, 32)) // The icon picker row. labelIcon := canvas.NewText("Icon:", color.Black) selectIcon := widget.NewSelect(iconNames, func(v string) { d.Icon = icons[v] currentIcon.Resource = d.Icon currentIcon.Refresh() }) selectIcon.SetSelected(DefaultIcon) iconRow := container.New(layout.NewHBoxLayout(), currentIcon, selectIcon) labelTitle := canvas.NewText("Title:", color.Black) entryTitle := widget.NewEntry() entryTitle.SetPlaceHolder("Error message title") entryTitle.OnChanged = func(v string) { fmt.Printf("Title changed to: %s\n", v) d.Title = v } labelMessage := canvas.NewText("Message:", color.Black) entryMessage := widget.NewEntry() entryMessage.MultiLine = true entryMessage.SetPlaceHolder("Message contents") entryMessage.OnChanged = func(v string) { fmt.Printf("Message changed to: %s\n", v) d.Message = v } // The three buttons. var buttons = []fyne.CanvasObject{} for i := 0; i < 3; i++ { // Our dialog button. b := &Button{} d.Buttons = append(d.Buttons, b) labelButton := canvas.NewText(fmt.Sprintf("Button %d", i+1), color.Black) entryButton := widget.NewEntry() entryButton.OnChanged = func(v string) { b.Label = v } entryButton.SetPlaceHolder("Button") checkDisabled := widget.NewCheck("Disabled", func(v bool) { b.Disabled = v }) buttonColumn := container.New( layout.NewVBoxLayout(), labelButton, entryButton, checkDisabled, ) buttons = append(buttons, buttonColumn) if i < 2 { buttons = append(buttons, layout.NewSpacer()) } } buttonRow := container.New(layout.NewHBoxLayout(), buttons...) // The "Go!" buttons. buttonGo := widget.NewButton("Go!", func() { d.Show() }) buttonHideAndGo := widget.NewButton("Hide MainWindow & Go!", func() { w.Hide() d.Show() }) goRow := container.New(layout.NewHBoxLayout(), layout.NewSpacer(), buttonGo, layout.NewSpacer(), buttonHideAndGo, layout.NewSpacer()) vbox := container.New( layout.NewVBoxLayout(), labelIcon, iconRow, labelTitle, entryTitle, labelMessage, entryMessage, buttonRow, goRow, ) w.SetContent(vbox) w.ShowAndRun() }