diff --git a/ui/browsing/browsingpane.go b/ui/browsing/browsingpane.go index b882dcd..eb31798 100644 --- a/ui/browsing/browsingpane.go +++ b/ui/browsing/browsingpane.go @@ -52,6 +52,8 @@ type BrowsingPane struct { history []SavedPage historyIdx int + settingsBtn *widget.Button + settingsMenu *fyne.Menu navBtnsContainer *fyne.Container pageContainer *fyne.Container container *fyne.Container @@ -65,12 +67,21 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane { b.reload = widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), b.Reload) b.app.PlaybackManager.OnSongChange(b.onSongChange) b.pageContainer = container.NewMax( + // TODO: get this color into the theme canvas.NewRectangle(color.RGBA{R: 24, G: 24, B: 24, A: 255}), layout.NewSpacer()) + b.settingsBtn = widget.NewButtonWithIcon("", theme.SettingsIcon(), func() { + p := widget.NewPopUpMenu(b.settingsMenu, + fyne.CurrentApp().Driver().CanvasForObject(b.settingsBtn)) + p.ShowAtPosition(fyne.NewPos(b.Size().Width-p.MinSize().Width-theme.Padding()/2, + b.navBtnsContainer.MinSize().Height+theme.Padding())) + }) + b.settingsMenu = fyne.NewMenu("") b.navBtnsContainer = container.NewHBox() b.container = container.NewBorder( container.New(layouts.NewLeftMiddleRightLayout(0), - container.NewHBox(b.back, b.forward, b.reload), b.navBtnsContainer, layout.NewSpacer()), + container.NewHBox(b.back, b.forward, b.reload), b.navBtnsContainer, + container.NewHBox(layout.NewSpacer(), b.settingsBtn)), nil, nil, nil, b.pageContainer) return b } @@ -91,6 +102,11 @@ func (b *BrowsingPane) ClearHistory() { b.historyIdx = 0 } +func (b *BrowsingPane) AddSettingsMenuItem(label string, action func()) { + b.settingsMenu.Items = append(b.settingsMenu.Items, + fyne.NewMenuItem(label, action)) +} + func (b *BrowsingPane) AddNavigationButton(iconRes fyne.Resource, action func()) { b.navBtnsContainer.Add(widget.NewButtonWithIcon("", iconRes, action)) } diff --git a/ui/controller/controller.go b/ui/controller/controller.go index 8c5e1c2..b9fc176 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -88,26 +88,20 @@ 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) - }) + c.PromptForLogin() } else { c.tryConnectToServer(server, pass) } } -func (m Controller) promptForLogin(cb func(server *backend.ServerConfig, password string)) { +func (m Controller) PromptForLogin() { // 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) + m.trySetPasswordAndConnectToServer(server, password) } d.OnEditServer = func(server *backend.ServerConfig) { pop.Hide() @@ -118,13 +112,21 @@ func (m Controller) promptForLogin(cb func(server *backend.ServerConfig, passwor server.Hostname = editD.Host server.Nickname = editD.Nickname server.Username = editD.Username - cb(server, editD.Password) + m.trySetPasswordAndConnectToServer(server, editD.Password) } editPop.Show() } pop.Show() } +func (c Controller) trySetPasswordAndConnectToServer(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) +} + 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) diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 4c9b1aa..f394ea0 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -69,8 +69,9 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App, size fyne m.BrowsingPane.DisableNavigationButtons() m.BrowsingPane.SetPage(nil) m.BrowsingPane.ClearHistory() - // TODO: show prompt for login + m.Controller.PromptForLogin() }) + m.BrowsingPane.AddSettingsMenuItem("Log Out", app.ServerManager.Logout) m.addNavigationButtons() m.addShortcuts() return m