From 16b32e0167fb1afd9672e72f09d2d5a44c3163d9 Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Sun, 11 May 2025 01:29:07 +0500 Subject: [PATCH] Add persistent storage for directory saving setting Introduced `DirectoryForSaving` for managing directory paths persistently. Integrated the new setting into relevant modules, ensuring the selected directory is saved and loaded across sessions. --- convertor/view/conversion.go | 38 +++++++++++++++++++++++++++++---- handler/convertor.go | 22 +++++++++++-------- main.go | 4 +++- setting/directory_for_saving.go | 22 +++++++++++++++++++ 4 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 setting/directory_for_saving.go diff --git a/convertor/view/conversion.go b/convertor/view/conversion.go index ac5783d..eee6aae 100644 --- a/convertor/view/conversion.go +++ b/convertor/view/conversion.go @@ -11,6 +11,7 @@ import ( encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel/encoder" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "path/filepath" @@ -40,13 +41,13 @@ type HandleConvertSetting struct { Encoder encoder2.EncoderContract } -func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContract, runConvert func(setting HandleConvertSetting)) *Conversion { +func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContract, runConvert func(setting HandleConvertSetting), settingDirectoryForSaving setting.DirectoryForSavingContract) *Conversion { conversionMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) conversionMessage.TextSize = 16 conversionMessage.TextStyle = fyne.TextStyle{Bold: true} fileForConversion := newFileForConversion(app) - directoryForSaving := newDirectoryForSaving(app) + directoryForSaving := newDirectoryForSaving(app, settingDirectoryForSaving) overwriteOutputFiles := newOverwriteOutputFiles(app) selectEncoder := newSelectEncoder(app, formats) @@ -247,7 +248,7 @@ type directoryForSaving struct { path string } -func newDirectoryForSaving(app kernel.AppContract) *directoryForSaving { +func newDirectoryForSaving(app kernel.AppContract, settingDirectoryForSaving setting.DirectoryForSavingContract) *directoryForSaving { directoryForSaving := &directoryForSaving{ path: "", } @@ -262,6 +263,13 @@ func newDirectoryForSaving(app kernel.AppContract) *directoryForSaving { var locationURI fyne.ListableURI + location, err := getDirectoryForSaving(settingDirectoryForSaving) + if err == nil { + directoryForSaving.path = location.Path() + directoryForSaving.message.Text = location.Path() + setStringSuccessStyle(directoryForSaving.message) + } + directoryForSaving.button = widget.NewButton(buttonTitle, func() { app.GetWindow().NewFolderOpen(func(r fyne.ListableURI, err error) { if err != nil { @@ -277,7 +285,11 @@ func newDirectoryForSaving(app kernel.AppContract) *directoryForSaving { directoryForSaving.message.Text = r.Path() setStringSuccessStyle(directoryForSaving.message) - locationURI, _ = storage.ListerForURI(r) + locationURI, err = storage.ListerForURI(r) + + if err == nil { + _, _ = settingDirectoryForSaving.SaveDirectoryForSaving(locationURI.Path()) + } }, locationURI) }) @@ -285,6 +297,24 @@ func newDirectoryForSaving(app kernel.AppContract) *directoryForSaving { return directoryForSaving } +func getDirectoryForSaving(settingDirectoryForSaving setting.DirectoryForSavingContract) (fyne.ListableURI, error) { + path, err := settingDirectoryForSaving.GetDirectoryForSaving() + if err != nil { + return nil, err + } + + if len(path) > 0 { + path = "file://" + path + } + + uri, err := storage.ParseURI(path) + if err != nil { + return nil, err + } + + return storage.ListerForURI(uri) +} + type overwriteOutputFiles struct { checkbox *widget.Check isChecked bool diff --git a/handler/convertor.go b/handler/convertor.go index 5e099ea..4f0b2ab 100644 --- a/handler/convertor.go +++ b/handler/convertor.go @@ -7,6 +7,7 @@ import ( error2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/error" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/helper" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" "github.com/nicksnyder/go-i18n/v2/i18n" ) @@ -18,10 +19,11 @@ type ConvertorHandlerContract interface { } type ConvertorHandler struct { - app kernel.AppContract - convertorView convertor.ViewContract - errorView error2.ViewContract - convertorRepository convertor.RepositoryContract + app kernel.AppContract + convertorView convertor.ViewContract + errorView error2.ViewContract + convertorRepository convertor.RepositoryContract + settingDirectoryForSaving setting.DirectoryForSavingContract } func NewConvertorHandler( @@ -29,12 +31,14 @@ func NewConvertorHandler( convertorView convertor.ViewContract, errorView error2.ViewContract, convertorRepository convertor.RepositoryContract, + settingDirectoryForSaving setting.DirectoryForSavingContract, ) *ConvertorHandler { return &ConvertorHandler{ - app: app, - convertorView: convertorView, - errorView: errorView, - convertorRepository: convertorRepository, + app: app, + convertorView: convertorView, + errorView: errorView, + convertorRepository: convertorRepository, + settingDirectoryForSaving: settingDirectoryForSaving, } } @@ -45,7 +49,7 @@ func (h ConvertorHandler) MainConvertor() { h.errorView.PanicError(err) return } - conversion := view.NewConversion(h.app, formats, h.runConvert) + conversion := view.NewConversion(h.app, formats, h.runConvert, h.settingDirectoryForSaving) h.convertorView.Main(conversion) return } diff --git a/main.go b/main.go index d35b27d..2294a2b 100644 --- a/main.go +++ b/main.go @@ -73,6 +73,8 @@ func main() { } settingRepository := setting.NewRepository(db) + settingDirectoryForSaving := setting.NewSettingDirectoryForSaving(settingRepository) + convertorRepository := convertor.NewRepository(settingRepository) pathFFmpeg, err := convertorRepository.GetPathFfmpeg() if err != nil && errors.Is(err, dberror.ErrRecordNotFound) == false { @@ -95,7 +97,7 @@ func main() { localizerView := localizer.NewView(application) convertorView := convertor.NewView(application) - convertorHandler := handler.NewConvertorHandler(application, convertorView, errorView, convertorRepository) + convertorHandler := handler.NewConvertorHandler(application, convertorView, errorView, convertorRepository, settingDirectoryForSaving) localizerRepository := localizer.NewRepository(settingRepository) menuView := menu.NewView(application) diff --git a/setting/directory_for_saving.go b/setting/directory_for_saving.go new file mode 100644 index 0000000..706560a --- /dev/null +++ b/setting/directory_for_saving.go @@ -0,0 +1,22 @@ +package setting + +type DirectoryForSavingContract interface { + GetDirectoryForSaving() (string, error) + SaveDirectoryForSaving(path string) (Setting, error) +} + +type DirectoryForSaving struct { + settingRepository RepositoryContract +} + +func NewSettingDirectoryForSaving(settingRepository RepositoryContract) *DirectoryForSaving { + return &DirectoryForSaving{settingRepository: settingRepository} +} + +func (setting DirectoryForSaving) GetDirectoryForSaving() (string, error) { + return setting.settingRepository.GetValue("directoryForSaving") +} + +func (setting DirectoryForSaving) SaveDirectoryForSaving(path string) (Setting, error) { + return setting.settingRepository.CreateOrUpdate("directoryForSaving", path) +}