Auto-start playback, guard view rebuilds, and clean window close

This commit is contained in:
Stu 2025-12-10 03:23:40 -05:00
parent fc1e91bda6
commit e727b8ea09

29
main.go
View File

@ -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