pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add toggle for number key commands

Pas 54e26c8a 1ae3ffc4

+53 -2
+3 -1
src/assets/locales/en.json
··· 308 308 "save": "Save", 309 309 "cancel": "Cancel", 310 310 "saveChanges": "Save Changes", 311 - "resetToDefault": "Reset to default" 311 + "resetToDefault": "Reset to default", 312 + "numberKeySeeking": "Number key progress seeking", 313 + "numberKeySeekingDescription": "Use number keys 0-9 to seek to specific positions in the video. 0 goes to the beginning, 1-8 jump to 10%-80%, and 9 goes to 90%." 312 314 } 313 315 }, 314 316 "home": {
+2
src/backend/accounts/settings.ts
··· 44 44 manualSourceSelection?: boolean; 45 45 enableDoubleClickToSeek?: boolean; 46 46 enableAutoResumeOnPlaybackError?: boolean; 47 + enableNumberKeySeeking?: boolean; 47 48 keyboardShortcuts?: KeyboardShortcuts; 48 49 customTheme?: CustomThemeSettings; 49 50 } ··· 82 83 manualSourceSelection?: boolean; 83 84 enableDoubleClickToSeek?: boolean; 84 85 enableAutoResumeOnPlaybackError?: boolean; 86 + enableNumberKeySeeking?: boolean; 85 87 keyboardShortcuts?: KeyboardShortcuts; 86 88 customTheme?: CustomThemeSettings; 87 89 }
+33 -1
src/components/overlays/KeyboardCommandsEditModal.tsx
··· 3 3 4 4 import { updateSettings } from "@/backend/accounts/settings"; 5 5 import { Button } from "@/components/buttons/Button"; 6 + import { Toggle } from "@/components/buttons/Toggle"; 6 7 import { Dropdown } from "@/components/form/Dropdown"; 7 8 import { Icon, Icons } from "@/components/Icon"; 8 9 import { Modal, ModalCard, useModal } from "@/components/overlays/Modal"; ··· 203 204 const setKeyboardShortcuts = usePreferencesStore( 204 205 (s) => s.setKeyboardShortcuts, 205 206 ); 207 + const enableNumberKeySeeking = usePreferencesStore( 208 + (s) => s.enableNumberKeySeeking, 209 + ); 210 + const setEnableNumberKeySeeking = usePreferencesStore( 211 + (s) => s.setEnableNumberKeySeeking, 212 + ); 206 213 207 214 const [editingShortcuts, setEditingShortcuts] = 208 215 useState<KeyboardShortcuts>(keyboardShortcuts); ··· 212 219 ); 213 220 const [editingKey, setEditingKey] = useState<string>(""); 214 221 const [isCapturingKey, setIsCapturingKey] = useState(false); 222 + const [editingEnableNumberKeySeeking, setEditingEnableNumberKeySeeking] = 223 + useState(enableNumberKeySeeking); 215 224 216 225 // Cancel any active editing when modal closes 217 226 useEffect(() => { ··· 220 229 setEditingModifier(""); 221 230 setEditingKey(""); 222 231 setIsCapturingKey(false); 232 + setEditingEnableNumberKeySeeking(enableNumberKeySeeking); 223 233 } 224 - }, [modal.isShown]); 234 + }, [modal.isShown, enableNumberKeySeeking]); 225 235 226 236 const shortcutGroups = getShortcutGroups(t, editingShortcuts).map( 227 237 (group) => ({ ··· 339 349 340 350 const handleSave = useCallback(async () => { 341 351 setKeyboardShortcuts(editingShortcuts); 352 + setEnableNumberKeySeeking(editingEnableNumberKeySeeking); 342 353 343 354 if (account && backendUrl) { 344 355 try { 345 356 await updateSettings(backendUrl, account, { 346 357 keyboardShortcuts: editingShortcuts, 358 + enableNumberKeySeeking: editingEnableNumberKeySeeking, 347 359 }); 348 360 } catch (error) { 349 361 console.error("Failed to save keyboard shortcuts:", error); ··· 353 365 hideModal(id); 354 366 }, [ 355 367 editingShortcuts, 368 + editingEnableNumberKeySeeking, 356 369 account, 357 370 backendUrl, 358 371 setKeyboardShortcuts, 372 + setEnableNumberKeySeeking, 359 373 hideModal, 360 374 id, 361 375 ]); ··· 508 522 </div> 509 523 </div> 510 524 ))} 525 + <div className="flex items-center justify-between py-3 border-t border-gray-700"> 526 + <div className="flex-1"> 527 + <p className="text-white font-medium"> 528 + {t("global.keyboardShortcuts.numberKeySeeking")} 529 + </p> 530 + <p className="text-type-secondary text-sm"> 531 + {t("global.keyboardShortcuts.numberKeySeekingDescription")} 532 + </p> 533 + </div> 534 + <Toggle 535 + enabled={editingEnableNumberKeySeeking} 536 + onClick={() => 537 + setEditingEnableNumberKeySeeking( 538 + !editingEnableNumberKeySeeking, 539 + ) 540 + } 541 + /> 542 + </div> 511 543 </div> 512 544 513 545 <div className="flex justify-end gap-3 pt-4 border-t border-gray-700">
+7
src/components/player/internals/KeyboardEvents.tsx
··· 67 67 const setEnableNativeSubtitles = usePreferencesStore( 68 68 (s) => s.setEnableNativeSubtitles, 69 69 ); 70 + const enableNumberKeySeeking = usePreferencesStore( 71 + (s) => s.enableNumberKeySeeking, 72 + ); 70 73 71 74 const [isRolling, setIsRolling] = useState(false); 72 75 const volumeDebounce = useRef<ReturnType<typeof setTimeout> | undefined>(); ··· 314 317 keyboardShortcuts, 315 318 enableNativeSubtitles, 316 319 setEnableNativeSubtitles, 320 + enableNumberKeySeeking, 317 321 }); 318 322 319 323 useEffect(() => { ··· 350 354 keyboardShortcuts, 351 355 enableNativeSubtitles, 352 356 setEnableNativeSubtitles, 357 + enableNumberKeySeeking, 353 358 }; 354 359 }, [ 355 360 setShowVolume, ··· 379 384 keyboardShortcuts, 380 385 enableNativeSubtitles, 381 386 setEnableNativeSubtitles, 387 + enableNumberKeySeeking, 382 388 ]); 383 389 384 390 useEffect(() => { ··· 606 612 // Skip to percentage with number keys (0-9) - locked, always use number keys 607 613 // Number keys are reserved for progress skipping, so handle them before customizable shortcuts 608 614 if ( 615 + dataRef.current.enableNumberKeySeeking && 609 616 /^[0-9]$/.test(k) && 610 617 dataRef.current.duration > 0 && 611 618 !evt.ctrlKey &&
+8
src/stores/preferences/index.tsx
··· 38 38 manualSourceSelection: boolean; 39 39 enableDoubleClickToSeek: boolean; 40 40 enableAutoResumeOnPlaybackError: boolean; 41 + enableNumberKeySeeking: boolean; 41 42 keyboardShortcuts: KeyboardShortcuts; 42 43 43 44 setEnableThumbnails(v: boolean): void; ··· 70 71 setManualSourceSelection(v: boolean): void; 71 72 setEnableDoubleClickToSeek(v: boolean): void; 72 73 setEnableAutoResumeOnPlaybackError(v: boolean): void; 74 + setEnableNumberKeySeeking(v: boolean): void; 73 75 setKeyboardShortcuts(v: KeyboardShortcuts): void; 74 76 } 75 77 ··· 106 108 manualSourceSelection: false, 107 109 enableDoubleClickToSeek: false, 108 110 enableAutoResumeOnPlaybackError: true, 111 + enableNumberKeySeeking: true, 109 112 keyboardShortcuts: DEFAULT_KEYBOARD_SHORTCUTS, 110 113 setEnableThumbnails(v) { 111 114 set((s) => { ··· 260 263 setEnableAutoResumeOnPlaybackError(v) { 261 264 set((s) => { 262 265 s.enableAutoResumeOnPlaybackError = v; 266 + }); 267 + }, 268 + setEnableNumberKeySeeking(v) { 269 + set((s) => { 270 + s.enableNumberKeySeeking = v; 263 271 }); 264 272 }, 265 273 setKeyboardShortcuts(v) {