fix hiding of popups on escape

This commit is contained in:
Drew Weymouth
2023-03-03 20:51:04 -08:00
parent 37928881c0
commit a8ea12feaf
13 changed files with 59 additions and 55 deletions
+2 -2
View File
@@ -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{
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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,
+3 -3
View File
@@ -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
}
+3 -3
View File
@@ -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
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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,
+2 -2
View File
@@ -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,
+3 -3
View File
@@ -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
}
+10 -10
View File
@@ -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
}
+19 -12
View File
@@ -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 {
+7 -1
View File
@@ -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()
}
})
-9
View File
@@ -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()
}
})
}