From e727b8ea09de5cdd08e8edae17a30f8ff288b1ff Mon Sep 17 00:00:00 2001 From: Stu Date: Wed, 10 Dec 2025 03:23:40 -0500 Subject: [PATCH] Auto-start playback, guard view rebuilds, and clean window close --- main.go | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 30a5f1a..c778653 100644 --- a/main.go +++ b/main.go @@ -599,7 +599,7 @@ func (s *appState) showPlayerView() { if err != nil || r == nil { return } - path := r.URI().Path() + path := uriPath(r.URI()) r.Close() go s.loadVideo(path) }, s.window) @@ -1989,10 +1989,6 @@ func runGUI() { a.Settings().SetTheme(&ui.MonoTheme{}) logging.Debug(logging.CatUI, "created fyne app: %#v", a) w := a.NewWindow("VT Player") - w.SetOnClosed(func() { - state.onClose() - a.Quit() - }) if icon := utils.LoadAppIcon(); icon != nil { a.SetIcon(icon) w.SetIcon(icon) @@ -2105,6 +2101,11 @@ func runGUI() { // Stats update loop disabled in player-only mode to avoid view churn. + w.SetOnClosed(func() { + state.onClose() + a.Quit() + }) + w.ShowAndRun() } @@ -3438,11 +3439,9 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu state.currentFrame = sourceFrame } - var img *canvas.Image + img := canvas.NewImageFromResource(nil) if sourceFrame != "" { img = canvas.NewImageFromFile(sourceFrame) - } else { - img = canvas.NewImageFromResource(nil) } img.FillMode = canvas.ImageFillContain // Don't set rigid MinSize on image - it will scale to container @@ -3506,6 +3505,7 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu } var controls fyne.CanvasObject + autoStarted := false if usePlayer { var volIcon *widget.Button var updatingVolume bool @@ -3518,7 +3518,9 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu return false } state.playSess.SetVolume(state.playerVolume) - state.playerPaused = true + state.playerPaused = false + state.playSess.Play() + autoStarted = true } return state.playSess != nil } @@ -3606,6 +3608,15 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu container.NewHBox(playBtn, fullBtn, coverBtn, importBtn, layout.NewSpacer(), volBox), progress, ) + + // Auto-start playback once when view is built + if !autoStarted { + if ensureSession() { + state.playSess.Play() + state.playerPaused = false + fmt.Printf("▶ Auto-start playback\n") + } + } } else { slider := widget.NewSlider(0, math.Max(1, float64(len(src.PreviewFrames)-1))) slider.Step = 1