fix hiding of popups on escape
This commit is contained in:
@@ -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{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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()
|
||||
}
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user