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 { if err != nil || r == nil {
return return
} }
path := r.URI().Path() path := uriPath(r.URI())
r.Close() r.Close()
go s.loadVideo(path) go s.loadVideo(path)
}, s.window) }, s.window)
@ -1989,10 +1989,6 @@ func runGUI() {
a.Settings().SetTheme(&ui.MonoTheme{}) a.Settings().SetTheme(&ui.MonoTheme{})
logging.Debug(logging.CatUI, "created fyne app: %#v", a) logging.Debug(logging.CatUI, "created fyne app: %#v", a)
w := a.NewWindow("VT Player") w := a.NewWindow("VT Player")
w.SetOnClosed(func() {
state.onClose()
a.Quit()
})
if icon := utils.LoadAppIcon(); icon != nil { if icon := utils.LoadAppIcon(); icon != nil {
a.SetIcon(icon) a.SetIcon(icon)
w.SetIcon(icon) w.SetIcon(icon)
@ -2105,6 +2101,11 @@ func runGUI() {
// Stats update loop disabled in player-only mode to avoid view churn. // Stats update loop disabled in player-only mode to avoid view churn.
w.SetOnClosed(func() {
state.onClose()
a.Quit()
})
w.ShowAndRun() w.ShowAndRun()
} }
@ -3438,11 +3439,9 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu
state.currentFrame = sourceFrame state.currentFrame = sourceFrame
} }
var img *canvas.Image img := canvas.NewImageFromResource(nil)
if sourceFrame != "" { if sourceFrame != "" {
img = canvas.NewImageFromFile(sourceFrame) img = canvas.NewImageFromFile(sourceFrame)
} else {
img = canvas.NewImageFromResource(nil)
} }
img.FillMode = canvas.ImageFillContain img.FillMode = canvas.ImageFillContain
// Don't set rigid MinSize on image - it will scale to container // 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 var controls fyne.CanvasObject
autoStarted := false
if usePlayer { if usePlayer {
var volIcon *widget.Button var volIcon *widget.Button
var updatingVolume bool var updatingVolume bool
@ -3518,7 +3518,9 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu
return false return false
} }
state.playSess.SetVolume(state.playerVolume) state.playSess.SetVolume(state.playerVolume)
state.playerPaused = true state.playerPaused = false
state.playSess.Play()
autoStarted = true
} }
return state.playSess != nil 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), container.NewHBox(playBtn, fullBtn, coverBtn, importBtn, layout.NewSpacer(), volBox),
progress, 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 { } else {
slider := widget.NewSlider(0, math.Max(1, float64(len(src.PreviewFrames)-1))) slider := widget.NewSlider(0, math.Max(1, float64(len(src.PreviewFrames)-1)))
slider.Step = 1 slider.Step = 1