diff --git a/main.go b/main.go index 3ea468a..d4c6974 100644 --- a/main.go +++ b/main.go @@ -48,16 +48,9 @@ func main() { time.Sleep(250 * time.Millisecond) defaultServer := myApp.Config.GetDefaultServer() if defaultServer == nil { - mainWindow.PromptForFirstServer(func(nick, host, user, pass string) { - server := myApp.Config.AddServer(nick, host, user) - if err := myApp.ServerManager.SetServerPassword(server, pass); err != nil { - log.Printf("error setting keyring credentials: %v", err) - // TODO: handle? - } - setupServer(myApp, server) - }) + mainWindow.Controller.PromptForFirstServer() } else { - setupServer(myApp, defaultServer) + mainWindow.Controller.DoConnectToServerWorkflow(defaultServer) } }() @@ -73,14 +66,3 @@ func main() { myApp.Config.WriteConfigFile(configPath()) myApp.Shutdown() } - -func setupServer(app *backend.App, server *backend.ServerConfig) { - pass, err := app.ServerManager.GetServerPassword(server) - if err != nil { - log.Printf("error getting password from keyring: %v", err) - } - if err := app.ServerManager.ConnectToServer(server, pass); err != nil { - log.Printf("error connecting to server: %v", err) - // TODO: surface error to user - } -} diff --git a/ui/controller/controller.go b/ui/controller/controller.go index 69dd137..8c5e1c2 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -38,6 +38,21 @@ func (m Controller) ShowPopUpImage(img image.Image) { )) } +func (m Controller) PromptForFirstServer() { + d := dialogs.NewAddEditServerDialog("Connect to Server", nil) + pop := widget.NewModalPopUp(d, m.MainWindow.Canvas()) + d.OnSubmit = func() { + pop.Hide() + server := m.App.Config.AddServer(d.Nickname, d.Host, d.Username) + if err := m.App.ServerManager.SetServerPassword(server, d.Password); err != nil { + log.Printf("error setting keyring credentials: %v", err) + // TODO: handle? + } + m.DoConnectToServerWorkflow(server) + } + pop.Show() +} + // Show dialog to prompt for playlist. // Depending on the results of that dialog, potentially create a new playlist // Add tracks to the user-specified playlist @@ -68,3 +83,51 @@ func (m Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { } pop.Show() } + +func (c Controller) DoConnectToServerWorkflow(server *backend.ServerConfig) { + pass, err := c.App.ServerManager.GetServerPassword(server) + if err != nil { + log.Printf("error getting password from keyring: %v", err) + c.promptForLogin(func(server *backend.ServerConfig, password string) { + if err := c.App.ServerManager.SetServerPassword(server, password); err != nil { + log.Printf("error setting keyring credentials: %v", err) + // TODO: handle? + } + c.tryConnectToServer(server, password) + }) + } else { + c.tryConnectToServer(server, pass) + } +} + +func (m Controller) promptForLogin(cb func(server *backend.ServerConfig, password string)) { + // TODO: this will need to be rewritten a bit when we support multi servers + // need to make sure the intended server is first in the list passed to NewLoginDialog + d := dialogs.NewLoginDialog(m.App.Config.Servers) + pop := widget.NewModalPopUp(d, m.MainWindow.Canvas()) + d.OnSubmit = func(server *backend.ServerConfig, password string) { + pop.Hide() + cb(server, password) + } + d.OnEditServer = func(server *backend.ServerConfig) { + pop.Hide() + editD := dialogs.NewAddEditServerDialog("Edit server", server) + editPop := widget.NewModalPopUp(editD, m.MainWindow.Canvas()) + editD.OnSubmit = func() { + editPop.Hide() + server.Hostname = editD.Host + server.Nickname = editD.Nickname + server.Username = editD.Username + cb(server, editD.Password) + } + editPop.Show() + } + pop.Show() +} + +func (c Controller) tryConnectToServer(server *backend.ServerConfig, password string) { + if err := c.App.ServerManager.ConnectToServer(server, password); err != nil { + log.Printf("error connecting to server: %v", err) + // TODO: surface error to user + } +} diff --git a/ui/widgets/addserverform.go b/ui/dialogs/addeditserverdialog.go similarity index 73% rename from ui/widgets/addserverform.go rename to ui/dialogs/addeditserverdialog.go index 6c08579..a6e1bc5 100644 --- a/ui/widgets/addserverform.go +++ b/ui/dialogs/addeditserverdialog.go @@ -1,6 +1,8 @@ -package widgets +package dialogs import ( + "supersonic/backend" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" @@ -8,7 +10,7 @@ import ( "fyne.io/fyne/v2/widget" ) -type AddServerForm struct { +type AddEditServerDialog struct { widget.BaseWidget Nickname string @@ -20,11 +22,17 @@ type AddServerForm struct { container *fyne.Container } -var _ fyne.Widget = (*AddServerForm)(nil) +var _ fyne.Widget = (*AddEditServerDialog)(nil) -func NewAddServerForm(title string) *AddServerForm { - a := &AddServerForm{} +func NewAddEditServerDialog(title string, prefillServer *backend.ServerConfig) *AddEditServerDialog { + a := &AddEditServerDialog{} a.ExtendBaseWidget(a) + if prefillServer != nil { + a.Nickname = prefillServer.Nickname + a.Host = prefillServer.Hostname + a.Username = prefillServer.Username + } + titleLabel := widget.NewLabel(title) titleLabel.TextStyle.Bold = true nickField := widget.NewEntryWithData(binding.BindString(&a.Nickname)) @@ -59,11 +67,11 @@ func NewAddServerForm(title string) *AddServerForm { return a } -func (a *AddServerForm) MinSize() fyne.Size { +func (a *AddEditServerDialog) MinSize() fyne.Size { a.ExtendBaseWidget(a) return fyne.NewSize(300, a.container.MinSize().Height) } -func (a *AddServerForm) CreateRenderer() fyne.WidgetRenderer { +func (a *AddEditServerDialog) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(a.container) } diff --git a/ui/dialogs/logindialog.go b/ui/dialogs/logindialog.go index 563784d..3f6d714 100644 --- a/ui/dialogs/logindialog.go +++ b/ui/dialogs/logindialog.go @@ -6,13 +6,15 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) type LoginDialog struct { widget.BaseWidget - OnSubmit func(server *backend.ServerConfig, password string) + OnSubmit func(server *backend.ServerConfig, password string) + OnEditServer func(server *backend.ServerConfig) servers []*backend.ServerConfig serverSelect *widget.Select @@ -34,6 +36,7 @@ func NewLoginDialog(servers []*backend.ServerConfig) *LoginDialog { } l.serverSelect = widget.NewSelect(serverNames, func(_ string) {}) l.serverSelect.SetSelectedIndex(0) + editBtn := widget.NewButtonWithIcon("", theme.DocumentCreateIcon(), l.onEditServer) l.passField = widget.NewPasswordEntry() okBtn := widget.NewButton("OK", l.onSubmit) @@ -41,7 +44,7 @@ func NewLoginDialog(servers []*backend.ServerConfig) *LoginDialog { container.NewHBox(layout.NewSpacer(), titleLabel, layout.NewSpacer()), container.New(layout.NewFormLayout(), widget.NewLabel("Server"), - l.serverSelect, + container.NewBorder(nil, nil, nil, editBtn, l.serverSelect), widget.NewLabel("Password"), l.passField), widget.NewSeparator(), @@ -64,3 +67,9 @@ func (l *LoginDialog) onSubmit() { l.OnSubmit(l.servers[l.serverSelect.SelectedIndex()], l.passField.Text) } } + +func (l *LoginDialog) onEditServer() { + if l.OnEditServer != nil { + l.OnEditServer(l.servers[l.serverSelect.SelectedIndex()]) + } +} diff --git a/ui/mainwindow.go b/ui/mainwindow.go index c795a02..4c9b1aa 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -6,12 +6,10 @@ import ( "supersonic/ui/browsing" "supersonic/ui/controller" "supersonic/ui/os" - "supersonic/ui/widgets" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/driver/desktop" - "fyne.io/fyne/v2/widget" "github.com/dweymouth/go-subsonic/subsonic" ) @@ -78,16 +76,6 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App, size fyne return m } -func (m *MainWindow) PromptForFirstServer(cb func(string, string, string, string)) { - d := widgets.NewAddServerForm("Connect to Server") - pop := widget.NewModalPopUp(d, m.Canvas()) - d.OnSubmit = func() { - pop.Hide() - cb(d.Nickname, d.Host, d.Username, d.Password) - } - pop.Show() -} - func (m *MainWindow) addNavigationButtons() { m.BrowsingPane.AddNavigationButton(res.ResHeadphonesInvertPng, func() { m.Router.OpenRoute(browsing.NowPlayingRoute())