gui-for-ffmpeg/internal/gui/view/mainSettings.go
Leonid Nikitin fc4e585620
Add main settings view and theme management functionality
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.
2025-06-09 00:27:40 +05:00

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)
}