refactoring package organization
This commit is contained in:
+4
-3
@@ -5,6 +5,7 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"supersonic/backend"
|
"supersonic/backend"
|
||||||
"supersonic/player"
|
"supersonic/player"
|
||||||
|
"supersonic/ui/browsing"
|
||||||
"supersonic/ui/widgets"
|
"supersonic/ui/widgets"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
@@ -66,7 +67,7 @@ type BottomPanel struct {
|
|||||||
|
|
||||||
var _ fyne.Widget = (*BottomPanel)(nil)
|
var _ fyne.Widget = (*BottomPanel)(nil)
|
||||||
|
|
||||||
func NewBottomPanel(p *player.Player, nav func(Route)) *BottomPanel {
|
func NewBottomPanel(p *player.Player, nav func(browsing.Route)) *BottomPanel {
|
||||||
bp := &BottomPanel{}
|
bp := &BottomPanel{}
|
||||||
bp.ExtendBaseWidget(bp)
|
bp.ExtendBaseWidget(bp)
|
||||||
p.OnPaused(func() {
|
p.OnPaused(func() {
|
||||||
@@ -81,10 +82,10 @@ func NewBottomPanel(p *player.Player, nav func(Route)) *BottomPanel {
|
|||||||
|
|
||||||
bp.NowPlaying = widgets.NewNowPlayingCard()
|
bp.NowPlaying = widgets.NewNowPlayingCard()
|
||||||
bp.NowPlaying.OnAlbumNameTapped(func() {
|
bp.NowPlaying.OnAlbumNameTapped(func() {
|
||||||
nav(AlbumRoute(bp.playbackManager.NowPlaying().AlbumID))
|
nav(browsing.AlbumRoute(bp.playbackManager.NowPlaying().AlbumID))
|
||||||
})
|
})
|
||||||
bp.NowPlaying.OnArtistNameTapped(func() {
|
bp.NowPlaying.OnArtistNameTapped(func() {
|
||||||
nav(ArtistRoute(bp.playbackManager.NowPlaying().ArtistID))
|
nav(browsing.ArtistRoute(bp.playbackManager.NowPlaying().ArtistID))
|
||||||
})
|
})
|
||||||
bp.Controls = widgets.NewPlayerControls()
|
bp.Controls = widgets.NewPlayerControls()
|
||||||
bp.Controls.OnPlayPause(func() {
|
bp.Controls.OnPlayPause(func() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package ui
|
package browsing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ui
|
package browsing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"supersonic/backend"
|
"supersonic/backend"
|
||||||
@@ -19,8 +19,8 @@ type AlbumsPage struct {
|
|||||||
im *backend.ImageManager
|
im *backend.ImageManager
|
||||||
lm *backend.LibraryManager
|
lm *backend.LibraryManager
|
||||||
nav func(Route)
|
nav func(Route)
|
||||||
grid *AlbumGrid
|
grid *widgets.AlbumGrid
|
||||||
searchGrid *AlbumGrid
|
searchGrid *widgets.AlbumGrid
|
||||||
searchText string
|
searchText string
|
||||||
titleDisp *widget.RichText
|
titleDisp *widget.RichText
|
||||||
sortOrder *selectWidget
|
sortOrder *selectWidget
|
||||||
@@ -66,7 +66,7 @@ func NewAlbumsPage(title string, sortOrder string, lm *backend.LibraryManager, i
|
|||||||
a.sortOrder.OnChanged = a.onSortOrderChanged
|
a.sortOrder.OnChanged = a.onSortOrderChanged
|
||||||
sortVbox := container.NewVBox(layout.NewSpacer(), a.sortOrder, layout.NewSpacer())
|
sortVbox := container.NewVBox(layout.NewSpacer(), a.sortOrder, layout.NewSpacer())
|
||||||
iter := lm.AlbumsIter(backend.AlbumSortOrder(a.sortOrder.Selected))
|
iter := lm.AlbumsIter(backend.AlbumSortOrder(a.sortOrder.Selected))
|
||||||
a.grid = NewAlbumGrid(iter, im.GetAlbumThumbnail, false /*showYear*/)
|
a.grid = widgets.NewAlbumGrid(iter, im.GetAlbumThumbnail, false /*showYear*/)
|
||||||
a.grid.OnPlayAlbum = a.onPlayAlbum
|
a.grid.OnPlayAlbum = a.onPlayAlbum
|
||||||
a.grid.OnShowArtistPage = a.onShowArtistPage
|
a.grid.OnShowArtistPage = a.onShowArtistPage
|
||||||
a.grid.OnShowAlbumPage = a.onShowAlbumPage
|
a.grid.OnShowAlbumPage = a.onShowAlbumPage
|
||||||
@@ -91,7 +91,7 @@ func (a *AlbumsPage) OnSearched(query string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if a.searchGrid == nil {
|
if a.searchGrid == nil {
|
||||||
a.searchGrid = NewAlbumGrid(a.lm.SearchIter(query), a.im.GetAlbumThumbnail, false /*showYear*/)
|
a.searchGrid = widgets.NewAlbumGrid(a.lm.SearchIter(query), a.im.GetAlbumThumbnail, false /*showYear*/)
|
||||||
a.searchGrid.OnPlayAlbum = a.onPlayAlbum
|
a.searchGrid.OnPlayAlbum = a.onPlayAlbum
|
||||||
a.searchGrid.OnShowAlbumPage = a.onShowAlbumPage
|
a.searchGrid.OnShowAlbumPage = a.onShowAlbumPage
|
||||||
a.searchGrid.OnShowArtistPage = a.onShowArtistPage
|
a.searchGrid.OnShowArtistPage = a.onShowArtistPage
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
package ui
|
package browsing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"supersonic/backend"
|
"supersonic/backend"
|
||||||
|
"supersonic/ui/widgets"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
@@ -20,7 +21,7 @@ type ArtistPage struct {
|
|||||||
im *backend.ImageManager
|
im *backend.ImageManager
|
||||||
sm *backend.ServerManager
|
sm *backend.ServerManager
|
||||||
nav func(Route)
|
nav func(Route)
|
||||||
grid *AlbumGrid
|
grid *widgets.AlbumGrid
|
||||||
titleDisp *widget.RichText
|
titleDisp *widget.RichText
|
||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ func (a *ArtistPage) loadAsync() {
|
|||||||
}
|
}
|
||||||
a.titleDisp.Segments[0].(*widget.TextSegment).Text = artist.Name
|
a.titleDisp.Segments[0].(*widget.TextSegment).Text = artist.Name
|
||||||
a.titleDisp.Refresh()
|
a.titleDisp.Refresh()
|
||||||
ag := NewFixedAlbumGrid(artist.Album, a.im.GetAlbumThumbnail, true /*showYear*/)
|
ag := widgets.NewFixedAlbumGrid(artist.Album, a.im.GetAlbumThumbnail, true /*showYear*/)
|
||||||
ag.OnPlayAlbum = a.onPlayAlbum
|
ag.OnPlayAlbum = a.onPlayAlbum
|
||||||
ag.OnShowAlbumPage = a.onShowAlbumPage
|
ag.OnShowAlbumPage = a.onShowAlbumPage
|
||||||
a.container.Objects[0] = ag
|
a.container.Objects[0] = ag
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ui
|
package browsing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
package ui
|
package browsing
|
||||||
|
|
||||||
import "supersonic/backend"
|
import (
|
||||||
|
"supersonic/backend"
|
||||||
|
)
|
||||||
|
|
||||||
type PageName int
|
type PageName int
|
||||||
|
|
||||||
+6
-5
@@ -2,6 +2,7 @@ package ui
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"supersonic/backend"
|
"supersonic/backend"
|
||||||
|
"supersonic/ui/browsing"
|
||||||
"supersonic/ui/widgets"
|
"supersonic/ui/widgets"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
@@ -13,8 +14,8 @@ import (
|
|||||||
type MainWindow struct {
|
type MainWindow struct {
|
||||||
Window fyne.Window
|
Window fyne.Window
|
||||||
|
|
||||||
Router Router
|
Router browsing.Router
|
||||||
BrowsingPane *BrowsingPane
|
BrowsingPane *browsing.BrowsingPane
|
||||||
BottomPanel *BottomPanel
|
BottomPanel *BottomPanel
|
||||||
|
|
||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
@@ -23,9 +24,9 @@ type MainWindow struct {
|
|||||||
func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindow {
|
func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindow {
|
||||||
m := MainWindow{
|
m := MainWindow{
|
||||||
Window: fyneApp.NewWindow(appName),
|
Window: fyneApp.NewWindow(appName),
|
||||||
BrowsingPane: NewBrowsingPane(app),
|
BrowsingPane: browsing.NewBrowsingPane(app),
|
||||||
}
|
}
|
||||||
m.Router = NewRouter(app, m.BrowsingPane)
|
m.Router = browsing.NewRouter(app, m.BrowsingPane)
|
||||||
m.BottomPanel = NewBottomPanel(app.Player, m.Router.OpenRoute)
|
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
|
||||||
@@ -40,7 +41,7 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindo
|
|||||||
m.Window.SetTitle(song.Title)
|
m.Window.SetTitle(song.Title)
|
||||||
})
|
})
|
||||||
app.ServerManager.OnServerConnected(func() {
|
app.ServerManager.OnServerConnected(func() {
|
||||||
m.Router.OpenRoute(AlbumsRoute(backend.AlbumSortRecentlyAdded))
|
m.Router.OpenRoute(browsing.AlbumsRoute(backend.AlbumSortRecentlyAdded))
|
||||||
})
|
})
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package ui
|
package widgets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"image"
|
"image"
|
||||||
"log"
|
"log"
|
||||||
"supersonic/backend"
|
|
||||||
"supersonic/ui/widgets"
|
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
@@ -14,12 +12,16 @@ import (
|
|||||||
|
|
||||||
type ImageFetcher func(string) (image.Image, error)
|
type ImageFetcher func(string) (image.Image, error)
|
||||||
|
|
||||||
|
type AlbumIterator interface {
|
||||||
|
NextN(int, func(*subsonic.AlbumID3))
|
||||||
|
}
|
||||||
|
|
||||||
type AlbumGrid struct {
|
type AlbumGrid struct {
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
|
|
||||||
grid *widget.GridWrapList
|
grid *widget.GridWrapList
|
||||||
albums []*subsonic.AlbumID3
|
albums []*subsonic.AlbumID3
|
||||||
iter backend.AlbumIterator
|
iter AlbumIterator
|
||||||
fetching bool
|
fetching bool
|
||||||
done bool
|
done bool
|
||||||
showYear bool
|
showYear bool
|
||||||
@@ -44,7 +46,7 @@ func NewFixedAlbumGrid(albums []*subsonic.AlbumID3, fetch ImageFetcher, showYear
|
|||||||
return ag
|
return ag
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAlbumGrid(iter backend.AlbumIterator, fetch ImageFetcher, showYear bool) *AlbumGrid {
|
func NewAlbumGrid(iter AlbumIterator, fetch ImageFetcher, showYear bool) *AlbumGrid {
|
||||||
ag := &AlbumGrid{
|
ag := &AlbumGrid{
|
||||||
iter: iter,
|
iter: iter,
|
||||||
imageFetcher: fetch,
|
imageFetcher: fetch,
|
||||||
@@ -63,7 +65,7 @@ func (ag *AlbumGrid) Clear() {
|
|||||||
ag.done = true
|
ag.done = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ag *AlbumGrid) Reset(iter backend.AlbumIterator) {
|
func (ag *AlbumGrid) Reset(iter AlbumIterator) {
|
||||||
ag.albums = nil
|
ag.albums = nil
|
||||||
ag.fetching = false
|
ag.fetching = false
|
||||||
ag.done = false
|
ag.done = false
|
||||||
@@ -78,7 +80,7 @@ func (ag *AlbumGrid) createGridWrapList() {
|
|||||||
},
|
},
|
||||||
// create func
|
// create func
|
||||||
func() fyne.CanvasObject {
|
func() fyne.CanvasObject {
|
||||||
ac := widgets.NewAlbumCard(ag.showYear)
|
ac := NewAlbumCard(ag.showYear)
|
||||||
ac.OnPlay = func() {
|
ac.OnPlay = func() {
|
||||||
if ag.OnPlayAlbum != nil {
|
if ag.OnPlayAlbum != nil {
|
||||||
ag.OnPlayAlbum(ac.AlbumID())
|
ag.OnPlayAlbum(ac.AlbumID())
|
||||||
@@ -98,14 +100,14 @@ func (ag *AlbumGrid) createGridWrapList() {
|
|||||||
},
|
},
|
||||||
// update func
|
// update func
|
||||||
func(itemID int, obj fyne.CanvasObject) {
|
func(itemID int, obj fyne.CanvasObject) {
|
||||||
ac := obj.(*widgets.AlbumCard)
|
ac := obj.(*AlbumCard)
|
||||||
ag.doUpdateAlbumCard(itemID, ac)
|
ag.doUpdateAlbumCard(itemID, ac)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
ag.grid = g
|
ag.grid = g
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ag *AlbumGrid) doUpdateAlbumCard(albumIdx int, ac *widgets.AlbumCard) {
|
func (ag *AlbumGrid) doUpdateAlbumCard(albumIdx int, ac *AlbumCard) {
|
||||||
album := ag.albums[albumIdx]
|
album := ag.albums[albumIdx]
|
||||||
if ac.PrevAlbumID == album.ID {
|
if ac.PrevAlbumID == album.ID {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
Reference in New Issue
Block a user