Compare commits
2 Commits
e39b6a7f99
...
762403b770
| Author | SHA1 | Date | |
|---|---|---|---|
| 762403b770 | |||
| 66346d8cee |
4
DONE.md
4
DONE.md
|
|
@ -831,8 +831,8 @@ 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
|
||||
- ✅ Reduced module video pane minimum sizes to allow GNOME window snapping
|
||||
- ✅ Stabilized video seeking and embedded rendering
|
||||
- ✅ Improved player window positioning
|
||||
- ✅ Fixed clear video functionality
|
||||
|
|
|
|||
4
TODO.md
4
TODO.md
|
|
@ -64,8 +64,8 @@ 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
|
||||
- Reduce module video pane min sizes to allow GNOME snapping
|
||||
|
||||
*Last Updated: 2025-12-20*
|
||||
|
||||
|
|
|
|||
57
main.go
57
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 {
|
||||
|
|
@ -11967,7 +11966,7 @@ func buildInspectView(state *appState) fyne.CanvasObject {
|
|||
metadataText.SetText(formatMetadata(state.inspectFile))
|
||||
|
||||
// Build video player
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(640, 360), state.inspectFile, nil)
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(480, 270), state.inspectFile, nil)
|
||||
} else {
|
||||
fileLabel.SetText("No file loaded")
|
||||
metadataText.SetText("No file loaded")
|
||||
|
|
@ -12126,7 +12125,7 @@ func buildThumbView(state *appState) fyne.CanvasObject {
|
|||
var videoContainer fyne.CanvasObject
|
||||
if state.thumbFile != nil {
|
||||
fileLabel.SetText(fmt.Sprintf("File: %s", filepath.Base(state.thumbFile.Path)))
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(640, 360), state.thumbFile, nil)
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(480, 270), state.thumbFile, nil)
|
||||
} else {
|
||||
videoContainer = container.NewCenter(widget.NewLabel("No video loaded"))
|
||||
}
|
||||
|
|
@ -12449,7 +12448,7 @@ func buildPlayerView(state *appState) fyne.CanvasObject {
|
|||
var videoContainer fyne.CanvasObject
|
||||
if state.playerFile != nil {
|
||||
fileLabel.SetText(fmt.Sprintf("File: %s", filepath.Base(state.playerFile.Path)))
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(960, 540), state.playerFile, nil)
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(640, 360), state.playerFile, nil)
|
||||
} else {
|
||||
videoContainer = container.NewCenter(widget.NewLabel("No video loaded"))
|
||||
}
|
||||
|
|
@ -12538,7 +12537,7 @@ func buildFiltersView(state *appState) fyne.CanvasObject {
|
|||
var videoContainer fyne.CanvasObject
|
||||
if state.filtersFile != nil {
|
||||
fileLabel.SetText(fmt.Sprintf("File: %s", filepath.Base(state.filtersFile.Path)))
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(640, 360), state.filtersFile, nil)
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(480, 270), state.filtersFile, nil)
|
||||
} else {
|
||||
videoContainer = container.NewCenter(widget.NewLabel("No video loaded"))
|
||||
}
|
||||
|
|
@ -12721,7 +12720,7 @@ func buildUpscaleView(state *appState) fyne.CanvasObject {
|
|||
fileLabel.SetText(fmt.Sprintf("File: %s", filepath.Base(state.upscaleFile.Path)))
|
||||
sourceResLabel = widget.NewLabel(fmt.Sprintf("Source: %dx%d", state.upscaleFile.Width, state.upscaleFile.Height))
|
||||
sourceResLabel.TextStyle = fyne.TextStyle{Italic: true}
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(640, 360), state.upscaleFile, nil)
|
||||
videoContainer = buildVideoPane(state, fyne.NewSize(480, 270), state.upscaleFile, nil)
|
||||
} else {
|
||||
sourceResLabel = widget.NewLabel("Source: N/A")
|
||||
sourceResLabel.TextStyle = fyne.TextStyle{Italic: true}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user