Add batch settings management UI for multi-video conversions
Implements clear batch settings control for converting multiple videos: Features: - Settings persistence: All conversion settings automatically persist across videos - Clear UI messaging: Explains that settings carry over between videos - Reset button: One-click ability to reset all settings to defaults - Batch workflow: Load video → set format/quality once → convert multiple videos How it works: 1. User loads first video and configures settings (format, quality, codecs, etc) 2. Settings are stored in state.convert and persist across video loads 3. User can load additional videos - settings remain the same 4. When converting multiple videos, all use the same settings 5. User can change settings anytime - affects all subsequent videos 6. Reset button available to restore defaults if needed This eliminates the need to reconfigure every video while allowing: - Batch processing with same settings - Individual video settings override when needed - Clear visual indication of what's happening Perfect for the user's workflow of converting 5 European videos to DVD-NTSC format - set once, convert all 5!
This commit is contained in:
parent
eab41057aa
commit
f306cf32e6
49
main.go
49
main.go
|
|
@ -1535,6 +1535,47 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
|
||||||
state.convert.AspectHandling = value
|
state.convert.AspectHandling = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Settings management for batch operations
|
||||||
|
settingsInfoLabel := widget.NewLabel("Settings persist across videos. Change them anytime to affect all subsequent videos.")
|
||||||
|
settingsInfoLabel.Wrapping = fyne.TextWrapWord
|
||||||
|
|
||||||
|
resetSettingsBtn := widget.NewButton("Reset to Defaults", func() {
|
||||||
|
// Reset to default settings
|
||||||
|
state.convert = convertConfig{
|
||||||
|
SelectedFormat: formatOptions[0],
|
||||||
|
OutputBase: "converted",
|
||||||
|
Quality: "Standard (CRF 23)",
|
||||||
|
InverseTelecine: false,
|
||||||
|
OutputAspect: "Source",
|
||||||
|
AspectHandling: "Auto",
|
||||||
|
VideoCodec: "H.264",
|
||||||
|
EncoderPreset: "medium",
|
||||||
|
BitrateMode: "CRF",
|
||||||
|
CRF: "",
|
||||||
|
VideoBitrate: "",
|
||||||
|
TargetResolution: "Source",
|
||||||
|
FrameRate: "Source",
|
||||||
|
PixelFormat: "yuv420p",
|
||||||
|
HardwareAccel: "none",
|
||||||
|
AudioCodec: "AAC",
|
||||||
|
AudioBitrate: "192k",
|
||||||
|
AudioChannels: "Source",
|
||||||
|
}
|
||||||
|
logging.Debug(logging.CatUI, "settings reset to defaults")
|
||||||
|
// Refresh all UI elements to show new settings
|
||||||
|
formatSelect.SetSelected(state.convert.SelectedFormat.Label)
|
||||||
|
qualitySelect.SetSelected(state.convert.Quality)
|
||||||
|
outputEntry.SetText(state.convert.OutputBase)
|
||||||
|
})
|
||||||
|
resetSettingsBtn.Importance = widget.LowImportance
|
||||||
|
|
||||||
|
settingsBox := container.NewVBox(
|
||||||
|
widget.NewLabelWithStyle("═══ BATCH SETTINGS ═══", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}),
|
||||||
|
settingsInfoLabel,
|
||||||
|
resetSettingsBtn,
|
||||||
|
widget.NewSeparator(),
|
||||||
|
)
|
||||||
|
|
||||||
// Simple mode options - minimal controls, aspect locked to Source
|
// Simple mode options - minimal controls, aspect locked to Source
|
||||||
simpleOptions := container.NewVBox(
|
simpleOptions := container.NewVBox(
|
||||||
widget.NewLabelWithStyle("═══ OUTPUT ═══", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}),
|
widget.NewLabelWithStyle("═══ OUTPUT ═══", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}),
|
||||||
|
|
@ -1733,8 +1774,14 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create tabs for Simple/Advanced modes
|
// Create tabs for Simple/Advanced modes
|
||||||
|
// Wrap simple options with settings box at top
|
||||||
|
simpleWithSettings := container.NewVBox(
|
||||||
|
settingsBox,
|
||||||
|
simpleOptions,
|
||||||
|
)
|
||||||
|
|
||||||
tabs := container.NewAppTabs(
|
tabs := container.NewAppTabs(
|
||||||
container.NewTabItem("Simple", container.NewVScroll(simpleOptions)),
|
container.NewTabItem("Simple", container.NewVScroll(simpleWithSettings)),
|
||||||
container.NewTabItem("Advanced", container.NewVScroll(advancedOptions)),
|
container.NewTabItem("Advanced", container.NewVScroll(advancedOptions)),
|
||||||
)
|
)
|
||||||
tabs.SetTabLocation(container.TabLocationTop)
|
tabs.SetTabLocation(container.TabLocationTop)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user