From 63b0ab73743a9cf6da90c997869539c513181dcd Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 16 Apr 2024 18:13:22 -0700 Subject: [PATCH] add settings dialog radio for saving queue locally or to server --- .../subsonic/subsonicmediaprovider.go | 3 ++ backend/savedplayqueue.go | 3 ++ ui/controller/controller.go | 3 +- ui/dialogs/settingsdialog.go | 37 ++++++++++++++++--- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/backend/mediaprovider/subsonic/subsonicmediaprovider.go b/backend/mediaprovider/subsonic/subsonicmediaprovider.go index ea7001d..0dd6a20 100644 --- a/backend/mediaprovider/subsonic/subsonicmediaprovider.go +++ b/backend/mediaprovider/subsonic/subsonicmediaprovider.go @@ -382,6 +382,9 @@ func (s *subsonicMediaProvider) GetLyrics(track *mediaprovider.Track) (*mediapro // CanSavePlayQueue interface func (s *subsonicMediaProvider) SavePlayQueue(trackIDs []string, currentTrackPos int, timeSeconds int) error { + if len(trackIDs) == 0 { + return nil // don't save an empty queue + } return s.client.SavePlayQueue(trackIDs, map[string]string{ "current": trackIDs[currentTrackPos], "position": strconv.Itoa(timeSeconds * 1000), diff --git a/backend/savedplayqueue.go b/backend/savedplayqueue.go index 2e492da..a0baf41 100644 --- a/backend/savedplayqueue.go +++ b/backend/savedplayqueue.go @@ -3,6 +3,7 @@ package backend import ( "encoding/json" "errors" + "log" "os" "github.com/dweymouth/supersonic/backend/mediaprovider" @@ -64,6 +65,8 @@ func LoadPlayQueue(filepath string, sm *ServerManager, loadFromServer bool) (*Sa TrackIndex: queue.TrackPos, TimePos: float64(queue.TimePos), }, nil + } else { + log.Printf("error loading queue from server: %v", err.Error()) } } diff --git a/ui/controller/controller.go b/ui/controller/controller.go index b598ace..6e6fe18 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -578,12 +578,13 @@ func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map curPlayer := c.App.PlaybackManager.CurrentPlayer() _, isReplayGainPlayer := curPlayer.(player.ReplayGainPlayer) _, isEqualizerPlayer := curPlayer.(*mpv.Player) + _, canSavePlayQueue := c.App.ServerManager.Server.(mediaprovider.CanSavePlayQueue) isLocalPlayer := isEqualizerPlayer bands := c.App.LocalPlayer.Equalizer().BandFrequencies() dlg := dialogs.NewSettingsDialog(c.App.Config, devs, themeFiles, bands, c.App.ServerManager.Server.ClientDecidesScrobble(), - isLocalPlayer, isReplayGainPlayer, isEqualizerPlayer, + isLocalPlayer, isReplayGainPlayer, isEqualizerPlayer, canSavePlayQueue, c.MainWindow) dlg.OnReplayGainSettingsChanged = func() { c.App.PlaybackManager.SetReplayGainOptions(c.App.Config.ReplayGain) diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index de2ec73..df95061 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -56,6 +56,7 @@ func NewSettingsDialog( isLocalPlayer bool, isReplayGainPlayer bool, isEqualizerPlayer bool, + canSavePlayQueue bool, window fyne.Window, ) *SettingsDialog { s := &SettingsDialog{config: config, audioDevices: audioDeviceList, themeFiles: themeFileList, clientDecidesScrobble: clientDecidesScrobble} @@ -66,14 +67,14 @@ func NewSettingsDialog( var tabs *container.AppTabs if isEqualizerPlayer { tabs = container.NewAppTabs( - s.createGeneralTab(), + s.createGeneralTab(canSavePlayQueue), s.createPlaybackTab(isLocalPlayer, isReplayGainPlayer), s.createEqualizerTab(equalizerBands), s.createExperimentalTab(window), ) } else { tabs = container.NewAppTabs( - s.createGeneralTab(), + s.createGeneralTab(canSavePlayQueue), s.createPlaybackTab(isLocalPlayer, isReplayGainPlayer), s.createExperimentalTab(window), ) @@ -94,7 +95,7 @@ func NewSettingsDialog( return s } -func (s *SettingsDialog) createGeneralTab() *container.TabItem { +func (s *SettingsDialog) createGeneralTab(canSaveQueueToServer bool) *container.TabItem { themeNames := []string{"Default"} themeFileNames := []string{""} i, selIndex := 1, 0 @@ -157,8 +158,32 @@ func (s *SettingsDialog) createGeneralTab() *container.TabItem { }) systemTrayEnable.Checked = s.config.Application.EnableSystemTray - saveQueue := widget.NewCheckWithData("Save play queue on exit", - binding.BindBool(&s.config.Application.SavePlayQueue)) + // save play queue settings + saveToServer := widget.NewRadioGroup([]string{"Locally", "To server"}, func(choice string) { + s.config.Application.SaveQueueToServer = choice == "To server" + }) + saveToServer.Horizontal = true + if !s.config.Application.SavePlayQueue { + saveToServer.Disable() + } + saveToServer.Selected = "Locally" + if s.config.Application.SaveQueueToServer { + saveToServer.Selected = "To server" + } + saveQueue := widget.NewCheck("Save play queue on exit", func(save bool) { + s.config.Application.SavePlayQueue = save + if save && canSaveQueueToServer { + saveToServer.Enable() + } else if canSaveQueueToServer { + saveToServer.Disable() + } + }) + saveQueue.Checked = s.config.Application.SavePlayQueue + saveQueueHBox := container.NewHBox(saveQueue) + if canSaveQueueToServer { + saveQueueHBox.Add(saveToServer) + } + trackNotif := widget.NewCheckWithData("Show notification on track change", binding.BindBool(&s.config.Application.ShowTrackChangeNotification)) @@ -250,7 +275,7 @@ func (s *SettingsDialog) createGeneralTab() *container.TabItem { widget.NewLabel("Startup page"), container.NewGridWithColumns(2, startupPage), ), container.NewHBox(systemTrayEnable, closeToTray), - saveQueue, + saveQueueHBox, trackNotif, s.newSectionSeparator(),