From eec298bfd70f16f2c1f9ec95f3bbd7d62274e814 Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Sat, 3 Feb 2024 17:47:32 +0600 Subject: [PATCH] Added a window with information about the program. --- src/handler/convertor.go | 10 ++ src/handler/menu.go | 44 ++++++++- src/icon.png | Bin 15564 -> 29642 bytes src/languages/active.en.toml | 48 ++++++++- src/languages/active.kk.toml | 48 ++++++++- src/languages/active.ru.toml | 14 ++- src/languages/translate.en.toml | 50 +++++++++- src/languages/translate.kk.toml | 50 +++++++++- src/main.go | 8 +- src/menu/view.go | 167 ++++++++++++++++++++++++++++++++ 10 files changed, 419 insertions(+), 20 deletions(-) create mode 100644 src/menu/view.go diff --git a/src/handler/convertor.go b/src/handler/convertor.go index c588812..3f896fd 100644 --- a/src/handler/convertor.go +++ b/src/handler/convertor.go @@ -17,6 +17,8 @@ import ( type ConvertorHandlerContract interface { MainConvertor() FfPathSelection() + GetFfmpegVersion() (string, error) + GetFfprobeVersion() (string, error) } type ConvertorHandler struct { @@ -54,6 +56,14 @@ func (h ConvertorHandler) FfPathSelection() { h.convertorView.SelectFFPath(ffmpeg, ffprobe, h.saveSettingFFPath, h.MainConvertor) } +func (h ConvertorHandler) GetFfmpegVersion() (string, error) { + return h.convertorService.GetFFmpegVesrion() +} + +func (h ConvertorHandler) GetFfprobeVersion() (string, error) { + return h.convertorService.GetFFprobeVersion() +} + func (h ConvertorHandler) runConvert(setting convertor.HandleConvertSetting, progressbar *widget.ProgressBar) error { totalDuration, err := h.convertorService.GetTotalDuration(setting.VideoFileInput) if err != nil { diff --git a/src/handler/menu.go b/src/handler/menu.go index acf3ea1..1cdda97 100644 --- a/src/handler/menu.go +++ b/src/handler/menu.go @@ -2,6 +2,7 @@ package handler import ( "ffmpegGui/localizer" + "ffmpegGui/menu" "fyne.io/fyne/v2" "github.com/nicksnyder/go-i18n/v2/i18n" ) @@ -18,6 +19,7 @@ type menuItems struct { type MenuHandler struct { convertorHandler ConvertorHandlerContract + menuView menu.ViewContract localizerService localizer.ServiceContract localizerView localizer.ViewContract localizerRepository localizer.RepositoryContract @@ -26,12 +28,14 @@ type MenuHandler struct { func NewMenuHandler( convertorHandler ConvertorHandlerContract, + menuView menu.ViewContract, localizerService localizer.ServiceContract, localizerView localizer.ViewContract, localizerRepository localizer.RepositoryContract, ) *MenuHandler { return &MenuHandler{ convertorHandler: convertorHandler, + menuView: menuView, localizerService: localizerService, localizerView: localizerView, localizerRepository: localizerRepository, @@ -40,6 +44,13 @@ func NewMenuHandler( } func (h MenuHandler) GetMainMenu() *fyne.MainMenu { + settings := h.getMenuSettings() + help := h.getMenuHelp() + + return fyne.NewMainMenu(settings, help) +} + +func (h MenuHandler) getMenuSettings() *fyne.Menu { quit := fyne.NewMenuItem(h.localizerService.GetMessage(&i18n.LocalizeConfig{ MessageID: "exit", }), nil) @@ -61,7 +72,38 @@ func (h MenuHandler) GetMainMenu() *fyne.MainMenu { }), languageSelection, ffPathSelection, quit) h.menuItems.menu["settings"] = settings - return fyne.NewMainMenu(settings) + return settings +} + +func (h MenuHandler) getMenuHelp() *fyne.Menu { + about := fyne.NewMenuItem(h.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "about", + }), h.openAbout) + h.menuItems.menuItem["about"] = about + + help := fyne.NewMenu(h.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "help", + }), about) + h.menuItems.menu["help"] = help + + return help +} + +func (h MenuHandler) openAbout() { + ffmpeg, err := h.convertorHandler.GetFfmpegVersion() + if err != nil { + ffmpeg = h.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "errorFFmpegVersion", + }) + } + ffprobe, err := h.convertorHandler.GetFfprobeVersion() + if err != nil { + ffprobe = h.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "errorFFprobeVersion", + }) + } + + h.menuView.About(ffmpeg, ffprobe) } func (h MenuHandler) LanguageSelection() { diff --git a/src/icon.png b/src/icon.png index 067ee50097ee04538ee79d50bd3427c750e16e3c..6eaf8f62869d7c2c6d0313a8f11557fdb18cfee2 100644 GIT binary patch literal 29642 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 de$*p40u_Uft`y_pI-H@AuEQTr79?^Q3m|s@k=y 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 diff --git a/src/languages/active.en.toml b/src/languages/active.en.toml index befaf9b..e489dcb 100644 --- a/src/languages/active.en.toml +++ b/src/languages/active.en.toml @@ -1,3 +1,11 @@ +[about] +hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" +other = "About" + +[aboutText] +hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" +other = "A simple interface for the FFmpeg console utility. \nBut I am not the author of the FFmpeg utility itself." + [buttonForSelectedDirTitle] hash = "sha1-52b13f1b13e82d22e8c4102332db5d4ec551247b" other = "Folder where it will be saved:" @@ -46,10 +54,18 @@ other = "could not create file 'database' in folder 'data'" hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0" other = "this is not FFmpeg" +[errorFFmpegVersion] +hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" +other = "Could not determine FFmpeg version" + [errorFFprobe] hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8" other = "this is not FFprobe" +[errorFFprobeVersion] +hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" +other = "Failed to determine FFprobe version" + [errorSelectedFolderSave] hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c" other = "You haven't selected a folder to save!" @@ -58,10 +74,22 @@ other = "You haven't selected a folder to save!" hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" other = "Exit" +[ffmpegLGPL] +hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" +other = "This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." + +[ffmpegTrademark] +hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" +other = "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project." + [fileVideoForConversionTitle] hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be" other = "File for conversion:" +[help] +hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" +other = "Help" + [languageSelectionFormHead] hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003" other = "Switch language" @@ -70,13 +98,25 @@ other = "Switch language" hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b" other = "Choose language" +[licenseLink] +hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" +other = "License information" + [pathToFfmpeg] -hash = "sha1-2eba439f365640ff77e0ed6a7486fcb662573850" -other = "Path to ffmpeg:" +hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" +other = "Path to FFmpeg:" [pathToFfprobe] -hash = "sha1-02ad53337801906f8ebfee4616100dd9f43eabd7" -other = "Path to ffprobe:" +hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" +other = "Path to FFprobe:" + +[programmLink] +hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" +other = "Project website" + +[programmVersion] +hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" +other = "**Program version:** {{.Version}}" [save] hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" diff --git a/src/languages/active.kk.toml b/src/languages/active.kk.toml index e6dbed0..248d38b 100644 --- a/src/languages/active.kk.toml +++ b/src/languages/active.kk.toml @@ -1,3 +1,11 @@ +[about] +hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" +other = "Бағдарлама туралы" + +[aboutText] +hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" +other = "FFmpeg консоль утилитасы үшін қарапайым интерфейс. \nБірақ мен FFmpeg утилитасының авторы емеспін." + [buttonForSelectedDirTitle] hash = "sha1-52b13f1b13e82d22e8c4102332db5d4ec551247b" other = "Файлды сақтауға арналған каталог:" @@ -46,10 +54,18 @@ other = "'data' қалтасында 'database' файлын жасау мүмк hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0" other = "бұл FFmpeg емес" +[errorFFmpegVersion] +hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" +other = "FFmpeg нұсқасын анықтау мүмкін болмады" + [errorFFprobe] hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8" other = "бұл FFprobe емес" +[errorFFprobeVersion] +hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" +other = "FFprobe нұсқасын анықтау мүмкін болмады" + [errorSelectedFolderSave] hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c" other = "Сіз сақталатын қалтаны таңдамадыңыз!" @@ -58,10 +74,22 @@ other = "Сіз сақталатын қалтаны таңдамадыңыз!" hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" other = "Шығу" +[ffmpegLGPL] +hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" +other = "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)** астында **FFmpeg** жобасының кітапханаларын пайдаланады." + +[ffmpegTrademark] +hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" +other = "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі." + [fileVideoForConversionTitle] hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be" other = "Түрлендіруге арналған файл:" +[help] +hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" +other = "Анықтама" + [languageSelectionFormHead] hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003" other = "Тілді ауыстыру" @@ -70,13 +98,25 @@ other = "Тілді ауыстыру" hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b" other = "Тілді таңдаңыз" +[licenseLink] +hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" +other = "Лицензия туралы ақпарат" + [pathToFfmpeg] -hash = "sha1-2eba439f365640ff77e0ed6a7486fcb662573850" -other = "ffmpeg жол:" +hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" +other = "FFmpeg жол:" [pathToFfprobe] -hash = "sha1-02ad53337801906f8ebfee4616100dd9f43eabd7" -other = "ffprobe жол:" +hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" +other = "FFprobe жол:" + +[programmLink] +hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" +other = "Жобаның веб-сайты" + +[programmVersion] +hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" +other = "**Бағдарлама нұсқасы:** {{.Version}}" [save] hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" diff --git a/src/languages/active.ru.toml b/src/languages/active.ru.toml index be7cc00..a4a8e4c 100644 --- a/src/languages/active.ru.toml +++ b/src/languages/active.ru.toml @@ -1,3 +1,5 @@ +about = "О программе" +aboutText = "Простенький интерфейс для консольной утилиты FFmpeg. \nНо я не являюсь автором самой утилиты FFmpeg." buttonForSelectedDirTitle = "Папка куда будет сохраняться:" cancel = "Отмена" changeFFPath = "FFmpeg и FFprobe" @@ -10,14 +12,22 @@ error = "Произошла ошибка!" errorConverter = "не смогли отконвертировать видео" errorDatabase = "не смогли создать файл 'database' в папке 'data'" errorFFmpeg = "это не FFmpeg" +errorFFmpegVersion = "Не смогли определить версию FFmpeg" errorFFprobe = "это не FFprobe" +errorFFprobeVersion = "Не смогли определить версию FFprobe" errorSelectedFolderSave = "Не выбрали папку для сохранения!" exit = "Выход" +ffmpegLGPL = "Это программное обеспечение использует библиотеки из проекта **FFmpeg** под **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." +ffmpegTrademark = "**FFmpeg** — торговая марка **[Fabrice Bellard](http://bellard.org/)** , создателя проекта **[FFmpeg](https://ffmpeg.org/about.html)**." fileVideoForConversionTitle = "Файл для ковертации:" +help = "Справка" languageSelectionFormHead = "Переключить язык" languageSelectionHead = "Выберите язык" -pathToFfmpeg = "Путь к ffmpeg:" -pathToFfprobe = "Путь к ffprobe:" +licenseLink = "Сведения о лицензии" +pathToFfmpeg = "Путь к FFmpeg:" +pathToFfprobe = "Путь к FFprobe:" +programmLink = "Сайт проекта" +programmVersion = "**Версия программы:** {{.Version}}" save = "Сохранить" selectFFPathTitle = "Укажите путь к FFmpeg и к FFprobe" settings = "Настройки" diff --git a/src/languages/translate.en.toml b/src/languages/translate.en.toml index 959b136..8595e8a 100644 --- a/src/languages/translate.en.toml +++ b/src/languages/translate.en.toml @@ -1,3 +1,47 @@ -[changeFFPath] -hash = "sha1-46793a2844600d0eb19fa3540fb9564ee5705491" -other = "FFmpeg and FFprobe" +[about] +hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" +other = "About" + +[aboutText] +hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" +other = "A simple interface for the FFmpeg console utility. \nBut I am not the author of the FFmpeg utility itself." + +[errorFFmpegVersion] +hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" +other = "Could not determine FFmpeg version" + +[errorFFprobeVersion] +hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" +other = "Failed to determine FFprobe version" + +[ffmpegLGPL] +hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" +other = "This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." + +[ffmpegTrademark] +hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" +other = "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project." + +[help] +hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" +other = "Help" + +[licenseLink] +hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" +other = "License information" + +[pathToFfmpeg] +hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" +other = "Path to FFmpeg:" + +[pathToFfprobe] +hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" +other = "Path to FFprobe:" + +[programmLink] +hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" +other = "Project website" + +[programmVersion] +hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" +other = "**Program version:** {{.Version}}" diff --git a/src/languages/translate.kk.toml b/src/languages/translate.kk.toml index cc14cef..fc014d2 100644 --- a/src/languages/translate.kk.toml +++ b/src/languages/translate.kk.toml @@ -1,3 +1,47 @@ -[changeFFPath] -hash = "sha1-46793a2844600d0eb19fa3540fb9564ee5705491" -other = "FFmpeg және FFprobe" +[about] +hash = "sha1-3da0b9ef719fd707f443ac00404447f29445976f" +other = "Бағдарлама туралы" + +[aboutText] +hash = "sha1-8bd565814118ba8b90c40eb5b62acf8d2676e7d6" +other = "FFmpeg консоль утилитасы үшін қарапайым интерфейс. \nБірақ мен FFmpeg утилитасының авторы емеспін." + +[errorFFmpegVersion] +hash = "sha1-9a4148d42186b6b32cf83bef726e23022c53283f" +other = "FFmpeg нұсқасын анықтау мүмкін болмады" + +[errorFFprobeVersion] +hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" +other = "FFprobe нұсқасын анықтау мүмкін болмады" + +[ffmpegLGPL] +hash = "sha1-d395b16cc8f8eab98a8a970307c5b010ba22dde6" +other = "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)** астында **FFmpeg** жобасының кітапханаларын пайдаланады." + +[ffmpegTrademark] +hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" +other = "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі." + +[help] +hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" +other = "Анықтама" + +[licenseLink] +hash = "sha1-ea18ab849f0eea030d770da82c2a6b3484a7bd13" +other = "Лицензия туралы ақпарат" + +[pathToFfmpeg] +hash = "sha1-fafc50f1db0f720fe83a96cd70a9e1ad824e96b6" +other = "FFmpeg жол:" + +[pathToFfprobe] +hash = "sha1-b872edc9633a2e81ef678dc46fe46a7e91732024" +other = "FFprobe жол:" + +[programmLink] +hash = "sha1-18f9a3fad6aacefe1b05eed23122800b391ff5ca" +other = "Жобаның веб-сайты" + +[programmVersion] +hash = "sha1-fa2e4994a301bb24bc2a8fa166e5486ea95a7475" +other = "**Бағдарлама нұсқасы:** {{.Version}}" diff --git a/src/main.go b/src/main.go index c127694..f3d6fc0 100644 --- a/src/main.go +++ b/src/main.go @@ -6,6 +6,7 @@ import ( error2 "ffmpegGui/error" "ffmpegGui/handler" "ffmpegGui/localizer" + "ffmpegGui/menu" "ffmpegGui/migration" "ffmpegGui/setting" "fyne.io/fyne/v2" @@ -19,7 +20,7 @@ import ( "os" ) -//const appVersion string = "0.2.0" +const appVersion string = "0.3.0" func main() { a := app.New() @@ -27,7 +28,7 @@ func main() { if err == nil { a.SetIcon(iconResource) } - w := a.NewWindow("FFMpeg GUI!") + w := a.NewWindow("GUI for FFmpeg") w.Resize(fyne.Size{Width: 800, Height: 600}) w.CenterOnScreen() @@ -85,7 +86,8 @@ func main() { convertorHandler := handler.NewConvertorHandler(convertorService, convertorView, convertorRepository, localizerService) localizerRepository := localizer.NewRepository(settingRepository) - mainMenu := handler.NewMenuHandler(convertorHandler, localizerService, localizerView, localizerRepository) + menuView := menu.NewView(w, a, appVersion, localizerService) + mainMenu := handler.NewMenuHandler(convertorHandler, menuView, localizerService, localizerView, localizerRepository) mainHandler := handler.NewMainHandler(convertorHandler, mainMenu, localizerRepository, localizerService) mainHandler.Start() diff --git a/src/menu/view.go b/src/menu/view.go new file mode 100644 index 0000000..d58f3de --- /dev/null +++ b/src/menu/view.go @@ -0,0 +1,167 @@ +package menu + +import ( + "ffmpegGui/localizer" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" + "github.com/nicksnyder/go-i18n/v2/i18n" + "golang.org/x/image/colornames" + "net/url" +) + +type ViewContract interface { + About(ffmpegVersion string, ffprobeVersion string) +} + +type View struct { + w fyne.Window + app fyne.App + appVersion string + localizerService localizer.ServiceContract +} + +func NewView(w fyne.Window, app fyne.App, appVersion string, localizerService localizer.ServiceContract) *View { + return &View{ + w: w, + app: app, + appVersion: appVersion, + localizerService: localizerService, + } +} + +func (v View) About(ffmpegVersion string, ffprobeVersion string) { + view := v.app.NewWindow(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "about", + })) + view.Resize(fyne.Size{Width: 793, Height: 550}) + view.SetFixedSize(true) + + programmName := canvas.NewText(" GUI for FFmpeg", colornames.Darkgreen) + programmName.TextStyle = fyne.TextStyle{Bold: true} + programmName.TextSize = 20 + + programmLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "programmLink", + }), &url.URL{ + Scheme: "https", + Host: "git.kor-elf.net", + Path: "kor-elf/gui-for-ffmpeg/releases", + }) + + licenseLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "licenseLink", + }), &url.URL{ + Scheme: "https", + Host: "git.kor-elf.net", + Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE", + }) + + programmVersion := widget.NewRichTextFromMarkdown(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "programmVersion", + TemplateData: map[string]string{ + "Version": v.appVersion, + }, + })) + + aboutText := widget.NewRichText( + &widget.TextSegment{ + Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "aboutText", + }), + }, + ) + image := canvas.NewImageFromFile("icon.png") + image.SetMinSize(fyne.Size{Width: 100, Height: 100}) + image.FillMode = canvas.ImageFillContain + + ffmpegTrademark := widget.NewRichTextFromMarkdown(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "ffmpegTrademark", + })) + ffmpegLGPL := widget.NewRichTextFromMarkdown(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "ffmpegLGPL", + })) + + view.SetContent( + container.NewScroll(container.NewVBox( + container.NewBorder(nil, nil, container.NewVBox(image), nil, container.NewVBox( + programmName, + programmVersion, + aboutText, + ffmpegTrademark, + ffmpegLGPL, + v.getCopyright(), + container.NewHBox(programmLink, licenseLink), + )), + v.getAboutFfmpeg(ffmpegVersion), + v.getAboutFfprobe(ffprobeVersion), + )), + ) + view.CenterOnScreen() + view.Show() +} + +func (v View) getCopyright() *widget.RichText { + return widget.NewRichTextFromMarkdown("Copyright (c) 2024 **[Leonid Nikitin (kor-elf)](https://git.kor-elf.net/kor-elf/)**.") +} + +func (v View) getAboutFfmpeg(version string) *fyne.Container { + programmName := canvas.NewText(" FFmpeg", colornames.Darkgreen) + programmName.TextStyle = fyne.TextStyle{Bold: true} + programmName.TextSize = 20 + + programmLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "programmLink", + }), &url.URL{ + Scheme: "https", + Host: "ffmpeg.org", + Path: "", + }) + + licenseLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "licenseLink", + }), &url.URL{ + Scheme: "https", + Host: "ffmpeg.org", + Path: "legal.html", + }) + + return container.NewVBox( + programmName, + widget.NewLabel(version), + widget.NewRichTextFromMarkdown("**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project."), + widget.NewRichTextFromMarkdown("This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**."), + container.NewHBox(programmLink, licenseLink), + ) +} + +func (v View) getAboutFfprobe(version string) *fyne.Container { + programmName := canvas.NewText(" FFprobe", colornames.Darkgreen) + programmName.TextStyle = fyne.TextStyle{Bold: true} + programmName.TextSize = 20 + + programmLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "programmLink", + }), &url.URL{ + Scheme: "https", + Host: "ffmpeg.org", + Path: "ffprobe.html", + }) + + licenseLink := widget.NewHyperlink(v.localizerService.GetMessage(&i18n.LocalizeConfig{ + MessageID: "licenseLink", + }), &url.URL{ + Scheme: "https", + Host: "ffmpeg.org", + Path: "legal.html", + }) + + return container.NewVBox( + programmName, + widget.NewLabel(version), + widget.NewRichTextFromMarkdown("**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project."), + widget.NewRichTextFromMarkdown("This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**."), + container.NewHBox(programmLink, licenseLink), + ) +}