Make it possible to drag and drop multiple files

It is now possible to add multiple files before sending them to the processing queue.
This commit is contained in:
2025-05-25 01:25:40 +05:00
parent 82167f042f
commit 84b36dd29e
11 changed files with 741 additions and 255 deletions

View File

@@ -24,30 +24,30 @@ type ConversionContract interface {
}
type Conversion struct {
app kernel.AppContract
form *form
conversionMessage *canvas.Text
fileForConversion *fileForConversion
directoryForSaving *directoryForSaving
overwriteOutputFiles *overwriteOutputFiles
selectEncoder *selectEncoder
runConvert func(setting HandleConvertSetting)
app kernel.AppContract
form *form
conversionMessage *canvas.Text
fileForConversion *fileForConversion
directoryForSaving *directoryForSaving
overwriteOutputFiles *overwriteOutputFiles
selectEncoder *selectEncoder
runConvert func(setting HandleConvertSetting)
itemsToConvertService kernel.ItemsToConvertContract
}
type HandleConvertSetting struct {
FileInput kernel.File
DirectoryForSave string
OverwriteOutputFiles bool
Format string
Encoder encoder2.EncoderContract
}
func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContract, runConvert func(setting HandleConvertSetting), settingDirectoryForSaving setting.DirectoryForSavingContract) *Conversion {
func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContract, runConvert func(setting HandleConvertSetting), settingDirectoryForSaving setting.DirectoryForSavingContract, itemsToConvertService kernel.ItemsToConvertContract) *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)
fileForConversion := newFileForConversion(app, itemsToConvertService)
directoryForSaving := newDirectoryForSaving(app, settingDirectoryForSaving)
overwriteOutputFiles := newOverwriteOutputFiles(app)
selectEncoder := newSelectEncoder(app, formats)
@@ -85,14 +85,15 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr
form := newForm(app, items)
return &Conversion{
app: app,
form: form,
conversionMessage: conversionMessage,
fileForConversion: fileForConversion,
directoryForSaving: directoryForSaving,
overwriteOutputFiles: overwriteOutputFiles,
selectEncoder: selectEncoder,
runConvert: runConvert,
app: app,
form: form,
conversionMessage: conversionMessage,
fileForConversion: fileForConversion,
directoryForSaving: directoryForSaving,
overwriteOutputFiles: overwriteOutputFiles,
selectEncoder: selectEncoder,
runConvert: runConvert,
itemsToConvertService: itemsToConvertService,
}
}
@@ -121,20 +122,32 @@ func (c Conversion) changeEncoder(encoder encoder2.EncoderContract) {
}
func (c Conversion) AfterViewContent() {
c.form.form.Disable()
if len(c.itemsToConvertService.GetItems()) == 0 {
c.form.form.Disable()
}
}
func (c Conversion) selectFileForConversion(err error) {
c.conversionMessage.Text = ""
if err != nil {
c.form.form.Disable()
return
if len(c.itemsToConvertService.GetItems()) == 0 {
if err != nil {
c.form.form.Disable()
return
}
}
c.form.form.Enable()
}
func (c Conversion) submit() {
if len(c.itemsToConvertService.GetItems()) == 0 {
showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "errorNoFilesAddedForConversion",
})))
c.enableFormConversion()
return
}
if len(c.directoryForSaving.path) == 0 {
showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "errorSelectedFolderSave",
@@ -160,18 +173,17 @@ func (c Conversion) submit() {
c.directoryForSaving.button.Disable()
c.form.form.Disable()
setting := HandleConvertSetting{
FileInput: *c.fileForConversion.file,
c.runConvert(HandleConvertSetting{
DirectoryForSave: c.directoryForSaving.path,
OverwriteOutputFiles: c.overwriteOutputFiles.IsChecked(),
Format: c.selectEncoder.SelectFormat.Selected,
Encoder: c.selectEncoder.Encoder,
}
c.runConvert(setting)
})
c.enableFormConversion()
c.fileForConversion.message.Text = ""
c.form.form.Disable()
if len(c.itemsToConvertService.GetItems()) == 0 {
c.form.form.Disable()
}
}
func (c Conversion) enableFormConversion() {
@@ -188,44 +200,49 @@ type fileForConversion struct {
changeCallbacks map[int]func(err error)
}
func newFileForConversion(app kernel.AppContract) *fileForConversion {
func newFileForConversion(app kernel.AppContract, itemsToConvertService kernel.ItemsToConvertContract) *fileForConversion {
message := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255})
fileForConversion := &fileForConversion{
file: &kernel.File{},
message: message,
changeCallbacks: map[int]func(err error){},
}
buttonTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "choose",
}) + "\n\r\n\r" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
}) + "\n" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "or",
}) + "\n\r\n\r" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "dragAndDrop1File",
}) + "\n" + app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "dragAndDropFiles",
})
fileForConversion.message = canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255})
fileForConversion.message.TextSize = 16
fileForConversion.message.TextStyle = fyne.TextStyle{Bold: true}
var locationURI fyne.ListableURI
fileForConversion.button = widget.NewButton(buttonTitle, func() {
app.GetWindow().NewFileOpen(func(r fyne.URIReadCloser, err error) {
fyne.Do(func() {
fileForConversion.message.Text = ""
fileForConversion.message.Refresh()
})
if err != nil {
fileForConversion.message.Text = err.Error()
setStringErrorStyle(fileForConversion.message)
fyne.Do(func() {
fileForConversion.message.Text = err.Error()
fileForConversion.message.Refresh()
})
fileForConversion.eventSelectFile(err)
return
}
if r == nil {
return
}
app.GetWindow().GetLayout().GetRightTabs().SelectAddedFilesTab()
fileForConversion.file.Path = r.URI().Path()
fileForConversion.file.Name = r.URI().Name()
fileForConversion.file.Ext = r.URI().Extension()
fileForConversion.message.Text = r.URI().Path()
setStringSuccessStyle(fileForConversion.message)
itemsToConvertService.Add(&kernel.File{
Path: r.URI().Path(),
Name: r.URI().Name(),
Ext: r.URI().Extension(),
})
fileForConversion.eventSelectFile(nil)
@@ -239,43 +256,41 @@ func newFileForConversion(app kernel.AppContract) *fileForConversion {
return
}
if len(uris) > 1 {
isError := false
for _, uri := range uris {
info, err := os.Stat(uri.Path())
if err != nil {
isError = true
continue
}
if info.IsDir() {
isError = true
continue
}
itemsToConvertService.Add(&kernel.File{
Path: uri.Path(),
Name: uri.Name(),
Ext: uri.Extension(),
})
fileForConversion.eventSelectFile(nil)
listableURI := storage.NewFileURI(filepath.Dir(uri.Path()))
locationURI, _ = storage.ListerForURI(listableURI)
}
if isError {
fileForConversion.message.Text = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "errorDragAndDrop1File",
MessageID: "errorDragAndDropFile",
})
setStringErrorStyle(fileForConversion.message)
fileForConversion.eventSelectFile(errors.New(fileForConversion.message.Text))
return
}
uri := uris[0]
info, err := os.Stat(uri.Path())
if err != nil {
fileForConversion.message.Text = err.Error()
setStringErrorStyle(fileForConversion.message)
fileForConversion.eventSelectFile(err)
return
}
if info.IsDir() {
fileForConversion.message.Text = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
MessageID: "errorIsFolder",
} else {
fyne.Do(func() {
fileForConversion.message.Text = ""
fileForConversion.message.Refresh()
})
setStringErrorStyle(fileForConversion.message)
fileForConversion.eventSelectFile(errors.New(fileForConversion.message.Text))
return
}
fileForConversion.file.Path = uri.Path()
fileForConversion.file.Name = uri.Name()
fileForConversion.file.Ext = uri.Extension()
fileForConversion.message.Text = uri.Path()
setStringSuccessStyle(fileForConversion.message)
fileForConversion.eventSelectFile(nil)
listableURI := storage.NewFileURI(filepath.Dir(uri.Path()))
locationURI, _ = storage.ListerForURI(listableURI)
})
return fileForConversion