Fix #496: Persist repeat mode setting across restarts
This commit is contained in:
+9
-1
@@ -119,7 +119,7 @@ func StartupApp(appName, displayAppName, appVersion, appVersionTag, latestReleas
|
|||||||
}
|
}
|
||||||
|
|
||||||
a.ServerManager = NewServerManager(appName, appVersion, a.Config, !portableMode /*use keyring*/)
|
a.ServerManager = NewServerManager(appName, appVersion, a.Config, !portableMode /*use keyring*/)
|
||||||
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.LocalPlayer, &a.Config.Scrobbling, &a.Config.Transcoding, &a.Config.Application)
|
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.LocalPlayer, &a.Config.Playback, &a.Config.Scrobbling, &a.Config.Transcoding, &a.Config.Application)
|
||||||
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, cacheDir)
|
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, cacheDir)
|
||||||
a.Config.Application.MaxImageCacheSizeMB = clamp(a.Config.Application.MaxImageCacheSizeMB, 1, 500)
|
a.Config.Application.MaxImageCacheSizeMB = clamp(a.Config.Application.MaxImageCacheSizeMB, 1, 500)
|
||||||
a.ImageManager.SetMaxOnDiskCacheSizeBytes(int64(a.Config.Application.MaxImageCacheSizeMB) * 1_048_576)
|
a.ImageManager.SetMaxOnDiskCacheSizeBytes(int64(a.Config.Application.MaxImageCacheSizeMB) * 1_048_576)
|
||||||
@@ -336,6 +336,14 @@ func (a *App) DeleteServerCacheDir(serverID uuid.UUID) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) Shutdown() {
|
func (a *App) Shutdown() {
|
||||||
|
repeatMode := "None"
|
||||||
|
switch a.PlaybackManager.GetLoopMode() {
|
||||||
|
case LoopOne:
|
||||||
|
repeatMode = "One"
|
||||||
|
case LoopAll:
|
||||||
|
repeatMode = "All"
|
||||||
|
}
|
||||||
|
a.Config.Playback.RepeatMode = repeatMode
|
||||||
a.Config.LocalPlayback.Volume = a.LocalPlayer.GetVolume()
|
a.Config.LocalPlayback.Volume = a.LocalPlayer.GetVolume()
|
||||||
a.SavePlayQueueIfEnabled()
|
a.SavePlayQueueIfEnabled()
|
||||||
a.SaveConfigFile()
|
a.SaveConfigFile()
|
||||||
|
|||||||
@@ -98,6 +98,10 @@ type NowPlayingPageConfig struct {
|
|||||||
InitialView string
|
InitialView string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PlaybackConfig struct {
|
||||||
|
RepeatMode string
|
||||||
|
}
|
||||||
|
|
||||||
type LocalPlaybackConfig struct {
|
type LocalPlaybackConfig struct {
|
||||||
AudioDeviceName string
|
AudioDeviceName string
|
||||||
AudioExclusive bool
|
AudioExclusive bool
|
||||||
@@ -146,6 +150,7 @@ type Config struct {
|
|||||||
PlaylistsPage PlaylistsPageConfig
|
PlaylistsPage PlaylistsPageConfig
|
||||||
TracksPage TracksPageConfig
|
TracksPage TracksPageConfig
|
||||||
NowPlayingConfig NowPlayingPageConfig
|
NowPlayingConfig NowPlayingPageConfig
|
||||||
|
Playback PlaybackConfig
|
||||||
LocalPlayback LocalPlaybackConfig
|
LocalPlayback LocalPlaybackConfig
|
||||||
Scrobbling ScrobbleConfig
|
Scrobbling ScrobbleConfig
|
||||||
ReplayGain ReplayGainConfig
|
ReplayGain ReplayGainConfig
|
||||||
@@ -209,6 +214,9 @@ func DefaultConfig(appVersionTag string) *Config {
|
|||||||
TracksPage: TracksPageConfig{
|
TracksPage: TracksPageConfig{
|
||||||
TracklistColumns: []string{"Album", "Time", "Plays"},
|
TracklistColumns: []string{"Album", "Time", "Plays"},
|
||||||
},
|
},
|
||||||
|
Playback: PlaybackConfig{
|
||||||
|
RepeatMode: "None",
|
||||||
|
},
|
||||||
LocalPlayback: LocalPlaybackConfig{
|
LocalPlayback: LocalPlaybackConfig{
|
||||||
// "auto" is the name to pass to MPV for autoselecting the output device
|
// "auto" is the name to pass to MPV for autoselecting the output device
|
||||||
AudioDeviceName: "auto",
|
AudioDeviceName: "auto",
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ func NewPlaybackEngine(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
s *ServerManager,
|
s *ServerManager,
|
||||||
p player.BasePlayer,
|
p player.BasePlayer,
|
||||||
|
playbackCfg *PlaybackConfig,
|
||||||
scrobbleCfg *ScrobbleConfig,
|
scrobbleCfg *ScrobbleConfig,
|
||||||
transcodeCfg *TranscodingConfig,
|
transcodeCfg *TranscodingConfig,
|
||||||
) *playbackEngine {
|
) *playbackEngine {
|
||||||
@@ -92,6 +93,12 @@ func NewPlaybackEngine(
|
|||||||
nowPlayingIdx: -1,
|
nowPlayingIdx: -1,
|
||||||
wasStopped: true,
|
wasStopped: true,
|
||||||
}
|
}
|
||||||
|
switch playbackCfg.RepeatMode {
|
||||||
|
case "All":
|
||||||
|
pm.loopMode = LoopAll
|
||||||
|
case "One":
|
||||||
|
pm.loopMode = LoopOne
|
||||||
|
}
|
||||||
p.OnTrackChange(pm.handleOnTrackChange)
|
p.OnTrackChange(pm.handleOnTrackChange)
|
||||||
p.OnSeek(func() {
|
p.OnSeek(func() {
|
||||||
pm.doUpdateTimePos(true)
|
pm.doUpdateTimePos(true)
|
||||||
|
|||||||
@@ -25,11 +25,12 @@ func NewPlaybackManager(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
s *ServerManager,
|
s *ServerManager,
|
||||||
p player.BasePlayer,
|
p player.BasePlayer,
|
||||||
|
playbackCfg *PlaybackConfig,
|
||||||
scrobbleCfg *ScrobbleConfig,
|
scrobbleCfg *ScrobbleConfig,
|
||||||
transcodeCfg *TranscodingConfig,
|
transcodeCfg *TranscodingConfig,
|
||||||
appCfg *AppConfig,
|
appCfg *AppConfig,
|
||||||
) *PlaybackManager {
|
) *PlaybackManager {
|
||||||
e := NewPlaybackEngine(ctx, s, p, scrobbleCfg, transcodeCfg)
|
e := NewPlaybackEngine(ctx, s, p, playbackCfg, scrobbleCfg, transcodeCfg)
|
||||||
q := NewCommandQueue()
|
q := NewCommandQueue()
|
||||||
pm := &PlaybackManager{
|
pm := &PlaybackManager{
|
||||||
engine: e,
|
engine: e,
|
||||||
|
|||||||
+1
-1
@@ -102,7 +102,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr
|
|||||||
pm.SeekFraction(f)
|
pm.SeekFraction(f)
|
||||||
})
|
})
|
||||||
|
|
||||||
bp.AuxControls = widgets.NewAuxControls(pm.Volume())
|
bp.AuxControls = widgets.NewAuxControls(pm.Volume(), pm.GetLoopMode())
|
||||||
pm.OnLoopModeChange(bp.AuxControls.SetLoopMode)
|
pm.OnLoopModeChange(bp.AuxControls.SetLoopMode)
|
||||||
pm.OnVolumeChange(bp.AuxControls.VolumeControl.SetVolume)
|
pm.OnVolumeChange(bp.AuxControls.VolumeControl.SetVolume)
|
||||||
bp.AuxControls.VolumeControl.OnSetVolume = func(v int) {
|
bp.AuxControls.VolumeControl.OnSetVolume = func(v int) {
|
||||||
|
|||||||
@@ -147,6 +147,14 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string,
|
|||||||
// TODO: when all shutdowns exit cleanly, remove these lines
|
// TODO: when all shutdowns exit cleanly, remove these lines
|
||||||
// as they are already executed in app.Shutdown()
|
// as they are already executed in app.Shutdown()
|
||||||
app.Config.LocalPlayback.Volume = app.LocalPlayer.GetVolume()
|
app.Config.LocalPlayback.Volume = app.LocalPlayer.GetVolume()
|
||||||
|
repeatMode := "None"
|
||||||
|
switch app.PlaybackManager.GetLoopMode() {
|
||||||
|
case backend.LoopOne:
|
||||||
|
repeatMode = "One"
|
||||||
|
case backend.LoopAll:
|
||||||
|
repeatMode = "All"
|
||||||
|
}
|
||||||
|
app.Config.Playback.RepeatMode = repeatMode
|
||||||
app.SavePlayQueueIfEnabled()
|
app.SavePlayQueueIfEnabled()
|
||||||
app.SaveConfigFile()
|
app.SaveConfigFile()
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ type AuxControls struct {
|
|||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAuxControls(initialVolume int) *AuxControls {
|
func NewAuxControls(initialVolume int, initialLoopMode backend.LoopMode) *AuxControls {
|
||||||
a := &AuxControls{
|
a := &AuxControls{
|
||||||
VolumeControl: NewVolumeControl(initialVolume),
|
VolumeControl: NewVolumeControl(initialVolume),
|
||||||
loop: NewIconButton(myTheme.RepeatIcon, nil),
|
loop: NewIconButton(myTheme.RepeatIcon, nil),
|
||||||
@@ -33,6 +33,7 @@ func NewAuxControls(initialVolume int) *AuxControls {
|
|||||||
}
|
}
|
||||||
a.loop.IconSize = IconButtonSizeSmaller
|
a.loop.IconSize = IconButtonSizeSmaller
|
||||||
a.loop.SetToolTip(lang.L("Repeat"))
|
a.loop.SetToolTip(lang.L("Repeat"))
|
||||||
|
a.SetLoopMode(initialLoopMode)
|
||||||
a.showQueue.IconSize = IconButtonSizeSmaller
|
a.showQueue.IconSize = IconButtonSizeSmaller
|
||||||
a.showQueue.SetToolTip(lang.L("Show play queue"))
|
a.showQueue.SetToolTip(lang.L("Show play queue"))
|
||||||
a.container = container.NewHBox(
|
a.container = container.NewHBox(
|
||||||
|
|||||||
@@ -120,10 +120,7 @@ func (i *IconButton) iconSize() fyne.Size {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *IconButton) Refresh() {
|
func (i *IconButton) updateColor() {
|
||||||
if i.img == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if i.Highlighted || i.focused {
|
if i.Highlighted || i.focused {
|
||||||
i.themed.ColorName = theme.ColorNamePrimary
|
i.themed.ColorName = theme.ColorNamePrimary
|
||||||
} else if i.hovered {
|
} else if i.hovered {
|
||||||
@@ -131,6 +128,13 @@ func (i *IconButton) Refresh() {
|
|||||||
} else {
|
} else {
|
||||||
i.themed.ColorName = myTheme.ColorNameIconButton
|
i.themed.ColorName = myTheme.ColorNameIconButton
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *IconButton) Refresh() {
|
||||||
|
if i.img == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.updateColor()
|
||||||
i.img.SetMinSize(i.iconSize())
|
i.img.SetMinSize(i.iconSize())
|
||||||
i.img.Refresh()
|
i.img.Refresh()
|
||||||
}
|
}
|
||||||
@@ -141,6 +145,7 @@ func (i *IconButton) CreateRenderer() fyne.WidgetRenderer {
|
|||||||
i.img = canvas.NewImageFromResource(i.themed)
|
i.img = canvas.NewImageFromResource(i.themed)
|
||||||
i.img.FillMode = canvas.ImageFillContain
|
i.img.FillMode = canvas.ImageFillContain
|
||||||
i.img.SetMinSize(i.iconSize())
|
i.img.SetMinSize(i.iconSize())
|
||||||
|
i.updateColor()
|
||||||
}
|
}
|
||||||
return widget.NewSimpleRenderer(container.NewCenter(i.img))
|
return widget.NewSimpleRenderer(container.NewCenter(i.img))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user