From 20563f84414af9581491b03b5b26acbb0d50c827 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 31 Mar 2023 17:37:14 -0700 Subject: [PATCH] begin work on settings dialog --- ui/controller/controller.go | 12 ++++++++ ui/dialogs/settingsdialog.go | 58 ++++++++++++++++++++++++++++++++++++ ui/mainwindow.go | 1 + 3 files changed, 71 insertions(+) create mode 100644 ui/dialogs/settingsdialog.go diff --git a/ui/controller/controller.go b/ui/controller/controller.go index b2d71a7..aa67709 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -304,6 +304,18 @@ func (c *Controller) ShowAboutDialog() { pop.Show() } +func (c *Controller) ShowSettingsDialog() { + dlg := dialogs.NewSettingsDialog(c.App.Config) + pop := widget.NewModalPopUp(dlg, c.MainWindow.Canvas()) + dlg.OnDismiss = func() { + pop.Hide() + c.doModalClosed() + } + c.ClosePopUpOnEscape(pop) + c.haveModal = true + pop.Show() +} + func (c *Controller) trySetPasswordAndConnectToServer(server *backend.ServerConfig, password string) error { if err := c.App.ServerManager.SetServerPassword(server, password); err != nil { log.Printf("error setting keyring credentials: %v", err) diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go new file mode 100644 index 0000000..c8ae3a7 --- /dev/null +++ b/ui/dialogs/settingsdialog.go @@ -0,0 +1,58 @@ +package dialogs + +import ( + "supersonic/backend" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/data/binding" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/widget" +) + +var boldStyle = widget.RichTextStyle{TextStyle: fyne.TextStyle{Bold: true}} + +type SettingsDialog struct { + widget.BaseWidget + + OnReplayGainSettingsChanged func() + OnAudioExclusiveSettingChanged func() + OnDismiss func() + + config *backend.Config + + content fyne.CanvasObject +} + +func NewSettingsDialog(config *backend.Config) *SettingsDialog { + s := &SettingsDialog{config: config} + s.ExtendBaseWidget(s) + + replayGainSelect := widget.NewSelect([]string{"None", "Album", "Track"}, nil) + + tabs := container.NewAppTabs( + container.NewTabItem("General", container.NewVBox( + widget.NewRichText(&widget.TextSegment{Text: "Scrobbling", Style: boldStyle}), + widget.NewCheckWithData("Send playback statistics to server", binding.BindBool(&config.Scrobbling.Enabled)))), + container.NewTabItem("Playback", container.NewVBox( + widget.NewRichText(&widget.TextSegment{Text: "ReplayGain", Style: boldStyle}), + container.New(layout.NewFormLayout(), + widget.NewLabel("ReplayGain mode"), replayGainSelect, + widget.NewLabel("Prevent clipping"), widget.NewCheckWithData("", binding.BindBool(&config.ReplayGain.PreventClipping)), + ), + widget.NewSeparator(), + widget.NewCheckWithData("Audio exclusive mode", binding.BindBool(&config.LocalPlayback.AudioExclusive)))), + ) + s.content = container.NewVBox(tabs, widget.NewSeparator(), + container.NewHBox(layout.NewSpacer(), widget.NewButton("Close", func() { + if s.OnDismiss != nil { + s.OnDismiss() + } + }))) + + return s +} + +func (s *SettingsDialog) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(s.content) +} diff --git a/ui/mainwindow.go b/ui/mainwindow.go index aa5bc32..2995cc8 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -108,6 +108,7 @@ func NewMainWindow(fyneApp fyne.App, appName, appVersion string, app *backend.Ap } }() }) + m.BrowsingPane.AddSettingsMenuItem("Settings...", m.Controller.ShowSettingsDialog) m.BrowsingPane.AddSettingsMenuItem("About...", m.Controller.ShowAboutDialog) m.addNavigationButtons() m.BrowsingPane.DisableNavigationButtons()