From a8ea12feaf75506b1601323770c8054b5562f30e Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 3 Mar 2023 20:51:04 -0800 Subject: [PATCH] fix hiding of popups on escape --- ui/browsing/albumpage.go | 4 ++-- ui/browsing/albumspage.go | 6 +++--- ui/browsing/artistpage.go | 4 ++-- ui/browsing/artistsgenrespage.go | 6 +++--- ui/browsing/favoritespage.go | 6 +++--- ui/browsing/genrepage.go | 6 +++--- ui/browsing/nowplayingpage.go | 4 ++-- ui/browsing/playlistpage.go | 4 ++-- ui/browsing/playlistspage.go | 6 +++--- ui/browsing/router.go | 20 ++++++++++---------- ui/controller/controller.go | 31 +++++++++++++++++++------------ ui/mainwindow.go | 8 +++++++- ui/util/util.go | 9 --------- 13 files changed, 59 insertions(+), 55 deletions(-) diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 559762c..b7f6e0b 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -37,7 +37,7 @@ type albumPageState struct { pm *backend.PlaybackManager im *backend.ImageManager sm *backend.ServerManager - contr controller.Controller + contr *controller.Controller } func NewAlbumPage( @@ -47,7 +47,7 @@ func NewAlbumPage( pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager, - contr controller.Controller, + contr *controller.Controller, ) *AlbumPage { a := &AlbumPage{ albumPageState: albumPageState{ diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index ae9ee5f..a2d1c35 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -19,7 +19,7 @@ type AlbumsPage struct { widget.BaseWidget cfg *backend.AlbumsPageConfig - contr controller.Controller + contr *controller.Controller pm *backend.PlaybackManager im *backend.ImageManager lm *backend.LibraryManager @@ -53,7 +53,7 @@ func (s *selectWidget) MinSize() fyne.Size { return fyne.NewSize(170, s.height) } -func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *AlbumsPage { +func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr *controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *AlbumsPage { a := &AlbumsPage{ cfg: cfg, contr: contr, @@ -220,7 +220,7 @@ func (a *AlbumsPage) CreateRenderer() fyne.WidgetRenderer { type savedAlbumsPage struct { searchText string cfg *backend.AlbumsPageConfig - contr controller.Controller + contr *controller.Controller pm *backend.PlaybackManager lm *backend.LibraryManager im *backend.ImageManager diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index a460c1c..ccd6ca1 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -27,7 +27,7 @@ type artistPageState struct { pm *backend.PlaybackManager sm *backend.ServerManager im *backend.ImageManager - contr controller.Controller + contr *controller.Controller } type ArtistPage struct { @@ -41,7 +41,7 @@ type ArtistPage struct { container *fyne.Container } -func NewArtistPage(artistID string, pm *backend.PlaybackManager, sm *backend.ServerManager, im *backend.ImageManager, contr controller.Controller) *ArtistPage { +func NewArtistPage(artistID string, pm *backend.PlaybackManager, sm *backend.ServerManager, im *backend.ImageManager, contr *controller.Controller) *ArtistPage { a := &ArtistPage{artistPageState: artistPageState{ artistID: artistID, pm: pm, diff --git a/ui/browsing/artistsgenrespage.go b/ui/browsing/artistsgenrespage.go index d4cc069..58a0703 100644 --- a/ui/browsing/artistsgenrespage.go +++ b/ui/browsing/artistsgenrespage.go @@ -21,14 +21,14 @@ type ArtistsGenresPage struct { widget.BaseWidget isGenresPage bool - contr controller.Controller + contr *controller.Controller sm *backend.ServerManager titleDisp *widget.RichText container *fyne.Container list *widgets.ArtistGenrePlaylist } -func NewArtistsGenresPage(isGenresPage bool, contr controller.Controller, sm *backend.ServerManager) *ArtistsGenresPage { +func NewArtistsGenresPage(isGenresPage bool, contr *controller.Controller, sm *backend.ServerManager) *ArtistsGenresPage { title := "Artists" if isGenresPage { title = "Genres" @@ -95,7 +95,7 @@ func (a *ArtistsGenresPage) Save() SavedPage { type savedArtistsGenresPage struct { isGenresPage bool - contr controller.Controller + contr *controller.Controller sm *backend.ServerManager } diff --git a/ui/browsing/favoritespage.go b/ui/browsing/favoritespage.go index 212dd72..6d1aa5f 100644 --- a/ui/browsing/favoritespage.go +++ b/ui/browsing/favoritespage.go @@ -21,7 +21,7 @@ type FavoritesPage struct { widget.BaseWidget cfg *backend.FavoritesPageConfig - contr controller.Controller + contr *controller.Controller pm *backend.PlaybackManager im *backend.ImageManager sm *backend.ServerManager @@ -41,7 +41,7 @@ type FavoritesPage struct { container *fyne.Container } -func NewFavoritesPage(cfg *backend.FavoritesPageConfig, contr controller.Controller, sm *backend.ServerManager, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *FavoritesPage { +func NewFavoritesPage(cfg *backend.FavoritesPageConfig, contr *controller.Controller, sm *backend.ServerManager, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *FavoritesPage { a := &FavoritesPage{ cfg: cfg, contr: contr, @@ -347,7 +347,7 @@ func (a *FavoritesPage) CreateRenderer() fyne.WidgetRenderer { type savedFavoritesPage struct { cfg *backend.FavoritesPageConfig - contr controller.Controller + contr *controller.Controller pm *backend.PlaybackManager sm *backend.ServerManager im *backend.ImageManager diff --git a/ui/browsing/genrepage.go b/ui/browsing/genrepage.go index 6ab3047..01ddf15 100644 --- a/ui/browsing/genrepage.go +++ b/ui/browsing/genrepage.go @@ -18,7 +18,7 @@ type GenrePage struct { widget.BaseWidget genre string - contr controller.Controller + contr *controller.Controller im *backend.ImageManager pm *backend.PlaybackManager lm *backend.LibraryManager @@ -33,7 +33,7 @@ type GenrePage struct { container *fyne.Container } -func NewGenrePage(genre string, contr controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *GenrePage { +func NewGenrePage(genre string, contr *controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *GenrePage { g := &GenrePage{ genre: genre, contr: contr, @@ -187,7 +187,7 @@ func (g *GenrePage) doSearch(query string) { type savedGenrePage struct { genre string searchText string - contr controller.Controller + contr *controller.Controller pm *backend.PlaybackManager lm *backend.LibraryManager im *backend.ImageManager diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index be85708..f100ae2 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -25,14 +25,14 @@ type NowPlayingPage struct { } type nowPlayingPageState struct { - contr controller.Controller + contr *controller.Controller conf *backend.NowPlayingPageConfig sm *backend.ServerManager pm *backend.PlaybackManager } func NewNowPlayingPage( - contr controller.Controller, + contr *controller.Controller, conf *backend.NowPlayingPageConfig, sm *backend.ServerManager, pm *backend.PlaybackManager, diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index db8f136..c5bf270 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -32,7 +32,7 @@ type PlaylistPage struct { type playlistPageState struct { playlistID string conf *backend.PlaylistPageConfig - contr controller.Controller + contr *controller.Controller sm *backend.ServerManager pm *backend.PlaybackManager im *backend.ImageManager @@ -41,7 +41,7 @@ type playlistPageState struct { func NewPlaylistPage( playlistID string, conf *backend.PlaylistPageConfig, - contr controller.Controller, + contr *controller.Controller, sm *backend.ServerManager, pm *backend.PlaybackManager, im *backend.ImageManager, diff --git a/ui/browsing/playlistspage.go b/ui/browsing/playlistspage.go index 715fe90..7c30f10 100644 --- a/ui/browsing/playlistspage.go +++ b/ui/browsing/playlistspage.go @@ -18,14 +18,14 @@ import ( type PlaylistsPage struct { widget.BaseWidget - contr controller.Controller + contr *controller.Controller sm *backend.ServerManager titleDisp *widget.RichText container *fyne.Container list *PlaylistList } -func NewPlaylistsPage(contr controller.Controller, sm *backend.ServerManager) *PlaylistsPage { +func NewPlaylistsPage(contr *controller.Controller, sm *backend.ServerManager) *PlaylistsPage { a := &PlaylistsPage{ sm: sm, contr: contr, @@ -67,7 +67,7 @@ func (a *PlaylistsPage) Save() SavedPage { } type savedPlaylistsPage struct { - contr controller.Controller + contr *controller.Controller sm *backend.ServerManager } diff --git a/ui/browsing/router.go b/ui/browsing/router.go index 59e8d4e..256e03b 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -27,25 +27,25 @@ func NewRouter(app *backend.App, controller *controller.Controller, nav Navigati func (r Router) CreatePage(rte controller.Route) Page { switch rte.Page { case controller.Album: - return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, *r.Controller) + return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.Controller) case controller.Albums: - return NewAlbumsPage(&r.App.Config.AlbumsPage, *r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) + return NewAlbumsPage(&r.App.Config.AlbumsPage, r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) case controller.Artist: - return NewArtistPage(rte.Arg, r.App.PlaybackManager, r.App.ServerManager, r.App.ImageManager, *r.Controller) + return NewArtistPage(rte.Arg, r.App.PlaybackManager, r.App.ServerManager, r.App.ImageManager, r.Controller) case controller.Artists: - return NewArtistsGenresPage(false, *r.Controller, r.App.ServerManager) + return NewArtistsGenresPage(false, r.Controller, r.App.ServerManager) case controller.Favorites: - return NewFavoritesPage(&r.App.Config.FavoritesPage, *r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) + return NewFavoritesPage(&r.App.Config.FavoritesPage, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) case controller.Genre: - return NewGenrePage(rte.Arg, *r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) + return NewGenrePage(rte.Arg, r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) case controller.Genres: - return NewArtistsGenresPage(true, *r.Controller, r.App.ServerManager) + return NewArtistsGenresPage(true, r.Controller, r.App.ServerManager) case controller.NowPlaying: - return NewNowPlayingPage(*r.Controller, &r.App.Config.NowPlayingPage, r.App.ServerManager, r.App.PlaybackManager) + return NewNowPlayingPage(r.Controller, &r.App.Config.NowPlayingPage, r.App.ServerManager, r.App.PlaybackManager) case controller.Playlist: - return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, *r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) + return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) case controller.Playlists: - return NewPlaylistsPage(*r.Controller, r.App.ServerManager) + return NewPlaylistsPage(r.Controller, r.App.ServerManager) } return nil } diff --git a/ui/controller/controller.go b/ui/controller/controller.go index ce848f6..41c37f8 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -19,16 +19,23 @@ import ( type NavigationHandler func(Route) type Controller struct { + // if not nil, this popup should be hidden when escape is pressed + EscapablePopUp *widget.PopUp + MainWindow fyne.Window App *backend.App NavHandler NavigationHandler } -func (m Controller) NavigateTo(route Route) { +func (m *Controller) NavigateTo(route Route) { m.NavHandler(route) } -func (m Controller) ShowPopUpImage(img image.Image) { +func (m *Controller) ClosePopUpOnEscape(pop *widget.PopUp) { + m.EscapablePopUp = pop +} + +func (m *Controller) ShowPopUpImage(img image.Image) { im := canvas.NewImageFromImage(img) im.FillMode = canvas.ImageFillContain pop := widget.NewPopUp(im, m.MainWindow.Canvas()) @@ -42,7 +49,7 @@ func (m Controller) ShowPopUpImage(img image.Image) { w := s.Width * 0.8 popS = fyne.NewSize(w, w*(1/asp)) } - util.ClosePopUpOnEscape(pop) + m.ClosePopUpOnEscape(pop) pop.Resize(popS) pop.ShowAtPosition(fyne.NewPos( (s.Width-popS.Width)/2, @@ -50,7 +57,7 @@ func (m Controller) ShowPopUpImage(img image.Image) { )) } -func (m Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) { +func (m *Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) { tracklist.OnAddToPlaylist = m.DoAddTracksToPlaylistWorkflow tracklist.OnAddToQueue = func(tracks []*subsonic.Child) { m.App.PlaybackManager.LoadTracks(tracks, true, false) @@ -82,7 +89,7 @@ func (m Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) { } } -func (m Controller) PromptForFirstServer() { +func (m *Controller) PromptForFirstServer() { d := dialogs.NewAddEditServerDialog("Connect to Server", nil) pop := widget.NewModalPopUp(d, m.MainWindow.Canvas()) d.OnSubmit = func() { @@ -107,7 +114,7 @@ func (m Controller) PromptForFirstServer() { // 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 -func (m Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { +func (m *Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { pls, err := m.App.LibraryManager.GetUserOwnedPlaylists() if err != nil { // TODO: surface this error to user @@ -121,7 +128,7 @@ func (m Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { dlg := dialogs.NewAddToPlaylistDialog("Add to Playlist", plNames) pop := widget.NewModalPopUp(dlg, m.MainWindow.Canvas()) - util.ClosePopUpOnEscape(pop) + m.ClosePopUpOnEscape(pop) dlg.OnCanceled = pop.Hide dlg.OnSubmit = func(playlistChoice int, newPlaylistName string) { pop.Hide() @@ -136,7 +143,7 @@ func (m Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { pop.Show() } -func (c Controller) DoConnectToServerWorkflow(server *backend.ServerConfig) { +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) @@ -152,7 +159,7 @@ func (c Controller) DoConnectToServerWorkflow(server *backend.ServerConfig) { } } -func (m Controller) PromptForLoginAndConnect() { +func (m *Controller) PromptForLoginAndConnect() { // 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) @@ -196,7 +203,7 @@ func (m Controller) PromptForLoginAndConnect() { pop.Show() } -func (c Controller) trySetPasswordAndConnectToServer(server *backend.ServerConfig, password string) error { +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) // TODO: how best to handle this unexpected codepath @@ -206,7 +213,7 @@ func (c Controller) trySetPasswordAndConnectToServer(server *backend.ServerConfi return c.tryConnectToServer(server, password) } -func (c Controller) tryConnectToServer(server *backend.ServerConfig, password string) error { +func (c *Controller) tryConnectToServer(server *backend.ServerConfig, password string) error { if err := c.App.ServerManager.TestConnectionAndAuth(server.Hostname, server.Username, password, 10*time.Second); err != nil { return err } @@ -217,7 +224,7 @@ func (c Controller) tryConnectToServer(server *backend.ServerConfig, password st return nil } -func (c Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServerDialog) bool { +func (c *Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServerDialog) bool { dlg.SetInfoText("Testing connection...") err := c.App.ServerManager.TestConnectionAndAuth(dlg.Host, dlg.Username, dlg.Password, 5*time.Second) if err == backend.ErrUnreachable { diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 1ce571d..2ffe157 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -141,7 +141,13 @@ func (m *MainWindow) addShortcuts() { } m.Canvas().SetOnTypedKey(func(e *fyne.KeyEvent) { - if e.Name == fyne.KeySpace { + switch e.Name { + case fyne.KeyEscape: + if m.Controller.EscapablePopUp != nil { + m.Controller.EscapablePopUp.Hide() + m.Controller.EscapablePopUp = nil + } + case fyne.KeySpace: m.App.Player.PlayPause() } }) diff --git a/ui/util/util.go b/ui/util/util.go index 2011c57..d1db088 100644 --- a/ui/util/util.go +++ b/ui/util/util.go @@ -6,7 +6,6 @@ import ( "math" "strings" - "fyne.io/fyne/v2" "fyne.io/fyne/v2/widget" "golang.org/x/net/html" ) @@ -54,11 +53,3 @@ func RichTextSegsFromHTMLString(s string) []widget.RichTextSegment { return segs } - -func ClosePopUpOnEscape(pop *widget.PopUp) { - pop.Canvas.SetOnTypedKey(func(e *fyne.KeyEvent) { - if e.Name == fyne.KeyEscape { - pop.Hide() - } - }) -}