From 8b67c2d6a931fbaab5439da9c951e5088721dd8b Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 11 Dec 2024 20:48:05 +0100 Subject: [PATCH] Add "cycle profiles" hotkey --- public/locales/en.json | 1 + .../reader/components/ReaderHotkeys.tsx | 70 ++++++++++++++----- .../settings/hotkeys/ReaderSettingHotkey.tsx | 1 + .../constants/ReaderSettings.constants.tsx | 1 + src/modules/reader/types/Reader.types.ts | 1 + 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/public/locales/en.json b/public/locales/en.json index 92af5a37..f64e07cf 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -851,6 +851,7 @@ "offset_spread_pages": "Toggle offset spread pages", "previous_chapter": "Previous chapter", "previous_page": "Previous page", + "profiles": "Cycle profiles", "scale_type": "Cycle image scale type", "scroll_backward": "Scroll backward", "scroll_forward": "Scroll forward", diff --git a/src/modules/reader/components/ReaderHotkeys.tsx b/src/modules/reader/components/ReaderHotkeys.tsx index 1422fda9..ee29cc0f 100644 --- a/src/modules/reader/components/ReaderHotkeys.tsx +++ b/src/modules/reader/components/ReaderHotkeys.tsx @@ -11,7 +11,7 @@ import { useEffect } from 'react'; import { useTheme } from '@mui/material/styles'; import { HOTKEY_SCOPES } from '@/modules/hotkeys/Hotkeys.constants.ts'; import { ReaderService } from '@/modules/reader/services/ReaderService.ts'; -import { ReaderHotkey, ReadingMode } from '@/modules/reader/types/Reader.types.ts'; +import { IReaderSettings, ReaderHotkey, ReadingMode } from '@/modules/reader/types/Reader.types.ts'; import { useReaderOverlayContext } from '@/modules/reader/contexts/ReaderOverlayContext.tsx'; import { getNextRotationValue } from '@/modules/core/utils/ValueRotationButton.utils.ts'; import { @@ -30,6 +30,31 @@ const useHotkeys = (...args: Parameters): ReturnType( + updateSetting: ReturnType, + deleteSetting: ReturnType, + setting: Setting, + value: IReaderSettings[Setting], + values: IReaderSettings[Setting][], + isDefault: boolean, + isDefaultable: boolean, +) => { + if (isDefault) { + updateSetting(setting, values[0]); + return; + } + + const nextValue = getNextRotationValue(values.indexOf(value), values, isDefaultable); + + const isDefaultNextValue = nextValue === undefined; + if (isDefaultNextValue) { + deleteSetting(setting); + return; + } + + updateSetting(setting, nextValue); +}; + const DEFAULT_MANGA: MangaIdInfo = { id: -1 }; const CONTINUOUS_READING_MODE_TO_SCROLL_DIRECTION: Record = { @@ -49,8 +74,16 @@ export const ReaderHotkeys = ({ const { enableScope, disableScope } = useHotkeysContext(); const { manga } = useReaderStateMangaContext(); const { isVisible, setIsVisible } = useReaderOverlayContext(); - const { hotkeys, pageScaleMode, shouldStretchPage, shouldOffsetDoubleSpreads, readingMode, readingDirection } = - ReaderService.useSettings(); + const { + hotkeys, + pageScaleMode, + shouldStretchPage, + shouldOffsetDoubleSpreads, + readingMode, + readingDirection, + defaultProfile, + profiles, + } = ReaderService.useSettings(); const openChapter = ReaderControls.useOpenChapter(); const openPage = ReaderControls.useOpenPage(); @@ -108,23 +141,15 @@ export const ReaderHotkeys = ({ useHotkeys( hotkeys[ReaderHotkey.CYCLE_SCALE_TYPE], () => { - if (pageScaleMode.isDefault) { - updateSetting('pageScaleMode', READER_PAGE_SCALE_MODE_VALUES[0]); - return; - } - - const nextValue = getNextRotationValue( - READER_PAGE_SCALE_MODE_VALUES.indexOf(pageScaleMode.value), + updateSettingCycleThrough( + updateSetting, + deleteSetting, + 'pageScaleMode', + pageScaleMode.value, READER_PAGE_SCALE_MODE_VALUES, + pageScaleMode.isDefault, true, ); - - if (nextValue === undefined) { - deleteSetting('pageScaleMode'); - return; - } - - updateSetting('pageScaleMode', nextValue); }, [updateSetting, deleteSetting, pageScaleMode], ); @@ -138,6 +163,17 @@ export const ReaderHotkeys = ({ () => updateSetting('shouldOffsetDoubleSpreads', !shouldOffsetDoubleSpreads.value), [updateSetting, shouldOffsetDoubleSpreads.value], ); + useHotkeys(hotkeys[ReaderHotkey.CYCLE_PROFILES], () => { + updateSettingCycleThrough( + updateSetting, + deleteSetting, + 'defaultProfile', + defaultProfile.value, + profiles, + defaultProfile.isDefault, + true, + ); + }); useEffect(() => { enableScope(HotkeyScope.READER); diff --git a/src/modules/reader/components/settings/hotkeys/ReaderSettingHotkey.tsx b/src/modules/reader/components/settings/hotkeys/ReaderSettingHotkey.tsx index 0b637e4d..012d49a2 100644 --- a/src/modules/reader/components/settings/hotkeys/ReaderSettingHotkey.tsx +++ b/src/modules/reader/components/settings/hotkeys/ReaderSettingHotkey.tsx @@ -31,6 +31,7 @@ const READER_HOTKEY_TO_TITLE: Record = { [ReaderHotkey.CYCLE_SCALE_TYPE]: 'reader.settings.hotkey.scale_type', [ReaderHotkey.STRETCH_IMAGE]: 'reader.settings.hotkey.stretch_image', [ReaderHotkey.OFFSET_SPREAD_PAGES]: 'reader.settings.hotkey.offset_spread_pages', + [ReaderHotkey.CYCLE_PROFILES]: 'reader.settings.hotkey.profiles', }; export const ReaderSettingHotkey = ({ diff --git a/src/modules/reader/constants/ReaderSettings.constants.tsx b/src/modules/reader/constants/ReaderSettings.constants.tsx index 042398d2..940c1a51 100644 --- a/src/modules/reader/constants/ReaderSettings.constants.tsx +++ b/src/modules/reader/constants/ReaderSettings.constants.tsx @@ -128,6 +128,7 @@ export const DEFAULT_READER_SETTINGS: IReaderSettings = { [ReaderHotkey.CYCLE_SCALE_TYPE]: ['i'], [ReaderHotkey.STRETCH_IMAGE]: ['f'], [ReaderHotkey.OFFSET_SPREAD_PAGES]: ['o'], + [ReaderHotkey.CYCLE_PROFILES]: ['p'], }, imagePreLoadAmount: 5, }; diff --git a/src/modules/reader/types/Reader.types.ts b/src/modules/reader/types/Reader.types.ts index 038efc9a..b1616775 100644 --- a/src/modules/reader/types/Reader.types.ts +++ b/src/modules/reader/types/Reader.types.ts @@ -206,6 +206,7 @@ export enum ReaderHotkey { CYCLE_SCALE_TYPE, STRETCH_IMAGE, OFFSET_SPREAD_PAGES, + CYCLE_PROFILES, } export interface ReaderPagerProps