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:
@@ -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 }} />
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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' }}>
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user