Introduce a new `MainSettings` view for managing application settings, including language and theme selection. Implement theme management methods in the `setting` package to handle theme initialization, retrieval, and updates.
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
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)
|
|
}
|