Made it possible for each encoder to add its own parameters.
Added preset option for libx264.
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/storage"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items"
|
||||
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"
|
||||
@@ -22,7 +23,7 @@ type ConversionContract interface {
|
||||
|
||||
type Conversion struct {
|
||||
app kernel.AppContract
|
||||
form *widget.Form
|
||||
form *form
|
||||
conversionMessage *canvas.Text
|
||||
fileForConversion *fileForConversion
|
||||
directoryForSaving *directoryForSaving
|
||||
@@ -49,8 +50,7 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr
|
||||
overwriteOutputFiles := newOverwriteOutputFiles(app)
|
||||
selectEncoder := newSelectEncoder(app, formats)
|
||||
|
||||
form := widget.NewForm()
|
||||
form.Items = []*widget.FormItem{
|
||||
items := []*widget.FormItem{
|
||||
{
|
||||
Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "fileForConversionTitle"}),
|
||||
Widget: fileForConversion.button,
|
||||
@@ -80,9 +80,7 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr
|
||||
Widget: selectEncoder.SelectEncoder,
|
||||
},
|
||||
}
|
||||
form.SubmitText = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
|
||||
MessageID: "converterVideoFilesSubmitTitle",
|
||||
})
|
||||
form := newForm(app, items)
|
||||
|
||||
return &Conversion{
|
||||
app: app,
|
||||
@@ -97,27 +95,41 @@ func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContr
|
||||
}
|
||||
|
||||
func (c Conversion) GetContent() fyne.CanvasObject {
|
||||
c.form.OnSubmit = c.submit
|
||||
c.form.form.OnSubmit = c.submit
|
||||
c.fileForConversion.AddChangeCallback(c.selectFileForConversion)
|
||||
c.selectEncoder.AddChangeCallback(c.changeEncoder)
|
||||
if c.selectEncoder.Encoder != nil {
|
||||
c.selectEncoder.SelectEncoder.SetSelectedIndex(c.selectEncoder.SelectEncoder.SelectedIndex())
|
||||
}
|
||||
|
||||
return container.NewVBox(
|
||||
c.form,
|
||||
c.form.form,
|
||||
c.conversionMessage,
|
||||
)
|
||||
}
|
||||
|
||||
func (c Conversion) changeEncoder(encoder encoder2.EncoderContract) {
|
||||
items := []*widget.FormItem{}
|
||||
|
||||
if form_items.Views[encoder.GetName()] != nil {
|
||||
items = form_items.Views[encoder.GetName()](encoder, c.app)
|
||||
}
|
||||
|
||||
c.form.ChangeItems(items)
|
||||
}
|
||||
|
||||
func (c Conversion) AfterViewContent() {
|
||||
c.form.Disable()
|
||||
c.form.form.Disable()
|
||||
}
|
||||
|
||||
func (c Conversion) selectFileForConversion(err error) {
|
||||
c.conversionMessage.Text = ""
|
||||
if err != nil {
|
||||
c.form.Disable()
|
||||
c.form.form.Disable()
|
||||
return
|
||||
}
|
||||
|
||||
c.form.Enable()
|
||||
c.form.form.Enable()
|
||||
}
|
||||
|
||||
func (c Conversion) submit() {
|
||||
@@ -144,7 +156,7 @@ func (c Conversion) submit() {
|
||||
|
||||
c.fileForConversion.button.Disable()
|
||||
c.directoryForSaving.button.Disable()
|
||||
c.form.Disable()
|
||||
c.form.form.Disable()
|
||||
|
||||
setting := HandleConvertSetting{
|
||||
FileInput: *c.fileForConversion.file,
|
||||
@@ -157,13 +169,13 @@ func (c Conversion) submit() {
|
||||
c.enableFormConversion()
|
||||
|
||||
c.fileForConversion.message.Text = ""
|
||||
c.form.Disable()
|
||||
c.form.form.Disable()
|
||||
}
|
||||
|
||||
func (c Conversion) enableFormConversion() {
|
||||
c.fileForConversion.button.Enable()
|
||||
c.directoryForSaving.button.Enable()
|
||||
c.form.Enable()
|
||||
c.form.form.Enable()
|
||||
}
|
||||
|
||||
type fileForConversion struct {
|
||||
@@ -301,17 +313,22 @@ type selectEncoder struct {
|
||||
SelectFormat *widget.Select
|
||||
SelectEncoder *widget.Select
|
||||
Encoder encoder2.EncoderContract
|
||||
|
||||
changeCallbacks map[int]func(encoder encoder2.EncoderContract)
|
||||
}
|
||||
|
||||
func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsContract) *selectEncoder {
|
||||
selectEncoder := &selectEncoder{}
|
||||
selectEncoder := &selectEncoder{
|
||||
changeCallbacks: map[int]func(encoder encoder2.EncoderContract){},
|
||||
}
|
||||
|
||||
encoders := map[int]encoder2.EncoderDataContract{}
|
||||
selectEncoder.SelectEncoder = widget.NewSelect([]string{}, func(s string) {
|
||||
if encoders[selectEncoder.SelectEncoder.SelectedIndex()] == nil {
|
||||
return
|
||||
}
|
||||
selectEncoder.Encoder = encoders[selectEncoder.SelectEncoder.SelectedIndex()].NewEncoder()
|
||||
selectEncoderData := encoders[selectEncoder.SelectEncoder.SelectedIndex()]
|
||||
selectEncoder.ChangeEncoder(selectEncoderData.NewEncoder())
|
||||
})
|
||||
|
||||
formatSelected := ""
|
||||
@@ -325,8 +342,9 @@ func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsCo
|
||||
return
|
||||
}
|
||||
encoderOptions := []string{}
|
||||
encoders = format.GetEncoders()
|
||||
for _, e := range encoders {
|
||||
encoders = map[int]encoder2.EncoderDataContract{}
|
||||
for _, e := range format.GetEncoders() {
|
||||
encoders[len(encoders)] = e
|
||||
encoderOptions = append(encoderOptions, app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoder_" + e.GetTitle()}))
|
||||
}
|
||||
selectEncoder.SelectEncoder.SetOptions(encoderOptions)
|
||||
@@ -364,11 +382,27 @@ func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsCo
|
||||
}
|
||||
})
|
||||
selectEncoder.SelectFileType.Horizontal = true
|
||||
selectEncoder.SelectFileType.Required = true
|
||||
selectEncoder.SelectFileType.SetSelected(encoderGroupVideo)
|
||||
|
||||
return selectEncoder
|
||||
}
|
||||
|
||||
func (e *selectEncoder) ChangeEncoder(encoder encoder2.EncoderContract) {
|
||||
e.Encoder = encoder
|
||||
e.eventSelectEncoder(e.Encoder)
|
||||
}
|
||||
|
||||
func (e *selectEncoder) AddChangeCallback(callback func(encoder encoder2.EncoderContract)) {
|
||||
e.changeCallbacks[len(e.changeCallbacks)] = callback
|
||||
}
|
||||
|
||||
func (e *selectEncoder) eventSelectEncoder(encoder encoder2.EncoderContract) {
|
||||
for _, changeCallback := range e.changeCallbacks {
|
||||
changeCallback(encoder)
|
||||
}
|
||||
}
|
||||
|
||||
func setStringErrorStyle(text *canvas.Text) {
|
||||
text.Color = color.RGBA{R: 255, G: 0, B: 0, A: 255}
|
||||
text.Refresh()
|
||||
@@ -383,3 +417,28 @@ func showConversionMessage(conversionMessage *canvas.Text, err error) {
|
||||
conversionMessage.Text = err.Error()
|
||||
setStringErrorStyle(conversionMessage)
|
||||
}
|
||||
|
||||
type form struct {
|
||||
form *widget.Form
|
||||
items []*widget.FormItem
|
||||
}
|
||||
|
||||
func newForm(app kernel.AppContract, items []*widget.FormItem) *form {
|
||||
f := widget.NewForm()
|
||||
f.SubmitText = app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
|
||||
MessageID: "converterVideoFilesSubmitTitle",
|
||||
})
|
||||
f.Items = items
|
||||
|
||||
return &form{
|
||||
form: f,
|
||||
items: items,
|
||||
}
|
||||
}
|
||||
|
||||
func (f form) ChangeItems(items []*widget.FormItem) {
|
||||
f.form.Items = f.items
|
||||
f.form.Refresh()
|
||||
f.form.Items = append(f.form.Items, items...)
|
||||
f.form.Refresh()
|
||||
}
|
||||
|
12
convertor/view/form_items/form.go
Normal file
12
convertor/view/form_items/form.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package form_items
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/libx264"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
||||
)
|
||||
|
||||
var Views = map[string]func(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem{
|
||||
"libx264": libx264.View,
|
||||
}
|
65
convertor/view/form_items/libx264/view.go
Normal file
65
convertor/view/form_items/libx264/view.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package libx264
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx264"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||
)
|
||||
|
||||
func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem {
|
||||
items := []*widget.FormItem{}
|
||||
|
||||
items = append(items, presetParameter(encoder, app)...)
|
||||
|
||||
return items
|
||||
}
|
||||
|
||||
func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem {
|
||||
parameter, err := encoder.GetParameter("preset")
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
presets := map[string]string{}
|
||||
presetsForSelect := []string{}
|
||||
presetDefault := ""
|
||||
|
||||
for _, name := range libx264.Presets {
|
||||
title := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "preset_" + name})
|
||||
presetsForSelect = append(presetsForSelect, title)
|
||||
presets[title] = name
|
||||
if name == parameter.Get() {
|
||||
presetDefault = title
|
||||
}
|
||||
}
|
||||
|
||||
elementSelect := widget.NewSelect(presetsForSelect, func(s string) {
|
||||
if presets[s] == "" {
|
||||
return
|
||||
}
|
||||
parameter.Set(presets[s])
|
||||
})
|
||||
elementSelect.SetSelected(presetDefault)
|
||||
elementSelect.Hide()
|
||||
|
||||
checkboxTitle := app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "parameterCheckbox"})
|
||||
elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) {
|
||||
if b == true {
|
||||
parameter.SetEnable()
|
||||
elementSelect.Show()
|
||||
return
|
||||
}
|
||||
parameter.SetDisable()
|
||||
elementSelect.Hide()
|
||||
})
|
||||
|
||||
return []*widget.FormItem{
|
||||
{
|
||||
Text: app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "formPreset"}),
|
||||
Widget: container.NewVBox(elementCheckbox, elementSelect),
|
||||
},
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user