add (non-focused) keyboard scrolling to grid view pages
This commit is contained in:
@@ -148,6 +148,15 @@ func (a *ArtistPage) OnSongChange(track, lastScrobbledIfAny *mediaprovider.Track
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ Scrollable = (*ArtistPage)(nil)
|
||||||
|
|
||||||
|
func (g *ArtistPage) Scroll(scrollAmt float32) {
|
||||||
|
if g.activeView == 0 && g.albumGrid != nil {
|
||||||
|
g.albumGrid.ScrollToOffset(g.albumGrid.GetScrollOffset() + scrollAmt)
|
||||||
|
g.albumGrid.Refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (a *ArtistPage) playArtistRadio() {
|
func (a *ArtistPage) playArtistRadio() {
|
||||||
go a.pm.PlaySimilarSongs(a.artistID)
|
go a.pm.PlaySimilarSongs(a.artistID)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,6 +164,13 @@ func createArtistsGridViewModel(artists []*mediaprovider.Artist) []widgets.GridV
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ Scrollable = (*ArtistsPage)(nil)
|
||||||
|
|
||||||
|
func (a *ArtistsPage) Scroll(scrollAmt float32) {
|
||||||
|
a.grid.ScrollToOffset(a.grid.GetScrollOffset() + scrollAmt)
|
||||||
|
a.grid.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func (a *ArtistsPage) CreateRenderer() fyne.WidgetRenderer {
|
func (a *ArtistsPage) CreateRenderer() fyne.WidgetRenderer {
|
||||||
return widget.NewSimpleRenderer(a.container)
|
return widget.NewSimpleRenderer(a.container)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,10 +30,17 @@ type Searchable interface {
|
|||||||
SearchWidget() fyne.Focusable
|
SearchWidget() fyne.Focusable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pages with selection should implement this interface to receive Ctrl+A events
|
||||||
type CanSelectAll interface {
|
type CanSelectAll interface {
|
||||||
SelectAll()
|
SelectAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pages that have one main scrollable view should implement this interface
|
||||||
|
// to receive callbacks from window-level keyboard scrolling (up/down)
|
||||||
|
type Scrollable interface {
|
||||||
|
Scroll(amount float32)
|
||||||
|
}
|
||||||
|
|
||||||
type CanShowNowPlaying interface {
|
type CanShowNowPlaying interface {
|
||||||
OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track)
|
OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track)
|
||||||
}
|
}
|
||||||
@@ -169,6 +176,18 @@ func (b *BrowsingPane) SelectAll() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BrowsingPane) ScrollUp() {
|
||||||
|
if s, ok := b.curPage.(Scrollable); ok {
|
||||||
|
s.Scroll(-75)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BrowsingPane) ScrollDown() {
|
||||||
|
if s, ok := b.curPage.(Scrollable); ok {
|
||||||
|
s.Scroll(75)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (b *BrowsingPane) doSetPage(p Page) bool {
|
func (b *BrowsingPane) doSetPage(p Page) bool {
|
||||||
if b.curPage != nil && b.curPage.Route() == p.Route() {
|
if b.curPage != nil && b.curPage.Route() == p.Route() {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ type FavoritesPage struct {
|
|||||||
nowPlayingID string
|
nowPlayingID string
|
||||||
pendingViewSwitch bool
|
pendingViewSwitch bool
|
||||||
|
|
||||||
grid *widgets.GridView
|
albumGrid *widgets.GridView
|
||||||
gridState *widgets.GridViewState
|
gridState *widgets.GridViewState
|
||||||
searchGridState *widgets.GridViewState
|
searchGridState *widgets.GridViewState
|
||||||
artistGrid *widgets.GridView
|
artistGrid *widgets.GridView
|
||||||
@@ -63,13 +63,13 @@ func NewFavoritesPage(cfg *backend.FavoritesPageConfig, pool *util.WidgetPool, c
|
|||||||
a.createHeader(0)
|
a.createHeader(0)
|
||||||
iter := widgets.NewGridViewAlbumIterator(mp.IterateAlbums("", a.filter))
|
iter := widgets.NewGridViewAlbumIterator(mp.IterateAlbums("", a.filter))
|
||||||
if g := pool.Obtain(util.WidgetTypeGridView); g != nil {
|
if g := pool.Obtain(util.WidgetTypeGridView); g != nil {
|
||||||
a.grid = g.(*widgets.GridView)
|
a.albumGrid = g.(*widgets.GridView)
|
||||||
a.grid.Placeholder = myTheme.AlbumIcon
|
a.albumGrid.Placeholder = myTheme.AlbumIcon
|
||||||
a.grid.Reset(iter)
|
a.albumGrid.Reset(iter)
|
||||||
} else {
|
} else {
|
||||||
a.grid = widgets.NewGridView(iter, a.im, myTheme.AlbumIcon)
|
a.albumGrid = widgets.NewGridView(iter, a.im, myTheme.AlbumIcon)
|
||||||
}
|
}
|
||||||
a.contr.ConnectAlbumGridActions(a.grid)
|
a.contr.ConnectAlbumGridActions(a.albumGrid)
|
||||||
if cfg.InitialView == "Artists" {
|
if cfg.InitialView == "Artists" {
|
||||||
a.toggleBtns.SetActivatedButton(1)
|
a.toggleBtns.SetActivatedButton(1)
|
||||||
a.onShowFavoriteArtists()
|
a.onShowFavoriteArtists()
|
||||||
@@ -77,7 +77,7 @@ func NewFavoritesPage(cfg *backend.FavoritesPageConfig, pool *util.WidgetPool, c
|
|||||||
a.toggleBtns.SetActivatedButton(2)
|
a.toggleBtns.SetActivatedButton(2)
|
||||||
a.onShowFavoriteSongs()
|
a.onShowFavoriteSongs()
|
||||||
} else { // Albums view
|
} else { // Albums view
|
||||||
a.createContainer(a.grid)
|
a.createContainer(a.albumGrid)
|
||||||
}
|
}
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
@@ -128,11 +128,11 @@ func restoreFavoritesPage(saved *savedFavoritesPage) *FavoritesPage {
|
|||||||
state = saved.searchGridState
|
state = saved.searchGridState
|
||||||
}
|
}
|
||||||
if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
|
if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
|
||||||
a.grid = g.(*widgets.GridView)
|
a.albumGrid = g.(*widgets.GridView)
|
||||||
a.grid.Placeholder = myTheme.AlbumIcon
|
a.albumGrid.Placeholder = myTheme.AlbumIcon
|
||||||
a.grid.ResetFromState(state)
|
a.albumGrid.ResetFromState(state)
|
||||||
} else {
|
} else {
|
||||||
a.grid = widgets.NewGridViewFromState(state)
|
a.albumGrid = widgets.NewGridViewFromState(state)
|
||||||
}
|
}
|
||||||
a.toggleBtns.SetActivatedButton(saved.activeToggleBtn)
|
a.toggleBtns.SetActivatedButton(saved.activeToggleBtn)
|
||||||
|
|
||||||
@@ -141,12 +141,28 @@ func restoreFavoritesPage(saved *savedFavoritesPage) *FavoritesPage {
|
|||||||
} else if saved.activeToggleBtn == 2 {
|
} else if saved.activeToggleBtn == 2 {
|
||||||
a.onShowFavoriteSongs()
|
a.onShowFavoriteSongs()
|
||||||
} else {
|
} else {
|
||||||
a.createContainer(a.grid)
|
a.createContainer(a.albumGrid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ Scrollable = (*FavoritesPage)(nil)
|
||||||
|
|
||||||
|
func (a *FavoritesPage) Scroll(amount float32) {
|
||||||
|
var grid *widgets.GridView
|
||||||
|
switch a.toggleBtns.ActivatedButtonIndex() {
|
||||||
|
case 0: // albums
|
||||||
|
grid = a.albumGrid
|
||||||
|
case 1: // artists
|
||||||
|
grid = a.artistGrid
|
||||||
|
default:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
grid.ScrollToOffset(grid.GetScrollOffset() + amount)
|
||||||
|
grid.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func (a *FavoritesPage) Route() controller.Route {
|
func (a *FavoritesPage) Route() controller.Route {
|
||||||
return controller.FavoritesRoute()
|
return controller.FavoritesRoute()
|
||||||
}
|
}
|
||||||
@@ -163,7 +179,7 @@ func (a *FavoritesPage) Reload() {
|
|||||||
a.doSearchAlbums(a.searchText)
|
a.doSearchAlbums(a.searchText)
|
||||||
} else {
|
} else {
|
||||||
iter := a.mp.IterateAlbums("", a.filter)
|
iter := a.mp.IterateAlbums("", a.filter)
|
||||||
a.grid.Reset(widgets.NewGridViewAlbumIterator(iter))
|
a.albumGrid.Reset(widgets.NewGridViewAlbumIterator(iter))
|
||||||
}
|
}
|
||||||
if a.tracklistCtr != nil || a.artistGrid != nil {
|
if a.tracklistCtr != nil || a.artistGrid != nil {
|
||||||
go func() {
|
go func() {
|
||||||
@@ -213,12 +229,12 @@ func (a *FavoritesPage) Save() SavedPage {
|
|||||||
activeToggleBtn: a.toggleBtns.ActivatedButtonIndex(),
|
activeToggleBtn: a.toggleBtns.ActivatedButtonIndex(),
|
||||||
}
|
}
|
||||||
if a.searchText != "" {
|
if a.searchText != "" {
|
||||||
sf.searchGridState = a.grid.SaveToState()
|
sf.searchGridState = a.albumGrid.SaveToState()
|
||||||
} else {
|
} else {
|
||||||
sf.gridState = a.grid.SaveToState()
|
sf.gridState = a.albumGrid.SaveToState()
|
||||||
}
|
}
|
||||||
a.grid.Clear()
|
a.albumGrid.Clear()
|
||||||
a.pool.Release(util.WidgetTypeGridView, a.grid)
|
a.pool.Release(util.WidgetTypeGridView, a.albumGrid)
|
||||||
if a.artistGrid != nil {
|
if a.artistGrid != nil {
|
||||||
a.artistGrid.Clear()
|
a.artistGrid.Clear()
|
||||||
a.pool.Release(util.WidgetTypeGridView, a.artistGrid)
|
a.pool.Release(util.WidgetTypeGridView, a.artistGrid)
|
||||||
@@ -240,7 +256,7 @@ func (a *FavoritesPage) SearchWidget() fyne.Focusable {
|
|||||||
|
|
||||||
func (a *FavoritesPage) OnSearched(query string) {
|
func (a *FavoritesPage) OnSearched(query string) {
|
||||||
if query == "" {
|
if query == "" {
|
||||||
a.grid.ResetFromState(a.gridState)
|
a.albumGrid.ResetFromState(a.gridState)
|
||||||
a.searchGridState = nil
|
a.searchGridState = nil
|
||||||
} else {
|
} else {
|
||||||
a.doSearchAlbums(query)
|
a.doSearchAlbums(query)
|
||||||
@@ -269,17 +285,17 @@ func (a *FavoritesPage) SelectAll() {
|
|||||||
|
|
||||||
func (a *FavoritesPage) doSearchAlbums(query string) {
|
func (a *FavoritesPage) doSearchAlbums(query string) {
|
||||||
if a.searchText == "" {
|
if a.searchText == "" {
|
||||||
a.gridState = a.grid.SaveToState()
|
a.gridState = a.albumGrid.SaveToState()
|
||||||
}
|
}
|
||||||
iter := widgets.NewGridViewAlbumIterator(a.mp.SearchAlbums(query, a.filter))
|
iter := widgets.NewGridViewAlbumIterator(a.mp.SearchAlbums(query, a.filter))
|
||||||
a.grid.Reset(iter)
|
a.albumGrid.Reset(iter)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *FavoritesPage) onShowFavoriteAlbums() {
|
func (a *FavoritesPage) onShowFavoriteAlbums() {
|
||||||
a.cfg.InitialView = "Albums" // save setting
|
a.cfg.InitialView = "Albums" // save setting
|
||||||
a.searcher.Entry.Show()
|
a.searcher.Entry.Show()
|
||||||
a.filterBtn.Show()
|
a.filterBtn.Show()
|
||||||
a.container.Objects[0] = a.grid
|
a.container.Objects[0] = a.albumGrid
|
||||||
a.Refresh()
|
a.Refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,13 @@ func (g *GridViewPage) SearchWidget() fyne.Focusable {
|
|||||||
return g.searcher
|
return g.searcher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ Scrollable = (*GridViewPage)(nil)
|
||||||
|
|
||||||
|
func (g *GridViewPage) Scroll(scrollAmt float32) {
|
||||||
|
g.grid.ScrollToOffset(g.grid.GetScrollOffset() + scrollAmt)
|
||||||
|
g.grid.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GridViewPage) OnSearched(query string) {
|
func (g *GridViewPage) OnSearched(query string) {
|
||||||
if query == "" {
|
if query == "" {
|
||||||
if g.sortOrder != nil {
|
if g.sortOrder != nil {
|
||||||
|
|||||||
@@ -82,6 +82,15 @@ func newPlaylistsPage(contr *controller.Controller, pool *util.WidgetPool, cfg *
|
|||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ Scrollable = (*PlaylistsPage)(nil)
|
||||||
|
|
||||||
|
func (p *PlaylistsPage) Scroll(scrollAmt float32) {
|
||||||
|
if p.viewToggle.ActivatedButtonIndex() == 1 && p.gridView != nil {
|
||||||
|
p.gridView.ScrollToOffset(p.gridView.GetScrollOffset() + scrollAmt)
|
||||||
|
p.gridView.Refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (a *PlaylistsPage) load(searchOnLoad bool) {
|
func (a *PlaylistsPage) load(searchOnLoad bool) {
|
||||||
playlists, err := a.mp.GetPlaylists()
|
playlists, err := a.mp.GetPlaylists()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -323,6 +323,10 @@ func (m *MainWindow) addShortcuts() {
|
|||||||
|
|
||||||
m.Canvas().SetOnTypedKey(func(e *fyne.KeyEvent) {
|
m.Canvas().SetOnTypedKey(func(e *fyne.KeyEvent) {
|
||||||
switch e.Name {
|
switch e.Name {
|
||||||
|
case fyne.KeyUp:
|
||||||
|
m.BrowsingPane.ScrollUp()
|
||||||
|
case fyne.KeyDown:
|
||||||
|
m.BrowsingPane.ScrollDown()
|
||||||
case fyne.KeyEscape:
|
case fyne.KeyEscape:
|
||||||
m.Controller.CloseEscapablePopUp()
|
m.Controller.CloseEscapablePopUp()
|
||||||
case fyne.KeySpace:
|
case fyne.KeySpace:
|
||||||
|
|||||||
Reference in New Issue
Block a user