diff --git a/src/renderer/modals/session-help.test.ts b/src/renderer/modals/session-help.test.ts new file mode 100644 index 00000000..4b3ead0f --- /dev/null +++ b/src/renderer/modals/session-help.test.ts @@ -0,0 +1,29 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { SPECIAL_COMMANDS } from '../../config/definitions'; +import { + describeSessionHelpCommand, + formatSessionHelpKeybinding, +} from './session-help.js'; + +test('session help describes sub-seek commands as subtitle-line navigation', () => { + assert.equal(describeSessionHelpCommand(['sub-seek', 1]), 'Jump to next subtitle'); + assert.equal(describeSessionHelpCommand(['sub-seek', -1]), 'Jump to previous subtitle'); +}); + +test('session help describes subtitle-delay shift special commands separately from sub-seek', () => { + assert.equal( + describeSessionHelpCommand([SPECIAL_COMMANDS.SHIFT_SUB_DELAY_TO_NEXT_SUBTITLE_START]), + 'Shift subtitle delay to next cue', + ); + assert.equal( + describeSessionHelpCommand([SPECIAL_COMMANDS.SHIFT_SUB_DELAY_TO_PREVIOUS_SUBTITLE_START]), + 'Shift subtitle delay to previous cue', + ); +}); + +test('session help formats bracket keybindings as physical keys', () => { + assert.equal(formatSessionHelpKeybinding('Shift+BracketRight'), 'Shift + ]'); + assert.equal(formatSessionHelpKeybinding('Shift+BracketLeft'), 'Shift + ['); +}); diff --git a/src/renderer/modals/session-help.ts b/src/renderer/modals/session-help.ts index 70b33166..321bad7f 100644 --- a/src/renderer/modals/session-help.ts +++ b/src/renderer/modals/session-help.ts @@ -44,6 +44,8 @@ const KEY_NAME_MAP: Record = { Escape: 'Esc', Tab: 'Tab', Enter: 'Enter', + BracketLeft: '[', + BracketRight: ']', CommandOrControl: 'Cmd/Ctrl', Ctrl: 'Ctrl', Control: 'Ctrl', @@ -132,7 +134,9 @@ function describeCommand(command: (string | number)[]): string { return `Seek ${command[1] > 0 ? '+' : ''}${command[1]} second(s)`; } if (first === 'sub-seek' && typeof command[1] === 'number') { - return `Shift subtitle by ${command[1]} ms`; + if (command[1] > 0) return 'Jump to next subtitle'; + if (command[1] < 0) return 'Jump to previous subtitle'; + return 'Reload current subtitle timing'; } if (first === SPECIAL_COMMANDS.SUBSYNC_TRIGGER) return 'Open subtitle sync controls'; if (first === SPECIAL_COMMANDS.RUNTIME_OPTIONS_OPEN) return 'Open runtime options'; @@ -140,6 +144,12 @@ function describeCommand(command: (string | number)[]): string { if (first === SPECIAL_COMMANDS.PLAYLIST_BROWSER_OPEN) return 'Open playlist browser'; if (first === SPECIAL_COMMANDS.REPLAY_SUBTITLE) return 'Replay current subtitle'; if (first === SPECIAL_COMMANDS.PLAY_NEXT_SUBTITLE) return 'Play next subtitle'; + if (first === SPECIAL_COMMANDS.SHIFT_SUB_DELAY_TO_NEXT_SUBTITLE_START) { + return 'Shift subtitle delay to next cue'; + } + if (first === SPECIAL_COMMANDS.SHIFT_SUB_DELAY_TO_PREVIOUS_SUBTITLE_START) { + return 'Shift subtitle delay to previous cue'; + } if (first.startsWith(SPECIAL_COMMANDS.RUNTIME_OPTION_CYCLE_PREFIX)) { const [, rawId, rawDirection] = first.split(':'); return `Cycle runtime option ${rawId || 'option'} ${rawDirection === 'prev' ? 'previous' : 'next'}`; @@ -148,6 +158,11 @@ function describeCommand(command: (string | number)[]): string { return `MPV command: ${command.map((entry) => String(entry)).join(' ')}`; } +export { + describeCommand as describeSessionHelpCommand, + formatKeybinding as formatSessionHelpKeybinding, +}; + function sectionForCommand(command: (string | number)[]): string { const first = command[0]; if (typeof first !== 'string') return 'Other shortcuts';