Add option to offset first page in double page reader (#418)

* added toggle for doublespreads

* changing pages works as intended

* undid package.json changes

* deleted packege lock json

* curPage changes when changing invertDoublePage

* changed yarn.lock

* it switches better now

* fixed formatting

* changed it to offset first page

* fixed flipping when switching

* offset first page hides when double page is not enabled

* removed uncreachable line
This commit is contained in:
Robert Perez
2023-09-27 18:36:47 -04:00
committed by GitHub
parent 9daf71d85c
commit 3155c1d602
7 changed files with 36 additions and 7 deletions

View File

@@ -267,6 +267,7 @@ export default function ReaderNavBar(props: IProps) {
skipDupChapters={settings.skipDupChapters}
fitPageToWindow={settings.fitPageToWindow}
readerType={settings.readerType}
offsetFirstPage={settings.offsetFirstPage}
/>
</Collapse>
<Divider sx={{ my: 1, mx: 2 }} />

View File

@@ -25,6 +25,7 @@ export default function ReaderSettingsOptions({
skipDupChapters,
setSettingValue,
fitPageToWindow,
offsetFirstPage,
}: IProps) {
const { t } = useTranslation();
const fitPageToWindowEligible = [
@@ -88,6 +89,18 @@ export default function ReaderSettingsOptions({
</ListItemSecondaryAction>
</ListItem>
) : null}
{readerType === 'DoubleLTR' || readerType === 'DoubleRTL' ? (
<ListItem>
<ListItemText primary={t('reader.settings.label.offset_first_page')} />
<ListItemSecondaryAction>
<Switch
edge="end"
checked={offsetFirstPage}
onChange={(e) => setSettingValue('offsetFirstPage', e.target.checked)}
/>
</ListItemSecondaryAction>
</ListItem>
) : null}
<ListItem>
<ListItemText primary={t('reader.settings.label.reader_type')} />
<Select

View File

@@ -18,15 +18,15 @@ const isSpreadPage = (image: HTMLImageElement): boolean => {
return aspectRatio < 1;
};
const isSinglePage = (index: number, spreadPages: boolean[]): boolean => {
const isSinglePage = (index: number, spreadPages: boolean[], offsetFirstPage: boolean): boolean => {
// Page is single if it is spread page
if (spreadPages[index]) return true;
if (spreadPages[index] || spreadPages[index + 1]) return true;
// Page is single if it is last page
if (index === spreadPages.length - 1) return true;
// Page is single if number of single pages since last spread is odd
const previousSpreadIndex = spreadPages.lastIndexOf(true, index - 1);
const numberOfNonSpreads = index - (previousSpreadIndex + 1);
return numberOfNonSpreads % 2 === 0;
return offsetFirstPage ? numberOfNonSpreads % 2 === 0 : numberOfNonSpreads % 2 === 1;
};
export default function DoublePagedPager(props: IReaderProps) {
@@ -49,7 +49,7 @@ export default function DoublePagedPager(props: IReaderProps) {
}
if (curPage + 1 < pages.length && pagesRef.current[curPage + 1]) {
if (pageLoaded.current[curPage + 1]) {
if (spreadPage.current[curPage + 1]) return;
if (isSinglePage(curPage, spreadPage.current, settings.offsetFirstPage)) return;
pagesDisplayed.current = 2;
}
}
@@ -84,7 +84,7 @@ export default function DoublePagedPager(props: IReaderProps) {
function pagesToGoBack() {
// If previous page is single page, go only one page pack
if (isSinglePage(curPage - 1, spreadPage.current)) {
if (isSinglePage(curPage - 2, spreadPage.current, settings.offsetFirstPage)) {
return 1;
}
@@ -186,6 +186,16 @@ export default function DoublePagedPager(props: IReaderProps) {
setCurPage(initialPage);
}, [initialPage]);
useEffect(() => {
if (settings.offsetFirstPage) {
if (pagesDisplayed.current === 2) {
setCurPage(curPage + 1);
}
} else if (curPage > 0 && !isSinglePage(curPage - 1, spreadPage.current, settings.offsetFirstPage)) {
setCurPage(curPage - 1);
}
}, [settings.offsetFirstPage]);
return (
<Box ref={selfRef}>
<Box id="preload" sx={{ display: 'none' }}>