beginning of work on fullscreen page

This commit is contained in:
Drew Weymouth
2024-03-01 16:59:04 -08:00
parent 1914821283
commit e719782437
6 changed files with 206 additions and 12 deletions
+2 -8
View File
@@ -2,7 +2,6 @@ package ui
import (
"image"
"log"
"time"
"github.com/dweymouth/supersonic/backend"
@@ -53,13 +52,8 @@ func NewBottomPanel(pm *backend.PlaybackManager, contr *controller.Controller) *
})
bp.NowPlaying = widgets.NewNowPlayingCard()
bp.NowPlaying.OnShowCoverImage = func() {
im, err := bp.ImageManager.GetFullSizeCoverArt(bp.coverArtID)
if err != nil {
log.Printf("error getting full size cover image: %s", err.Error())
} else {
contr.ShowPopUpImage(im)
}
bp.NowPlaying.OnCoverTapped = func() {
contr.NavigateTo(controller.FullscreenRoute())
}
bp.NowPlaying.OnSetFavorite = func(fav bool) {
contr.SetTrackFavorites([]string{pm.NowPlaying().ID}, fav)
+78
View File
@@ -0,0 +1,78 @@
package browsing
import (
"github.com/dweymouth/supersonic/backend"
"github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/sharedutil"
"github.com/dweymouth/supersonic/ui/controller"
"github.com/dweymouth/supersonic/ui/util"
"github.com/dweymouth/supersonic/ui/widgets"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
type FullscreenPage struct {
widget.BaseWidget
fullscreenPageState
queue []*mediaprovider.Track
card *widgets.LargeNowPlayingCard
nowPlayingID string
}
type fullscreenPageState struct {
contr *controller.Controller
pool *util.WidgetPool
pm *backend.PlaybackManager
canRate bool
}
func NewFullscreenPage(
contr *controller.Controller,
pool *util.WidgetPool,
pm *backend.PlaybackManager,
canRate bool,
) *FullscreenPage {
a := &FullscreenPage{fullscreenPageState: fullscreenPageState{
contr: contr, pool: pool, pm: pm, canRate: canRate,
}}
a.ExtendBaseWidget(a)
a.card = widgets.NewLargeNowPlayingCard()
a.Reload()
return a
}
func (a *FullscreenPage) CreateRenderer() fyne.WidgetRenderer {
container := container.NewPadded()
return widget.NewSimpleRenderer(container)
}
func (a *FullscreenPage) Save() SavedPage {
nps := a.fullscreenPageState
return &nps
}
func (a *FullscreenPage) Route() controller.Route {
return controller.NowPlayingRoute("")
}
var _ CanShowNowPlaying = (*FullscreenPage)(nil)
func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track) {
a.nowPlayingID = sharedutil.TrackIDOrEmptyStr(song)
a.card.Update(song.Name, song.ArtistNames, song.ArtistIDs, song.Album)
}
func (a *FullscreenPage) Reload() {
a.queue = a.pm.GetPlayQueue()
}
func (s *fullscreenPageState) Restore() Page {
return NewFullscreenPage(s.contr, s.pool, s.pm, s.canRate)
}
+3 -1
View File
@@ -30,6 +30,7 @@ func NewRouter(app *backend.App, controller *controller.Controller, nav Navigati
}
func (r Router) CreatePage(rte controller.Route) Page {
_, canRate := r.App.ServerManager.Server.(mediaprovider.SupportsRating)
switch rte.Page {
case controller.Album:
return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
@@ -41,12 +42,13 @@ func (r Router) CreatePage(rte controller.Route) Page {
return NewArtistsPage(r.Controller, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Favorites:
return NewFavoritesPage(&r.App.Config.FavoritesPage, r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager)
case controller.Fullscreen:
return NewFullscreenPage(r.Controller, r.widgetPool, r.App.PlaybackManager, canRate)
case controller.Genre:
return NewGenrePage(rte.Arg, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Genres:
return NewGenresPage(r.Controller, r.App.ServerManager.Server)
case controller.NowPlaying:
_, canRate := r.App.ServerManager.Server.(mediaprovider.SupportsRating)
return NewNowPlayingPage(rte.Arg, r.Controller, r.widgetPool, &r.App.Config.NowPlayingPage, r.App.PlaybackManager, canRate)
case controller.Playlist:
return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager)
+5
View File
@@ -8,6 +8,7 @@ const (
Albums
Artist
Artists
Fullscreen
Genre
Genres
Favorites
@@ -38,6 +39,10 @@ func FavoritesRoute() Route {
return Route{Page: Favorites}
}
func FullscreenRoute() Route {
return Route{Page: Fullscreen}
}
func GenreRoute(genre string) Route {
return Route{Page: Genre, Arg: genre}
}
+115
View File
@@ -0,0 +1,115 @@
package widgets
import (
"image"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"github.com/dweymouth/supersonic/ui/theme"
)
// Shows the current album art, track name, artist name, and album name
// for the currently playing track. Placed into the left side of the BottomPanel.
type LargeNowPlayingCard struct {
widget.BaseWidget
DisableRating bool
trackName *widget.Hyperlink
artistName *MultiHyperlink
albumName *widget.Hyperlink
cover *ImagePlaceholder
OnTrackNameTapped func()
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
OnShowCoverImage func()
OnSetRating func(rating int)
OnSetFavorite func(favorite bool)
OnAddToPlaylist func()
}
func NewLargeNowPlayingCard() *LargeNowPlayingCard {
n := &LargeNowPlayingCard{
trackName: widget.NewHyperlink("", nil),
artistName: NewMultiHyperlink(),
albumName: widget.NewHyperlink("", nil),
}
n.ExtendBaseWidget(n)
n.cover = NewImagePlaceholder(theme.TracksIcon, 300)
n.trackName.Hidden = true
n.albumName.Hidden = true
n.albumName.Truncation = fyne.TextTruncateEllipsis
n.trackName.Truncation = fyne.TextTruncateEllipsis
n.trackName.TextStyle.Bold = true
n.albumName.OnTapped = n.onAlbumNameTapped
n.artistName.OnTapped = n.onArtistNameTapped
n.trackName.OnTapped = n.onTrackNameTapped
return n
}
func (n *LargeNowPlayingCard) MinSize() fyne.Size {
// prop up height for when cover image is hidden
return fyne.NewSize(n.BaseWidget.MinSize().Width, 85)
}
func (n *LargeNowPlayingCard) onAlbumNameTapped() {
if n.OnAlbumNameTapped != nil {
n.OnAlbumNameTapped()
}
}
func (n *LargeNowPlayingCard) onArtistNameTapped(artistID string) {
if n.OnArtistNameTapped != nil {
n.OnArtistNameTapped(artistID)
}
}
func (n *LargeNowPlayingCard) onTrackNameTapped() {
if n.OnTrackNameTapped != nil {
n.OnTrackNameTapped()
}
}
func (n *LargeNowPlayingCard) onShowCoverImage(*fyne.PointEvent) {
if n.OnShowCoverImage != nil {
n.OnShowCoverImage()
}
}
func (n *LargeNowPlayingCard) onSetFavorite(fav bool) {
if n.OnSetFavorite != nil {
n.OnSetFavorite(fav)
}
}
func (n *LargeNowPlayingCard) onSetRating(rating int) {
if n.OnSetRating != nil {
n.OnSetRating(rating)
}
}
func (n *LargeNowPlayingCard) CreateRenderer() fyne.WidgetRenderer {
vbox := container.NewVBox(
n.trackName,
n.albumName,
n.artistName,
)
c := container.NewBorder(nil, vbox, nil, nil, n.cover)
return widget.NewSimpleRenderer(c)
}
func (n *LargeNowPlayingCard) Update(track string, artists, artistIDs []string, album string) {
n.trackName.SetText(track)
n.trackName.Hidden = track == ""
n.artistName.BuildSegments(artists, artistIDs)
n.albumName.SetText(album)
n.albumName.Hidden = album == ""
n.Refresh()
}
func (n *LargeNowPlayingCard) SetCoverImage(im image.Image) {
n.cover.SetImage(im, false)
}
+3 -3
View File
@@ -30,7 +30,7 @@ type NowPlayingCard struct {
OnTrackNameTapped func()
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
OnShowCoverImage func()
OnCoverTapped func()
OnSetRating func(rating int)
OnSetFavorite func(favorite bool)
OnAddToPlaylist func()
@@ -84,8 +84,8 @@ func (n *NowPlayingCard) onTrackNameTapped() {
}
func (n *NowPlayingCard) onShowCoverImage(*fyne.PointEvent) {
if n.OnShowCoverImage != nil {
n.OnShowCoverImage()
if n.OnCoverTapped != nil {
n.OnCoverTapped()
}
}