Make reader settings dialog transparent on some changes

- width change
- custom filter change
This commit is contained in:
schroda
2025-04-25 02:50:25 +02:00
parent 112c700fb7
commit 37127893b4
6 changed files with 118 additions and 95 deletions

View File

@@ -15,6 +15,7 @@ import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
import { ReaderSettingsTabs } from '@/modules/reader/components/settings/ReaderSettingsTabs.tsx'; import { ReaderSettingsTabs } from '@/modules/reader/components/settings/ReaderSettingsTabs.tsx';
import { ReaderSettingTab } from '@/modules/reader/constants/ReaderSettings.constants.tsx'; import { ReaderSettingTab } from '@/modules/reader/constants/ReaderSettings.constants.tsx';
import { useDisableAllHotkeysWhileMounted } from '@/modules/hotkeys/Hotkeys.utils.ts'; import { useDisableAllHotkeysWhileMounted } from '@/modules/hotkeys/Hotkeys.utils.ts';
import { applyStyles } from '@/modules/core/utils/ApplyStyles.ts';
export const ReaderSettings = ({ isOpen, close }: { isOpen: boolean; close: () => void }) => { export const ReaderSettings = ({ isOpen, close }: { isOpen: boolean; close: () => void }) => {
const { manga } = useReaderStateMangaContext(); const { manga } = useReaderStateMangaContext();
@@ -23,6 +24,7 @@ export const ReaderSettings = ({ isOpen, close }: { isOpen: boolean; close: () =
useDisableAllHotkeysWhileMounted(isOpen); useDisableAllHotkeysWhileMounted(isOpen);
const [activeTab, setActiveTab] = useState(0); const [activeTab, setActiveTab] = useState(0);
const [isTransparent, setIsTransparent] = useState(false);
if (!manga) { if (!manga) {
return null; return null;
@@ -39,6 +41,11 @@ export const ReaderSettings = ({ isOpen, close }: { isOpen: boolean; close: () =
fullWidth fullWidth
onClose={close} onClose={close}
hideBackdrop={activeTab === ReaderSettingTab.FILTER} hideBackdrop={activeTab === ReaderSettingTab.FILTER}
sx={{
...applyStyles(isTransparent, {
opacity: 0.75,
}),
}}
> >
<DialogContent sx={{ p: 0 }}> <DialogContent sx={{ p: 0 }}>
<ReaderSettingsTabs <ReaderSettingsTabs
@@ -47,6 +54,7 @@ export const ReaderSettings = ({ isOpen, close }: { isOpen: boolean; close: () =
settings={settings} settings={settings}
updateSetting={(...args) => ReaderService.updateSetting(manga, ...args)} updateSetting={(...args) => ReaderService.updateSetting(manga, ...args)}
deleteSetting={(...args) => ReaderService.deleteSetting(manga, ...args)} deleteSetting={(...args) => ReaderService.deleteSetting(manga, ...args)}
setTransparent={setIsTransparent}
/> />
</DialogContent> </DialogContent>
</Dialog> </Dialog>

View File

@@ -35,6 +35,7 @@ const BaseReaderSettingsTabs = ({
deleteSetting, deleteSetting,
setShowPreview, setShowPreview,
mode: overlayMode, mode: overlayMode,
setTransparent,
}: Pick<TReaderTapZoneContext, 'setShowPreview'> & }: Pick<TReaderTapZoneContext, 'setShowPreview'> &
Pick<ReturnType<typeof ReaderService.useOverlayMode>, 'mode'> & { Pick<ReturnType<typeof ReaderService.useOverlayMode>, 'mode'> & {
activeTab: number; activeTab: number;
@@ -43,6 +44,7 @@ const BaseReaderSettingsTabs = ({
updateSetting: (...args: OmitFirst<Parameters<typeof ReaderService.updateSetting>>) => void; updateSetting: (...args: OmitFirst<Parameters<typeof ReaderService.updateSetting>>) => void;
areDefaultSettings?: boolean; areDefaultSettings?: boolean;
deleteSetting: (setting: keyof IReaderSettings) => void; deleteSetting: (setting: keyof IReaderSettings) => void;
setTransparent?: (transparent: boolean) => void;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const isTouchDevice = MediaQuery.useIsTouchDevice(); const isTouchDevice = MediaQuery.useIsTouchDevice();
@@ -103,6 +105,7 @@ const BaseReaderSettingsTabs = ({
isDefaultable={!areDefaultSettings} isDefaultable={!areDefaultSettings}
onDefault={(...args) => deleteSetting?.(...args)} onDefault={(...args) => deleteSetting?.(...args)}
isSeriesMode isSeriesMode
setTransparent={setTransparent}
/> />
</TabPanel> </TabPanel>
); );
@@ -137,6 +140,7 @@ const BaseReaderSettingsTabs = ({
updateSetting={(...args) => updateSetting(...args)} updateSetting={(...args) => updateSetting(...args)}
isDefaultable isDefaultable
onDefault={(...args) => deleteSetting?.(...args)} onDefault={(...args) => deleteSetting?.(...args)}
setTransparent={setTransparent}
/> />
</TabPanel> </TabPanel>
); );

View File

@@ -22,13 +22,19 @@ export const ReaderFilterSettings = ({
settings: { customFilter }, settings: { customFilter },
updateSetting, updateSetting,
onDefault, onDefault,
}: ReaderSettingsTypeProps) => ( setTransparent,
}: ReaderSettingsTypeProps) => {
const update = (value: any, commit?: boolean) => {
updateSetting('customFilter', value, commit);
setTransparent?.(commit === undefined ? false : !commit);
};
return (
<Stack sx={{ gap: 2 }}> <Stack sx={{ gap: 2 }}>
<ReaderSettingBrightness <ReaderSettingBrightness
brightness={customFilter.brightness} brightness={customFilter.brightness}
updateSetting={(key, value, commit) => updateSetting={(key, value, commit) =>
updateSetting( update(
'customFilter',
{ {
...customFilter, ...customFilter,
[key]: value, [key]: value,
@@ -40,8 +46,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingContrast <ReaderSettingContrast
contrast={customFilter.contrast} contrast={customFilter.contrast}
updateSetting={(key, value, commit) => updateSetting={(key, value, commit) =>
updateSetting( update(
'customFilter',
{ {
...customFilter, ...customFilter,
[key]: value, [key]: value,
@@ -53,8 +58,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingSaturate <ReaderSettingSaturate
saturate={customFilter.saturate} saturate={customFilter.saturate}
updateSetting={(key, value, commit) => updateSetting={(key, value, commit) =>
updateSetting( update(
'customFilter',
{ {
...customFilter, ...customFilter,
[key]: value, [key]: value,
@@ -66,8 +70,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingHue <ReaderSettingHue
hue={customFilter.hue} hue={customFilter.hue}
updateSetting={(key, value, commit) => updateSetting={(key, value, commit) =>
updateSetting( update(
'customFilter',
{ {
...customFilter, ...customFilter,
[key]: value, [key]: value,
@@ -79,8 +82,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingRGBA <ReaderSettingRGBA
rgba={customFilter.rgba} rgba={customFilter.rgba}
updateSetting={(key, value, commit) => updateSetting={(key, value, commit) =>
updateSetting( update(
'customFilter',
{ {
...customFilter, ...customFilter,
[key]: value, [key]: value,
@@ -92,7 +94,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingSepia <ReaderSettingSepia
sepia={customFilter.sepia} sepia={customFilter.sepia}
updateSetting={(value) => updateSetting={(value) =>
updateSetting('customFilter', { update({
...customFilter, ...customFilter,
sepia: value, sepia: value,
}) })
@@ -101,7 +103,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingGrayscale <ReaderSettingGrayscale
grayscale={customFilter.grayscale} grayscale={customFilter.grayscale}
updateSetting={(value) => updateSetting={(value) =>
updateSetting('customFilter', { update({
...customFilter, ...customFilter,
grayscale: value, grayscale: value,
}) })
@@ -110,7 +112,7 @@ export const ReaderFilterSettings = ({
<ReaderSettingInvert <ReaderSettingInvert
invert={customFilter.invert} invert={customFilter.invert}
updateSetting={(value) => updateSetting={(value) =>
updateSetting('customFilter', { update({
...customFilter, ...customFilter,
invert: value, invert: value,
}) })
@@ -120,4 +122,5 @@ export const ReaderFilterSettings = ({
<ResetButton onClick={() => onDefault?.('customFilter')} variant="outlined" /> <ResetButton onClick={() => onDefault?.('customFilter')} variant="outlined" />
</Stack> </Stack>
</Stack> </Stack>
); );
};

View File

@@ -30,6 +30,7 @@ export const ReaderLayoutSettings = ({
isDefaultable, isDefaultable,
onDefault, onDefault,
isSeriesMode, isSeriesMode,
setTransparent,
}: ReaderSettingsTypeProps & { }: ReaderSettingsTypeProps & {
setShowPreview: TReaderTapZoneContext['setShowPreview']; setShowPreview: TReaderTapZoneContext['setShowPreview'];
isSeriesMode?: boolean; isSeriesMode?: boolean;
@@ -104,6 +105,7 @@ export const ReaderLayoutSettings = ({
isDefaultable={isDefaultable} isDefaultable={isDefaultable}
onDefault={() => onDefault?.('readerWidth')} onDefault={() => onDefault?.('readerWidth')}
updateSetting={(...args) => updateSetting(...args)} updateSetting={(...args) => updateSetting(...args)}
setTransparent={setTransparent}
/> />
{isSeriesMode && ( {isSeriesMode && (
<> <>
@@ -112,6 +114,7 @@ export const ReaderLayoutSettings = ({
profiles={[settings.readingMode.value]} profiles={[settings.readingMode.value]}
updateSetting={updateSetting} updateSetting={updateSetting}
isSeriesMode={isSeriesMode} isSeriesMode={isSeriesMode}
setTransparent={setTransparent}
/> />
</> </>
)} )}

View File

@@ -23,9 +23,11 @@ export const ReaderSettingWidth = ({
isDefaultable, isDefaultable,
onDefault, onDefault,
updateSetting, updateSetting,
setTransparent,
}: Pick<IReaderSettings, 'readerWidth' | 'pageScaleMode'> & }: Pick<IReaderSettings, 'readerWidth' | 'pageScaleMode'> &
Pick<MultiValueButtonDefaultableProps<IReaderSettings['readerWidth']['value']>, 'isDefaultable' | 'onDefault'> & { Pick<MultiValueButtonDefaultableProps<IReaderSettings['readerWidth']['value']>, 'isDefaultable' | 'onDefault'> & {
updateSetting: (...args: OmitFirst<Parameters<typeof ReaderService.updateSetting>>) => void; updateSetting: (...args: OmitFirst<Parameters<typeof ReaderService.updateSetting>>) => void;
setTransparent?: (transparent: boolean) => void;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -55,9 +57,11 @@ export const ReaderSettingWidth = ({
min: 10, min: 10,
max: 100, max: 100,
onChange: (_, value) => { onChange: (_, value) => {
setTransparent?.(true);
updateSetting('readerWidth', { ...readerWidth, value: value as number }, false); updateSetting('readerWidth', { ...readerWidth, value: value as number }, false);
}, },
onChangeCommitted: (_, value) => { onChangeCommitted: (_, value) => {
setTransparent?.(false);
updateSetting('readerWidth', { ...readerWidth, value: value as number }, true); updateSetting('readerWidth', { ...readerWidth, value: value as number }, true);
}, },
}, },

View File

@@ -233,6 +233,7 @@ interface ReaderSettingsTypeBaseProps {
export interface ReaderSettingsDefaultableProps { export interface ReaderSettingsDefaultableProps {
isDefaultable: boolean; isDefaultable: boolean;
onDefault: (setting: keyof IReaderSettings) => void; onDefault: (setting: keyof IReaderSettings) => void;
setTransparent?: (transparent: boolean) => void;
} }
interface ReaderSettingsTypeDefaultableProps extends ReaderSettingsTypeBaseProps, ReaderSettingsDefaultableProps { interface ReaderSettingsTypeDefaultableProps extends ReaderSettingsTypeBaseProps, ReaderSettingsDefaultableProps {