diff --git a/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts b/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts index 0269a76d..141fac82 100644 --- a/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts +++ b/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts @@ -53,6 +53,26 @@ const useBookShortcuts = ({ sideBarBookKey, bookKeys }: UseBookShortcutsProps) = viewPagination(getView(sideBarBookKey), viewSettings, 'right'); }; + const goPrevSection = () => { + const viewSettings = getViewSettings(sideBarBookKey ?? ''); + viewPagination(getView(sideBarBookKey), viewSettings, 'up', 'section'); + }; + + const goNextSection = () => { + const viewSettings = getViewSettings(sideBarBookKey ?? ''); + viewPagination(getView(sideBarBookKey), viewSettings, 'down', 'section'); + }; + + const goLeftSection = () => { + const viewSettings = getViewSettings(sideBarBookKey ?? ''); + viewPagination(getView(sideBarBookKey), viewSettings, 'left', 'section'); + }; + + const goRightSection = () => { + const viewSettings = getViewSettings(sideBarBookKey ?? ''); + viewPagination(getView(sideBarBookKey), viewSettings, 'right', 'section'); + }; + const goPrev = () => { getView(sideBarBookKey)?.prev(distance); }; @@ -176,6 +196,10 @@ const useBookShortcuts = ({ sideBarBookKey, bookKeys }: UseBookShortcutsProps) = onGoNext: goNext, onGoHalfPageDown: goHalfPageDown, onGoHalfPageUp: goHalfPageUp, + onGoPrevSection: goPrevSection, + onGoNextSection: goNextSection, + onGoLeftSection: goLeftSection, + onGoRightSection: goRightSection, onGoBack: goBack, onGoForward: goForward, onZoomIn: zoomIn, diff --git a/apps/readest-app/src/app/reader/hooks/usePagination.ts b/apps/readest-app/src/app/reader/hooks/usePagination.ts index 01d1015a..390ddb65 100644 --- a/apps/readest-app/src/app/reader/hooks/usePagination.ts +++ b/apps/readest-app/src/app/reader/hooks/usePagination.ts @@ -12,6 +12,7 @@ import { tauriGetWindowLogicalPosition } from '@/utils/window'; export type ScrollSource = 'touch' | 'mouse'; type PaginationSide = 'left' | 'right' | 'up' | 'down'; +type PaginationMode = 'page' | 'section'; const swapLeftRight = (side: PaginationSide) => { if (side === 'left') return 'right'; @@ -23,6 +24,7 @@ export const viewPagination = ( view: FoliateView | null, viewSettings: ViewSettings | null | undefined, side: PaginationSide, + mode: PaginationMode = 'page', ) => { if (!view || !viewSettings) return; const renderer = view.renderer; @@ -35,9 +37,27 @@ export const viewPagination = ( const showFooter = viewSettings.showFooter && viewSettings.showBarsOnScroll; const scrollingOverlap = viewSettings.scrollingOverlap; const distance = size - scrollingOverlap - (showHeader ? 44 : 0) - (showFooter ? 44 : 0); - return side === 'left' || side === 'up' ? view.prev(distance) : view.next(distance); + switch (mode) { + case 'page': + return side === 'left' || side === 'up' ? view.prev(distance) : view.next(distance); + case 'section': + if (side === 'left' || side === 'up') { + return view.renderer.prevSection?.(); + } else { + return view.renderer.nextSection?.(); + } + } } else { - return side === 'left' || side === 'up' ? view.prev() : view.next(); + switch (mode) { + case 'page': + return side === 'left' || side === 'up' ? view.prev() : view.next(); + case 'section': + if (side === 'left' || side === 'up') { + return view.renderer.prevSection?.(); + } else { + return view.renderer.nextSection?.(); + } + } } }; diff --git a/apps/readest-app/src/helpers/shortcuts.ts b/apps/readest-app/src/helpers/shortcuts.ts index e897a96c..35305b45 100644 --- a/apps/readest-app/src/helpers/shortcuts.ts +++ b/apps/readest-app/src/helpers/shortcuts.ts @@ -17,6 +17,10 @@ const DEFAULT_SHORTCUTS = { onGoRight: ['ArrowRight', 'PageDown', 'l', ' '], onGoNext: ['ArrowDown', 'j'], onGoPrev: ['ArrowUp', 'k'], + onGoLeftSection: ['opt+ArrowLeft', 'alt+ArrowLeft'], + onGoRightSection: ['opt+ArrowRight', 'alt+ArrowRight'], + onGoPrevSection: ['opt+ArrowUp', 'alt+ArrowUp'], + onGoNextSection: ['opt+ArrowDown', 'alt+ArrowDown'], onGoHalfPageDown: ['shift+ArrowDown', 'd'], onGoHalfPageUp: ['shift+ArrowUp', 'u'], onGoBack: ['shift+ArrowLeft', 'shift+h', 'alt+ArrowLeft'],