From 74939c64179800dc8d3f63162c34eeff8cd4124b Mon Sep 17 00:00:00 2001 From: Norman Date: Wed, 13 May 2026 17:08:05 -0700 Subject: [PATCH] Adding a hotkey to jump to the currently playing song (only works without pagination) (#2024) --- src/i18n/locales/en.json | 1 + .../components/item-list/helpers/use-list-hotkeys.ts | 8 ++++++++ .../item-list/item-table-list/item-table-list.tsx | 12 ++++++++++++ .../components/hotkeys/hotkey-manager-settings.tsx | 1 + src/renderer/store/settings.store.ts | 3 +++ 5 files changed, 25 insertions(+) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 33549a53c..e84ce3942 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -877,6 +877,7 @@ "hotkey_listPlayLast": "List play last", "hotkey_listPlayNext": "List play next", "hotkey_listPlayNow": "List play now", + "hotkey_listShowPlayingSong": "Show playing song in list", "hotkey_navigateHome": "Navigate to home", "hotkey_playbackNext": "Next track", "hotkey_playbackPause": "Pause", diff --git a/src/renderer/components/item-list/helpers/use-list-hotkeys.ts b/src/renderer/components/item-list/helpers/use-list-hotkeys.ts index a2b479d44..d9e60cbc9 100644 --- a/src/renderer/components/item-list/helpers/use-list-hotkeys.ts +++ b/src/renderer/components/item-list/helpers/use-list-hotkeys.ts @@ -16,11 +16,13 @@ export const useListHotkeys = ({ focused, internalState, itemType, + onShowPlayingSong, }: { controls: ItemControls; focused: boolean; internalState: ItemListStateActions; itemType: LibraryItem; + onShowPlayingSong?: () => void; }) => { const { bindings } = useHotkeySettings(); const playButtonBehavior = usePlayButtonBehavior(); @@ -119,5 +121,11 @@ export const useListHotkeys = ({ } }, ], + [ + bindings.listShowPlayingSong.hotkey, + () => { + onShowPlayingSong?.(); + }, + ], ]); }; diff --git a/src/renderer/components/item-list/item-table-list/item-table-list.tsx b/src/renderer/components/item-list/item-table-list/item-table-list.tsx index c70e25325..fcb29d5b7 100644 --- a/src/renderer/components/item-list/item-table-list/item-table-list.tsx +++ b/src/renderer/components/item-list/item-table-list/item-table-list.tsx @@ -66,6 +66,7 @@ import { ItemTableListColumnConfig, } from '/@/renderer/components/item-list/types'; import { PlayerContext, usePlayer } from '/@/renderer/features/player/context/player-context'; +import { usePlayerStore } from '/@/renderer/store'; import { animationProps } from '/@/shared/components/animations/animation-props'; import { useFocusWithin } from '/@/shared/hooks/use-focus-within'; import { useMergedRef } from '/@/shared/hooks/use-merged-ref'; @@ -1596,11 +1597,22 @@ const BaseItemTableList = ({ ], ); + const onShowPlayingSong = useCallback(() => { + const targetId = usePlayerStore.getState().getCurrentSong()?.id; + if (!targetId) return; + const index = + getItemIndex?.(targetId) ?? + data.findIndex((item) => (item as null | { id?: string })?.id === targetId); + if (index === undefined || index < 0) return; + handleRef.current?.scrollToIndex(index, { align: 'center', behavior: 'auto' }); + }, [data, getItemIndex]); + useListHotkeys({ controls, focused, internalState, itemType, + onShowPlayingSong, }); const tableConfigValue = useMemo( diff --git a/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx b/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx index 4765cd544..34736b0d4 100644 --- a/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx +++ b/src/renderer/features/settings/components/hotkeys/hotkey-manager-settings.tsx @@ -60,6 +60,7 @@ const BINDINGS_MAP: Record = { context: 'listPlayNext', }), listPlayNow: i18n.t('setting.hotkey', { context: 'listPlayNow' }), + listShowPlayingSong: i18n.t('setting.hotkey', { context: 'listShowPlayingSong' }), localSearch: i18n.t('setting.hotkey', { context: 'localSearch' }), navigateHome: i18n.t('setting.hotkey', { context: 'navigateHome', diff --git a/src/renderer/store/settings.store.ts b/src/renderer/store/settings.store.ts index 27bfb8a9b..76ca8eef7 100644 --- a/src/renderer/store/settings.store.ts +++ b/src/renderer/store/settings.store.ts @@ -160,6 +160,7 @@ const BindingActionsSchema = z.enum([ 'listPlayNext', 'listPlayLast', 'listNavigateToPage', + 'listShowPlayingSong', ]); const DiscordDisplayTypeSchema = z.enum(['artist', 'feishin', 'song']); @@ -763,6 +764,7 @@ export enum BindingActions { LIST_PLAY_LAST = 'listPlayLast', LIST_PLAY_NEXT = 'listPlayNext', LIST_PLAY_NOW = 'listPlayNow', + LIST_SHOW_PLAYING_SONG = 'listShowPlayingSong', LOCAL_SEARCH = 'localSearch', MUTE = 'volumeMute', NAVIGATE_HOME = 'navigateHome', @@ -1217,6 +1219,7 @@ const initialState: SettingsState = { listPlayLast: { allowGlobal: false, hotkey: '', isGlobal: false }, listPlayNext: { allowGlobal: false, hotkey: '', isGlobal: false }, listPlayNow: { allowGlobal: false, hotkey: '', isGlobal: false }, + listShowPlayingSong: { allowGlobal: false, hotkey: 'mod+l', isGlobal: false }, localSearch: { allowGlobal: false, hotkey: 'mod+f', isGlobal: false }, navigateHome: { allowGlobal: false, hotkey: '', isGlobal: false }, next: { allowGlobal: true, hotkey: '', isGlobal: false },