fix: pagination with volume keys now has right direction for RTL books, closes #1996 (#2004)

This commit is contained in:
Huang Xin
2025-09-09 11:36:45 +08:00
committed by GitHub
parent 0d8b877d73
commit 210eda0340
@@ -11,25 +11,33 @@ import { tauriGetWindowLogicalPosition } from '@/utils/window';
export type ScrollSource = 'touch' | 'mouse';
type PaginationSide = 'left' | 'right' | 'up' | 'down';
const swapLeftRight = (side: PaginationSide) => {
if (side === 'left') return 'right';
if (side === 'right') return 'left';
return side;
};
export const viewPagination = (
view: FoliateView | null,
viewSettings: ViewSettings | null | undefined,
side: 'left' | 'right',
side: PaginationSide,
) => {
if (!view || !viewSettings) return;
const renderer = view.renderer;
if (view.book.dir === 'rtl') {
side = swapLeftRight(side);
}
if (renderer.scrolled) {
if (view.book.dir === 'rtl') {
side = side === 'left' ? 'right' : 'left';
}
const { size } = renderer;
const showHeader = viewSettings.showHeader && viewSettings.showBarsOnScroll;
const showFooter = viewSettings.showFooter && viewSettings.showBarsOnScroll;
const scrollingOverlap = viewSettings.scrollingOverlap;
const distance = size - scrollingOverlap - (showHeader ? 44 : 0) - (showFooter ? 44 : 0);
return side === 'left' ? view.prev(distance) : view.next(distance);
return side === 'left' || side === 'up' ? view.prev(distance) : view.next(distance);
} else {
return side === 'left' ? view.goLeft() : view.goRight();
return side === 'left' || side === 'up' ? view.prev() : view.next();
}
};
@@ -129,9 +137,9 @@ export const usePagination = (
const { keyName } = msg.detail;
setHoveredBookKey('');
if (keyName === 'VolumeUp') {
viewPagination(viewRef.current, viewSettings, 'left');
viewPagination(viewRef.current, viewSettings, 'up');
} else if (keyName === 'VolumeDown') {
viewPagination(viewRef.current, viewSettings, 'right');
viewPagination(viewRef.current, viewSettings, 'down');
}
} else if (
msg.type === 'touch-swipe' &&