diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index b72d963..d5c9a92 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -132,6 +132,12 @@ func (a *AlbumsPage) Route() Route { return AlbumsRoute(backend.AlbumSortOrder(a.sortOrder.Selected)) } +var _ Searchable = (*AlbumsPage)(nil) + +func (a *AlbumsPage) SearchWidget() fyne.Focusable { + return a.searcher.Entry +} + func (a *AlbumsPage) SetPlayAlbumCallback(cb func(string, int)) { a.OnPlayAlbum = cb } diff --git a/ui/browsing/browsingpane.go b/ui/browsing/browsingpane.go index 8e9e322..c385f1b 100644 --- a/ui/browsing/browsingpane.go +++ b/ui/browsing/browsingpane.go @@ -26,6 +26,11 @@ type SavedPage interface { Restore() Page } +// Searchable pages should implement this interface so their search bar can be focused by keyboard shortcut. +type Searchable interface { + SearchWidget() fyne.Focusable +} + type CanPlayAlbum interface { SetPlayAlbumCallback(func(albumID string, startingTrack int)) } @@ -81,6 +86,13 @@ func (b *BrowsingPane) AddNavigationButton(iconRes fyne.Resource, action func()) b.navBtnsContainer.Add(widget.NewButtonWithIcon("", iconRes, action)) } +func (b *BrowsingPane) GetSearchBarIfAny() fyne.Focusable { + if s, ok := b.curPage.(Searchable); ok { + return s.SearchWidget() + } + return nil +} + func (b *BrowsingPane) doSetPage(p Page) bool { if b.curPage != nil && b.curPage.Route() == p.Route() { return false diff --git a/ui/browsing/genrepage.go b/ui/browsing/genrepage.go index fa179af..38e019d 100644 --- a/ui/browsing/genrepage.go +++ b/ui/browsing/genrepage.go @@ -119,6 +119,12 @@ func (g *GenrePage) Save() SavedPage { } } +var _ Searchable = (*AlbumsPage)(nil) + +func (g *GenrePage) SearchWidget() fyne.Focusable { + return g.searcher.Entry +} + func (a *GenrePage) onPlayAlbum(albumID string) { if a.OnPlayAlbum != nil { a.OnPlayAlbum(albumID, 0) diff --git a/ui/keymodifiers_darwin.go b/ui/keymodifiers_darwin.go new file mode 100644 index 0000000..a6b20a1 --- /dev/null +++ b/ui/keymodifiers_darwin.go @@ -0,0 +1,10 @@ +//go:build darwin + +package ui + +import "fyne.io/fyne/v2" + +var ( + ControlModifier = fyne.KeyModifierSuper + AltModifier = fyne.KeyModifierSuper +) diff --git a/ui/keymodifiers_default.go b/ui/keymodifiers_default.go new file mode 100644 index 0000000..24b75e2 --- /dev/null +++ b/ui/keymodifiers_default.go @@ -0,0 +1,10 @@ +//go:build !darwin + +package ui + +import "fyne.io/fyne/v2" + +var ( + ControlModifier = fyne.KeyModifierControl + AltModifier = fyne.KeyModifierAlt +) diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 69f7acf..212d6d9 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -1,7 +1,6 @@ package ui import ( - "runtime" "supersonic/backend" "supersonic/res" "supersonic/ui/browsing" @@ -15,10 +14,9 @@ import ( ) var ( - ShortcutBack = desktop.CustomShortcut{KeyName: fyne.KeyLeft, Modifier: fyne.KeyModifierAlt} - ShortcutBackDarwin = desktop.CustomShortcut{KeyName: fyne.KeyLeft, Modifier: fyne.KeyModifierSuper} - ShortcutForward = desktop.CustomShortcut{KeyName: fyne.KeyRight, Modifier: fyne.KeyModifierAlt} - ShortcutForwardDarwin = desktop.CustomShortcut{KeyName: fyne.KeyRight, Modifier: fyne.KeyModifierSuper} + ShortcutBack = desktop.CustomShortcut{KeyName: fyne.KeyLeft, Modifier: AltModifier} + ShortcutForward = desktop.CustomShortcut{KeyName: fyne.KeyRight, Modifier: AltModifier} + ShortcutSearch = desktop.CustomShortcut{KeyName: fyne.KeyF, Modifier: ControlModifier} ) type MainWindow struct { @@ -88,18 +86,17 @@ func (m *MainWindow) addNavigationButtons() { } func (m *MainWindow) addShortcuts() { - back := &ShortcutBack - fwd := &ShortcutForward - if runtime.GOOS == "darwin" { - back = &ShortcutBackDarwin - fwd = &ShortcutForwardDarwin - } - m.Canvas().AddShortcut(back, func(_ fyne.Shortcut) { + m.Canvas().AddShortcut(&ShortcutBack, func(_ fyne.Shortcut) { m.BrowsingPane.GoBack() }) - m.Canvas().AddShortcut(fwd, func(_ fyne.Shortcut) { + m.Canvas().AddShortcut(&ShortcutForward, func(_ fyne.Shortcut) { m.BrowsingPane.GoForward() }) + m.Canvas().AddShortcut(&ShortcutSearch, func(_ fyne.Shortcut) { + if s := m.BrowsingPane.GetSearchBarIfAny(); s != nil { + m.Window.Canvas().Focus(s) + } + }) m.Canvas().SetOnTypedKey(func(e *fyne.KeyEvent) { if e.Name == fyne.KeySpace {