diff --git a/handler/menu.go b/handler/menu.go index dff0534..0bd5d07 100644 --- a/handler/menu.go +++ b/handler/menu.go @@ -17,6 +17,7 @@ type MenuHandler struct { app kernel.AppContract convertorHandler ConvertorHandlerContract menuView menu.ViewContract + menuViewSetting menu.ViewSettingContract localizerView localizer.ViewContract localizerRepository localizer.RepositoryContract } @@ -25,6 +26,7 @@ func NewMenuHandler( app kernel.AppContract, convertorHandler ConvertorHandlerContract, menuView menu.ViewContract, + menuViewSetting menu.ViewSettingContract, localizerView localizer.ViewContract, localizerRepository localizer.RepositoryContract, ) *MenuHandler { @@ -32,6 +34,7 @@ func NewMenuHandler( app: app, convertorHandler: convertorHandler, menuView: menuView, + menuViewSetting: menuViewSetting, localizerView: localizerView, localizerRepository: localizerRepository, } @@ -53,11 +56,11 @@ func (h MenuHandler) getMenuSettings() *fyne.Menu { quit.Label = text }) - languageSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ - MessageID: "changeLanguage", - }), h.LanguageSelection) - h.app.GetLocalizerService().AddChangeCallback("changeLanguage", func(text string) { - languageSelection.Label = text + settingsSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "settings", + }), h.settingsSelection) + h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { + settingsSelection.Label = text }) ffPathSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ @@ -69,7 +72,7 @@ func (h MenuHandler) getMenuSettings() *fyne.Menu { settings := fyne.NewMenu(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "settings", - }), languageSelection, ffPathSelection, quit) + }), settingsSelection, ffPathSelection, quit) h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { settings.Label = text settings.Refresh() @@ -140,3 +143,22 @@ func (h MenuHandler) LanguageSelection() { h.convertorHandler.MainConvertor() }) } + +func (h MenuHandler) settingsSelection() { + save := func(setting *menu.SettingForm) error { + err := h.app.GetLocalizerService().SetCurrentLanguage(setting.Language) + if err != nil { + return err + } + _, err = h.localizerRepository.Save(setting.Language.Code) + if err != nil { + return err + } + h.convertorHandler.MainConvertor() + return nil + } + cancel := func() { + h.convertorHandler.MainConvertor() + } + h.menuViewSetting.Main(save, cancel) +} diff --git a/languages/active.en.toml b/languages/active.en.toml index d56d354..491dca3 100644 --- a/languages/active.en.toml +++ b/languages/active.en.toml @@ -422,6 +422,10 @@ other = "License information" hash = "sha1-359fff328717c05104e51a2d29f05bf1875d26b7" other = "Licenses from other products used in the program" +[menuSettingsLanguage] +hash = "sha1-ed3f0e507a5b4ed0649d7c768fe0d47413d839ba" +other = "Language" + [or] hash = "sha1-30bb0333ca1583110e4ced513b5d2455b86f529b" other = "or" diff --git a/languages/active.kk.toml b/languages/active.kk.toml index 729140a..a59a702 100644 --- a/languages/active.kk.toml +++ b/languages/active.kk.toml @@ -422,6 +422,10 @@ other = "Лицензия туралы ақпарат" hash = "sha1-359fff328717c05104e51a2d29f05bf1875d26b7" other = "Бағдарламада пайдаланылатын басқа өнімдердің лицензиялары" +[menuSettingsLanguage] +hash = "sha1-ed3f0e507a5b4ed0649d7c768fe0d47413d839ba" +other = "Тіл" + [or] hash = "sha1-30bb0333ca1583110e4ced513b5d2455b86f529b" other = "немесе" diff --git a/languages/active.ru.toml b/languages/active.ru.toml index 949ee38..2827dd5 100644 --- a/languages/active.ru.toml +++ b/languages/active.ru.toml @@ -104,6 +104,7 @@ languageSelectionFormHead = "Переключить язык" languageSelectionHead = "Выберите язык" licenseLink = "Сведения о лицензии" licenseLinkOther = "Лицензии от других продуктов, которые используются в программе" +menuSettingsLanguage = "Язык" or = "или" parameterCheckbox = "Включить параметр" pathToFfmpeg = "Путь к FFmpeg:" diff --git a/main.go b/main.go index b9d8ea2..31c5879 100644 --- a/main.go +++ b/main.go @@ -111,7 +111,8 @@ func main() { localizerRepository := localizer.NewRepository(settingRepository) menuView := menu.NewView(application) - mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, localizerView, localizerRepository) + menuSettingView := menu.NewViewSetting(application) + mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, menuSettingView, localizerView, localizerRepository) mainHandler := handler.NewMainHandler(application, convertorHandler, mainMenu, localizerRepository) mainHandler.Start() diff --git a/menu/view_setting.go b/menu/view_setting.go new file mode 100644 index 0000000..d7d6433 --- /dev/null +++ b/menu/view_setting.go @@ -0,0 +1,88 @@ +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" + "github.com/nicksnyder/go-i18n/v2/i18n" + "image/color" +) + +type ViewSettingContract interface { + Main( + save func(*SettingForm) error, + cancel func(), + ) +} + +type SettingForm struct { + Language kernel.Lang +} + +type ViewSetting struct { + app kernel.AppContract +} + +func NewViewSetting(app kernel.AppContract) *ViewSetting { + return &ViewSetting{ + app: app, + } +} + +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().Lang, + } + + languageItems := []string{} + langByTitle := map[string]kernel.Lang{} + for _, language := range v.app.GetLocalizerService().GetLanguages() { + languageItems = append(languageItems, language.Title) + langByTitle[language.Title] = language + } + selectLanguages := widget.NewSelect(languageItems, func(s string) { + if lang, ok := langByTitle[s]; ok { + viewSettingForm.Language = lang + } + }) + selectLanguages.Selected = v.app.GetLocalizerService().GetCurrentLanguage().Lang.Title + + form := &widget.Form{ + Items: []*widget.FormItem{ + { + Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "menuSettingsLanguage", + }), + Widget: selectLanguages, + }, + { + Widget: errorMessage, + }, + }, + SubmitText: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "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(&i18n.LocalizeConfig{ + MessageID: "cancel", + }) + } + + messageHead := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "settings", + }) + v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", form)) +}