make artist/album in now playing card navigable
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user