make artist/album in now playing card navigable

This commit is contained in:
Drew Weymouth
2023-01-03 16:59:16 -08:00
parent f2268ca6f8
commit 4912e6d180
7 changed files with 46 additions and 21 deletions
+4
View File
@@ -45,6 +45,10 @@ func (a *AlbumPage) SetPlayAlbumCallback(cb func(string, int)) {
a.OnPlayAlbum = cb a.OnPlayAlbum = cb
} }
func (a *AlbumPage) Route() Route {
return AlbumRoute(a.albumID)
}
func (a *AlbumPage) onPlayTrackAt(tracknum int) { func (a *AlbumPage) onPlayTrackAt(tracknum int) {
if a.OnPlayAlbum != nil { if a.OnPlayAlbum != nil {
a.OnPlayAlbum(a.albumID, tracknum) a.OnPlayAlbum(a.albumID, tracknum)
+4
View File
@@ -102,6 +102,10 @@ func (a *AlbumsPage) OnSearched(query string) {
a.Refresh() a.Refresh()
} }
func (a *AlbumsPage) Route() Route {
return AlbumsRoute(backend.AlbumSortOrder(a.sortOrder.Selected))
}
func (a *AlbumsPage) SetPlayAlbumCallback(cb func(string, int)) { func (a *AlbumsPage) SetPlayAlbumCallback(cb func(string, int)) {
a.OnPlayAlbum = cb a.OnPlayAlbum = cb
} }
+4
View File
@@ -44,6 +44,10 @@ func NewArtistPage(artistID string, sm *backend.ServerManager, im *backend.Image
return a return a
} }
func (a *ArtistPage) Route() Route {
return ArtistRoute(a.artistID)
}
func (a *ArtistPage) SetPlayAlbumCallback(cb func(string, int)) { func (a *ArtistPage) SetPlayAlbumCallback(cb func(string, int)) {
a.OnPlayAlbum = cb a.OnPlayAlbum = cb
} }
+8 -3
View File
@@ -55,8 +55,7 @@ func (b *bottomPanelLayout) Layout(_ []fyne.CanvasObject, size fyne.Size) {
type BottomPanel struct { type BottomPanel struct {
widget.BaseWidget widget.BaseWidget
ImageManager *backend.ImageManager ImageManager *backend.ImageManager
playbackManager *backend.PlaybackManager playbackManager *backend.PlaybackManager
NowPlaying *widgets.NowPlayingCard NowPlaying *widgets.NowPlayingCard
@@ -67,7 +66,7 @@ type BottomPanel struct {
var _ fyne.Widget = (*BottomPanel)(nil) var _ fyne.Widget = (*BottomPanel)(nil)
func NewBottomPanel(p *player.Player) *BottomPanel { func NewBottomPanel(p *player.Player, nav func(Route)) *BottomPanel {
bp := &BottomPanel{} bp := &BottomPanel{}
bp.ExtendBaseWidget(bp) bp.ExtendBaseWidget(bp)
p.OnPaused(func() { p.OnPaused(func() {
@@ -81,6 +80,12 @@ func NewBottomPanel(p *player.Player) *BottomPanel {
}) })
bp.NowPlaying = widgets.NewNowPlayingCard() 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 = widgets.NewPlayerControls()
bp.Controls.OnPlayPause(func() { bp.Controls.OnPlayPause(func() {
p.PlayPause() p.PlayPause()
+11 -9
View File
@@ -17,6 +17,8 @@ import (
type Page interface { type Page interface {
fyne.CanvasObject fyne.CanvasObject
Route() Route
} }
type Searchable interface { type Searchable interface {
@@ -48,10 +50,6 @@ type BrowsingPane struct {
container *fyne.Container container *fyne.Container
} }
type blankPage struct {
layout.Spacer
}
func NewBrowsingPane(app *backend.App) *BrowsingPane { func NewBrowsingPane(app *backend.App) *BrowsingPane {
b := &BrowsingPane{app: app} b := &BrowsingPane{app: app}
b.ExtendBaseWidget(b) b.ExtendBaseWidget(b)
@@ -59,10 +57,9 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane {
b.searchBar.OnTextChanged = b.onSearchTextChanged b.searchBar.OnTextChanged = b.onSearchTextChanged
b.back = widget.NewButtonWithIcon("", theme.NavigateBackIcon(), b.GoBack) b.back = widget.NewButtonWithIcon("", theme.NavigateBackIcon(), b.GoBack)
b.forward = widget.NewButtonWithIcon("", theme.NavigateNextIcon(), b.GoForward) b.forward = widget.NewButtonWithIcon("", theme.NavigateNextIcon(), b.GoForward)
b.curPage = &blankPage{}
b.pageContainer = container.NewMax( b.pageContainer = container.NewMax(
canvas.NewRectangle(color.RGBA{R: 24, G: 24, B: 24, A: 255}), canvas.NewRectangle(color.RGBA{R: 24, G: 24, B: 24, A: 255}),
b.curPage) layout.NewSpacer())
b.container = container.NewBorder( b.container = container.NewBorder(
container.NewHBox(b.back, b.forward, b.searchBar), container.NewHBox(b.back, b.forward, b.searchBar),
nil, nil, nil, b.pageContainer) nil, nil, nil, b.pageContainer)
@@ -70,11 +67,15 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane {
} }
func (b *BrowsingPane) SetPage(p Page) { func (b *BrowsingPane) SetPage(p Page) {
b.addPageToHistory(p) if b.doSetPage(p) {
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 b.curPage = p
if pa, ok := p.(CanPlayAlbum); ok { if pa, ok := p.(CanPlayAlbum); ok {
pa.SetPlayAlbumCallback(func(albumID string, firstTrack int) { pa.SetPlayAlbumCallback(func(albumID string, firstTrack int) {
@@ -85,6 +86,7 @@ func (b *BrowsingPane) doSetPage(p Page) {
b.searchBar.Hidden = !s b.searchBar.Hidden = !s
b.pageContainer.Objects[1] = p b.pageContainer.Objects[1] = p
b.Refresh() b.Refresh()
return true
} }
func (b *BrowsingPane) addPageToHistory(p Page) { func (b *BrowsingPane) addPageToHistory(p Page) {
+1 -1
View File
@@ -24,9 +24,9 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindo
m := MainWindow{ m := MainWindow{
Window: fyneApp.NewWindow(appName), Window: fyneApp.NewWindow(appName),
BrowsingPane: NewBrowsingPane(app), BrowsingPane: NewBrowsingPane(app),
BottomPanel: NewBottomPanel(app.Player),
} }
m.Router = NewRouter(app, m.BrowsingPane) m.Router = NewRouter(app, m.BrowsingPane)
m.BottomPanel = NewBottomPanel(app.Player, m.Router.OpenRoute)
m.BottomPanel.SetPlaybackManager(app.PlaybackManager) m.BottomPanel.SetPlaybackManager(app.PlaybackManager)
m.BottomPanel.ImageManager = app.ImageManager m.BottomPanel.ImageManager = app.ImageManager
m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane) m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane)
+14 -8
View File
@@ -15,8 +15,8 @@ type NowPlayingCard struct {
widget.BaseWidget widget.BaseWidget
trackName *widget.Label trackName *widget.Label
artistName *widget.Label artistName *CustomHyperlink
albumName *widget.Label albumName *CustomHyperlink
cover *canvas.Image cover *canvas.Image
c fyne.CanvasObject c fyne.CanvasObject
@@ -25,15 +25,13 @@ type NowPlayingCard struct {
func NewNowPlayingCard() *NowPlayingCard { func NewNowPlayingCard() *NowPlayingCard {
n := &NowPlayingCard{ n := &NowPlayingCard{
trackName: widget.NewLabel(""), trackName: widget.NewLabel(""),
artistName: widget.NewLabel(""), artistName: NewCustomHyperlink(),
albumName: widget.NewLabel(""), albumName: NewCustomHyperlink(),
cover: &canvas.Image{}, cover: &canvas.Image{},
} }
n.ExtendBaseWidget(n) n.ExtendBaseWidget(n)
n.trackName.Wrapping = fyne.TextTruncate n.trackName.Wrapping = fyne.TextTruncate
n.trackName.TextStyle = fyne.TextStyle{Bold: true} 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.SetMinSize(fyne.NewSize(100, 100))
n.cover.FillMode = canvas.ImageFillContain 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) { func (n *NowPlayingCard) Update(track, artist, album string, cover image.Image) {
n.trackName.Text = track n.trackName.Text = track
n.artistName.Text = artist n.artistName.SetText(artist)
n.albumName.Text = album n.albumName.SetText(album)
n.cover.Image = cover n.cover.Image = cover
n.c.Refresh() n.c.Refresh()
} }
func (n *NowPlayingCard) OnArtistNameTapped(f func()) {
n.artistName.OnTapped = f
}
func (n *NowPlayingCard) OnAlbumNameTapped(f func()) {
n.albumName.OnTapped = f
}