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} skipDupChapters={settings.skipDupChapters}
fitPageToWindow={settings.fitPageToWindow} fitPageToWindow={settings.fitPageToWindow}
readerType={settings.readerType} readerType={settings.readerType}
offsetFirstPage={settings.offsetFirstPage}
/> />
</Collapse> </Collapse>
<Divider sx={{ my: 1, mx: 2 }} /> <Divider sx={{ my: 1, mx: 2 }} />

View File

@@ -25,6 +25,7 @@ export default function ReaderSettingsOptions({
skipDupChapters, skipDupChapters,
setSettingValue, setSettingValue,
fitPageToWindow, fitPageToWindow,
offsetFirstPage,
}: IProps) { }: IProps) {
const { t } = useTranslation(); const { t } = useTranslation();
const fitPageToWindowEligible = [ const fitPageToWindowEligible = [
@@ -88,6 +89,18 @@ export default function ReaderSettingsOptions({
</ListItemSecondaryAction> </ListItemSecondaryAction>
</ListItem> </ListItem>
) : null} ) : 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> <ListItem>
<ListItemText primary={t('reader.settings.label.reader_type')} /> <ListItemText primary={t('reader.settings.label.reader_type')} />
<Select <Select

View File

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

View File

@@ -362,7 +362,8 @@
"show_page_number": "Show page number", "show_page_number": "Show page number",
"skip_dup_chapters": "Skip duplicate chapters", "skip_dup_chapters": "Skip duplicate chapters",
"static_navigation": "Static navigation", "static_navigation": "Static navigation",
"fit_page_to_window": "Fit page to window" "fit_page_to_window": "Fit page to window",
"offset_first_page": "Offset first page"
}, },
"reader_type": { "reader_type": {
"label": { "label": {
@@ -470,4 +471,4 @@
}, },
"title": "Updates" "title": "Updates"
} }
} }

View File

@@ -65,6 +65,7 @@ export default function DefaultReaderSettings() {
skipDupChapters={settings.skipDupChapters} skipDupChapters={settings.skipDupChapters}
fitPageToWindow={settings.fitPageToWindow} fitPageToWindow={settings.fitPageToWindow}
readerType={settings.readerType} readerType={settings.readerType}
offsetFirstPage={settings.offsetFirstPage}
/> />
); );
} }

View File

@@ -223,6 +223,7 @@ export interface IReaderSettings {
skipDupChapters: boolean; skipDupChapters: boolean;
fitPageToWindow: boolean; fitPageToWindow: boolean;
readerType: ReaderType; readerType: ReaderType;
offsetFirstPage: boolean;
} }
export enum ChapterOffset { export enum ChapterOffset {

View File

@@ -21,6 +21,7 @@ export const getDefaultSettings = (): IReaderSettings => ({
skipDupChapters: true, skipDupChapters: true,
fitPageToWindow: false, fitPageToWindow: false,
readerType: 'ContinuesVertical', readerType: 'ContinuesVertical',
offsetFirstPage: false,
}); });
const getReaderSettingsWithDefaultValueFallback = <DefaultSettings extends IReaderSettings | UndefinedReaderSettings>( const getReaderSettingsWithDefaultValueFallback = <DefaultSettings extends IReaderSettings | UndefinedReaderSettings>(
@@ -74,6 +75,7 @@ export const checkAndHandleMissingStoredReaderSettings = async (
skipDupChapters: undefined, skipDupChapters: undefined,
fitPageToWindow: undefined, fitPageToWindow: undefined,
readerType: undefined, readerType: undefined,
offsetFirstPage: undefined,
}, },
false, false,
); );