Replaced the `i18n` and `toml` dependencies with Fyne's built-in language system for localization management. Updated the `Localizer` implementation to handle translations using JSON files and embed functionality. Simplified language selection and persisted settings via Fyne's preferences API.
102 lines
2.7 KiB
Go
102 lines
2.7 KiB
Go
package menu
|
|
|
|
import (
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/canvas"
|
|
"fyne.io/fyne/v2/widget"
|
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme"
|
|
"image/color"
|
|
)
|
|
|
|
type ViewSettingContract interface {
|
|
Main(
|
|
save func(*SettingForm) error,
|
|
cancel func(),
|
|
)
|
|
}
|
|
|
|
type SettingForm struct {
|
|
Language kernel.Lang
|
|
ThemeInfo theme.ThemeInfoContract
|
|
}
|
|
|
|
type ViewSetting struct {
|
|
app kernel.AppContract
|
|
themeService theme.ThemeContract
|
|
}
|
|
|
|
func NewViewSetting(app kernel.AppContract, themeService theme.ThemeContract) *ViewSetting {
|
|
return &ViewSetting{
|
|
app: app,
|
|
themeService: themeService,
|
|
}
|
|
}
|
|
|
|
func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) {
|
|
errorMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255})
|
|
errorMessage.TextSize = 16
|
|
errorMessage.TextStyle = fyne.TextStyle{Bold: true}
|
|
|
|
viewSettingForm := &SettingForm{
|
|
Language: v.app.GetLocalizerService().GetCurrentLanguage(),
|
|
ThemeInfo: v.themeService.GetCurrentThemeInfo(),
|
|
}
|
|
|
|
languageItems := []string{}
|
|
langByTitle := map[string]kernel.Lang{}
|
|
for _, language := range v.app.GetLocalizerService().GetLanguages() {
|
|
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 = v.app.GetLocalizerService().GetCurrentLanguage().Title
|
|
|
|
themeItems := []string{}
|
|
themeByTitle := map[string]theme.ThemeInfoContract{}
|
|
for _, themeInfo := range v.themeService.List() {
|
|
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 = v.themeService.GetCurrentThemeInfo().GetTitle()
|
|
|
|
form := &widget.Form{
|
|
Items: []*widget.FormItem{
|
|
{
|
|
Text: v.app.GetLocalizerService().GetMessage("menuSettingsLanguage"),
|
|
Widget: selectLanguage,
|
|
},
|
|
{
|
|
Text: v.app.GetLocalizerService().GetMessage("menuSettingsTheme"),
|
|
Widget: selectTheme,
|
|
},
|
|
{
|
|
Widget: errorMessage,
|
|
},
|
|
},
|
|
SubmitText: v.app.GetLocalizerService().GetMessage("save"),
|
|
OnSubmit: func() {
|
|
err := save(viewSettingForm)
|
|
if err != nil {
|
|
errorMessage.Text = err.Error()
|
|
}
|
|
},
|
|
}
|
|
if cancel != nil {
|
|
form.OnCancel = cancel
|
|
form.CancelText = v.app.GetLocalizerService().GetMessage("cancel")
|
|
}
|
|
|
|
messageHead := v.app.GetLocalizerService().GetMessage("settings")
|
|
v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", form))
|
|
}
|