diff --git a/DONE.md b/DONE.md index 3955534..b386e0d 100644 --- a/DONE.md +++ b/DONE.md @@ -831,8 +831,7 @@ This file tracks completed features, fixes, and milestones. - ✅ Default bitrate preset normalized to 2.5 Mbps to avoid "select one" - ✅ Linked simple and advanced bitrate presets so they stay in sync - ✅ Hide quality presets when bitrate mode is not CRF -- ✅ Collapsed snippet tools behind a toggle in the convert footer -- ✅ Fixed snippet toggle button scope to avoid build error +- ✅ Snippet UI now shows Convert Snippet + batch + options with context-sensitive controls - ✅ Stabilized video seeking and embedded rendering - ✅ Improved player window positioning - ✅ Fixed clear video functionality diff --git a/TODO.md b/TODO.md index dfbfc83..a5e5f8a 100644 --- a/TODO.md +++ b/TODO.md @@ -64,8 +64,7 @@ This file tracks upcoming features, improvements, and known issues. - Default bitrate preset normalized to 2.5 Mbps to prevent empty select - Simple/advanced bitrate presets synced - Quality presets hidden when bitrate mode is not CRF - - Snippet tools collapsed behind a toggle to reduce footer clutter - - Snippet toggle scope fixed to eliminate build error + - Snippet UI rearranged into Convert Snippet / Batch / Options with context-sensitive visibility *Last Updated: 2025-12-20* diff --git a/main.go b/main.go index 38a342f..dd9d43a 100644 --- a/main.go +++ b/main.go @@ -7228,30 +7228,29 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { snippetHint := widget.NewLabel("Creates a clip centred on the timeline midpoint.") - var snippetRow fyne.CanvasObject - if snippetAllBtn != nil { - snippetRow = container.NewHBox(snippetBtn, snippetAllBtn, layout.NewSpacer(), snippetHint) - } else { - snippetRow = container.NewHBox(snippetBtn, layout.NewSpacer(), snippetHint) + snippetConfigRow.Hide() + snippetOptionsVisible := false + var snippetOptionsBtn *widget.Button + snippetOptionsBtn = widget.NewButton("Convert Options", func() { + if snippetOptionsVisible { + snippetConfigRow.Hide() + snippetOptionsBtn.SetText("Convert Options") + } else { + snippetConfigRow.Show() + snippetOptionsBtn.SetText("Hide Options") + } + snippetOptionsVisible = !snippetOptionsVisible + }) + snippetOptionsBtn.Importance = widget.LowImportance + if src == nil { + snippetOptionsBtn.Disable() } - snippetTools := container.NewVBox(snippetConfigRow, snippetRow) - snippetTools.Hide() - snippetToolsVisible := false - var snippetToggleBtn *widget.Button - snippetToggleBtn = widget.NewButton("Show Snippet Tools", func() { - if snippetToolsVisible { - snippetTools.Hide() - snippetToggleBtn.SetText("Show Snippet Tools") - } else { - snippetTools.Show() - snippetToggleBtn.SetText("Hide Snippet Tools") - } - snippetToolsVisible = !snippetToolsVisible - }) - snippetToggleBtn.Importance = widget.LowImportance - if src == nil { - snippetToggleBtn.Disable() + var snippetRow fyne.CanvasObject + if snippetAllBtn != nil { + snippetRow = container.NewHBox(snippetBtn, snippetAllBtn, snippetOptionsBtn, layout.NewSpacer(), snippetHint) + } else { + snippetRow = container.NewHBox(snippetBtn, snippetOptionsBtn, layout.NewSpacer(), snippetHint) } // Stack video and metadata directly so metadata sits immediately under the player. @@ -7577,8 +7576,8 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { // Build footer sections footerSections := []fyne.CanvasObject{ - snippetToggleBtn, - snippetTools, + snippetRow, + snippetConfigRow, widget.NewSeparator(), } if commandPreviewRow != nil && state.convertCommandPreviewShow {