package view import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/widget" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/setting" "image/color" ) type MainSettingForm struct { Language setting.Lang ThemeInfo setting.ThemeInfoContract } func MainSettings( currentLang setting.Lang, langList []setting.Lang, themeInfo setting.ThemeInfoContract, themeList map[string]setting.ThemeInfoContract, save func(form *MainSettingForm) error, cancel func(), ) fyne.CanvasObject { errorMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) errorMessage.TextSize = 16 errorMessage.TextStyle = fyne.TextStyle{Bold: true} viewSettingForm := &MainSettingForm{ Language: currentLang, ThemeInfo: themeInfo, } var languageItems []string langByTitle := map[string]setting.Lang{} for _, language := range langList { languageItems = append(languageItems, language.Title) langByTitle[language.Title] = language } selectLanguage := widget.NewSelect(languageItems, func(s string) { if lang, ok := langByTitle[s]; ok { viewSettingForm.Language = lang } }) selectLanguage.Selected = currentLang.Title var themeItems []string themeByTitle := map[string]setting.ThemeInfoContract{} for _, themeInfo := range themeList { themeItems = append(themeItems, themeInfo.GetTitle()) themeByTitle[themeInfo.GetTitle()] = themeInfo } selectTheme := widget.NewSelect(themeItems, func(s string) { if themeInfo, ok := themeByTitle[s]; ok { viewSettingForm.ThemeInfo = themeInfo } }) selectTheme.Selected = themeInfo.GetTitle() form := &widget.Form{ Items: []*widget.FormItem{ { Text: lang.L("menuSettingsLanguage"), Widget: selectLanguage, }, { Text: lang.L("menuSettingsTheme"), Widget: selectTheme, }, { Widget: errorMessage, }, }, SubmitText: lang.L("save"), OnSubmit: func() { err := save(viewSettingForm) if err != nil { errorMessage.Text = err.Error() } }, } if cancel != nil { form.OnCancel = cancel form.CancelText = lang.L("cancel") } messageHead := lang.L("settings") return widget.NewCard(messageHead, "", form) }