From 4912e6d180a5f011c9c25c20c4bcb27dad0896ac Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 3 Jan 2023 16:59:16 -0800 Subject: [PATCH] make artist/album in now playing card navigable --- ui/albumpage.go | 4 ++++ ui/albumspage.go | 4 ++++ ui/artistpage.go | 4 ++++ ui/bottompanel.go | 11 ++++++++--- ui/browsingpane.go | 20 +++++++++++--------- ui/mainwindow.go | 2 +- ui/widgets/nowplayingcard.go | 22 ++++++++++++++-------- 7 files changed, 46 insertions(+), 21 deletions(-) diff --git a/ui/albumpage.go b/ui/albumpage.go index bbea135..6931ada 100644 --- a/ui/albumpage.go +++ b/ui/albumpage.go @@ -45,6 +45,10 @@ func (a *AlbumPage) SetPlayAlbumCallback(cb func(string, int)) { a.OnPlayAlbum = cb } +func (a *AlbumPage) Route() Route { + return AlbumRoute(a.albumID) +} + func (a *AlbumPage) onPlayTrackAt(tracknum int) { if a.OnPlayAlbum != nil { a.OnPlayAlbum(a.albumID, tracknum) diff --git a/ui/albumspage.go b/ui/albumspage.go index 2f01f02..e4f557a 100644 --- a/ui/albumspage.go +++ b/ui/albumspage.go @@ -102,6 +102,10 @@ func (a *AlbumsPage) OnSearched(query string) { a.Refresh() } +func (a *AlbumsPage) Route() Route { + return AlbumsRoute(backend.AlbumSortOrder(a.sortOrder.Selected)) +} + func (a *AlbumsPage) SetPlayAlbumCallback(cb func(string, int)) { a.OnPlayAlbum = cb } diff --git a/ui/artistpage.go b/ui/artistpage.go index 32eef21..6d4394c 100644 --- a/ui/artistpage.go +++ b/ui/artistpage.go @@ -44,6 +44,10 @@ func NewArtistPage(artistID string, sm *backend.ServerManager, im *backend.Image return a } +func (a *ArtistPage) Route() Route { + return ArtistRoute(a.artistID) +} + func (a *ArtistPage) SetPlayAlbumCallback(cb func(string, int)) { a.OnPlayAlbum = cb } diff --git a/ui/bottompanel.go b/ui/bottompanel.go index a942b42..c301a54 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -55,8 +55,7 @@ func (b *bottomPanelLayout) Layout(_ []fyne.CanvasObject, size fyne.Size) { type BottomPanel struct { widget.BaseWidget - ImageManager *backend.ImageManager - + ImageManager *backend.ImageManager playbackManager *backend.PlaybackManager NowPlaying *widgets.NowPlayingCard @@ -67,7 +66,7 @@ type BottomPanel struct { var _ fyne.Widget = (*BottomPanel)(nil) -func NewBottomPanel(p *player.Player) *BottomPanel { +func NewBottomPanel(p *player.Player, nav func(Route)) *BottomPanel { bp := &BottomPanel{} bp.ExtendBaseWidget(bp) p.OnPaused(func() { @@ -81,6 +80,12 @@ func NewBottomPanel(p *player.Player) *BottomPanel { }) bp.NowPlaying = widgets.NewNowPlayingCard() + bp.NowPlaying.OnAlbumNameTapped(func() { + nav(AlbumRoute(bp.playbackManager.NowPlaying().AlbumID)) + }) + bp.NowPlaying.OnArtistNameTapped(func() { + nav(ArtistRoute(bp.playbackManager.NowPlaying().ArtistID)) + }) bp.Controls = widgets.NewPlayerControls() bp.Controls.OnPlayPause(func() { p.PlayPause() diff --git a/ui/browsingpane.go b/ui/browsingpane.go index c964880..09fe727 100644 --- a/ui/browsingpane.go +++ b/ui/browsingpane.go @@ -17,6 +17,8 @@ import ( type Page interface { fyne.CanvasObject + + Route() Route } type Searchable interface { @@ -48,10 +50,6 @@ type BrowsingPane struct { container *fyne.Container } -type blankPage struct { - layout.Spacer -} - func NewBrowsingPane(app *backend.App) *BrowsingPane { b := &BrowsingPane{app: app} b.ExtendBaseWidget(b) @@ -59,10 +57,9 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane { b.searchBar.OnTextChanged = b.onSearchTextChanged b.back = widget.NewButtonWithIcon("", theme.NavigateBackIcon(), b.GoBack) b.forward = widget.NewButtonWithIcon("", theme.NavigateNextIcon(), b.GoForward) - b.curPage = &blankPage{} b.pageContainer = container.NewMax( canvas.NewRectangle(color.RGBA{R: 24, G: 24, B: 24, A: 255}), - b.curPage) + layout.NewSpacer()) b.container = container.NewBorder( container.NewHBox(b.back, b.forward, b.searchBar), nil, nil, nil, b.pageContainer) @@ -70,11 +67,15 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane { } func (b *BrowsingPane) SetPage(p Page) { - b.addPageToHistory(p) - b.doSetPage(p) + if b.doSetPage(p) { + b.addPageToHistory(p) + } } -func (b *BrowsingPane) doSetPage(p Page) { +func (b *BrowsingPane) doSetPage(p Page) bool { + if b.curPage != nil && b.curPage.Route() == p.Route() { + return false + } b.curPage = p if pa, ok := p.(CanPlayAlbum); ok { pa.SetPlayAlbumCallback(func(albumID string, firstTrack int) { @@ -85,6 +86,7 @@ func (b *BrowsingPane) doSetPage(p Page) { b.searchBar.Hidden = !s b.pageContainer.Objects[1] = p b.Refresh() + return true } func (b *BrowsingPane) addPageToHistory(p Page) { diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 81f79e4..cfe7bd2 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -24,9 +24,9 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindo m := MainWindow{ Window: fyneApp.NewWindow(appName), BrowsingPane: NewBrowsingPane(app), - BottomPanel: NewBottomPanel(app.Player), } m.Router = NewRouter(app, m.BrowsingPane) + m.BottomPanel = NewBottomPanel(app.Player, m.Router.OpenRoute) m.BottomPanel.SetPlaybackManager(app.PlaybackManager) m.BottomPanel.ImageManager = app.ImageManager m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane) diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index f87a718..ca741ad 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -15,8 +15,8 @@ type NowPlayingCard struct { widget.BaseWidget trackName *widget.Label - artistName *widget.Label - albumName *widget.Label + artistName *CustomHyperlink + albumName *CustomHyperlink cover *canvas.Image c fyne.CanvasObject @@ -25,15 +25,13 @@ type NowPlayingCard struct { func NewNowPlayingCard() *NowPlayingCard { n := &NowPlayingCard{ trackName: widget.NewLabel(""), - artistName: widget.NewLabel(""), - albumName: widget.NewLabel(""), + artistName: NewCustomHyperlink(), + albumName: NewCustomHyperlink(), cover: &canvas.Image{}, } n.ExtendBaseWidget(n) n.trackName.Wrapping = fyne.TextTruncate n.trackName.TextStyle = fyne.TextStyle{Bold: true} - n.artistName.Wrapping = fyne.TextTruncate - n.albumName.Wrapping = fyne.TextTruncate n.cover.SetMinSize(fyne.NewSize(100, 100)) n.cover.FillMode = canvas.ImageFillContain @@ -47,8 +45,16 @@ func (n *NowPlayingCard) CreateRenderer() fyne.WidgetRenderer { func (n *NowPlayingCard) Update(track, artist, album string, cover image.Image) { n.trackName.Text = track - n.artistName.Text = artist - n.albumName.Text = album + n.artistName.SetText(artist) + n.albumName.SetText(album) n.cover.Image = cover n.c.Refresh() } + +func (n *NowPlayingCard) OnArtistNameTapped(f func()) { + n.artistName.OnTapped = f +} + +func (n *NowPlayingCard) OnAlbumNameTapped(f func()) { + n.albumName.OnTapped = f +}