1
0
Fork 0

Merge branch 'bzlibby-dark-mode'

This commit is contained in:
Sean Sube 2023-04-16 18:32:16 -05:00
commit 83b1b3916f
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
8 changed files with 100 additions and 42 deletions

View File

@ -1,9 +1,13 @@
import { doesExist } from '@apextoaster/js-utils';
import { mustExist } from '@apextoaster/js-utils';
import { TabContext, TabList, TabPanel } from '@mui/lab';
import { Box, Container, Divider, Tab } from '@mui/material';
import { Box, Container, Divider, PaletteMode, Tab, useMediaQuery, CssBaseline } from '@mui/material';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import * as React from 'react';
import { useContext, useMemo } from 'react';
import { useHash } from 'react-use/lib/useHash';
import { useStore } from 'zustand';
import { StateContext } from '../state.js';
import { ModelControl } from './control/ModelControl.js';
import { ImageHistory } from './ImageHistory.js';
import { Logo } from './Logo.js';
@ -13,12 +17,27 @@ import { Inpaint } from './tab/Inpaint.js';
import { Settings } from './tab/Settings.js';
import { Txt2Img } from './tab/Txt2Img.js';
import { Upscale } from './tab/Upscale.js';
import { getTab, TAB_LABELS } from './utils.js';
import { getTheme, getTab, TAB_LABELS } from './utils.js';
export function OnnxWeb() {
/* checks for system light/dark mode preference */
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
const state = useStore(mustExist(useContext(StateContext)));
const theme = useMemo(
() => createTheme({
palette: {
mode: getTheme(state.theme, prefersDarkMode) as PaletteMode
}
}),
[prefersDarkMode, state.theme],
);
const [hash, setHash] = useHash();
return (
<ThemeProvider theme={theme}>
<CssBaseline />
<Container>
<Box sx={{ my: 4 }}>
<Logo />
@ -26,6 +45,7 @@ export function OnnxWeb() {
<Box sx={{ mx: 4, my: 4 }}>
<ModelControl />
</Box>
<TabContext value={getTab(hash)}>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<TabList onChange={(_e, idx) => {
@ -33,7 +53,6 @@ export function OnnxWeb() {
}}>
{TAB_LABELS.map((name) => <Tab key={name} label={name} value={name} />)}
</TabList>
</Box>
<TabPanel value='txt2img'>
<Txt2Img />
</TabPanel>
@ -52,11 +71,14 @@ export function OnnxWeb() {
<TabPanel value='settings'>
<Settings />
</TabPanel>
</Box>
</TabContext>
<Divider variant='middle' />
<Box sx={{ mx: 4, my: 4 }}>
<ImageHistory />
</Box>
</Container>
</ThemeProvider>
);
}

View File

@ -1,6 +1,6 @@
import { doesExist, mustExist } from '@apextoaster/js-utils';
import { Refresh } from '@mui/icons-material';
import { Alert, Button, Stack, TextField } from '@mui/material';
import { Alert, Button, FormControlLabel, Stack, Switch, TextField, useMediaQuery } from '@mui/material';
import * as React from 'react';
import { useContext, useState } from 'react';
import { useTranslation } from 'react-i18next';
@ -8,6 +8,7 @@ import { useStore } from 'zustand';
import { getApiRoot } from '../../config.js';
import { ConfigContext, StateContext, STATE_KEY } from '../../state.js';
import { getTheme } from '../utils.js';
import { NumericField } from '../input/NumericField.js';
function removeBlobs(key: string, value: unknown): unknown {
@ -28,8 +29,10 @@ function removeBlobs(key: string, value: unknown): unknown {
}
export function Settings() {
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
const config = mustExist(useContext(ConfigContext));
const state = useStore(mustExist(useContext(StateContext)));
const theme = getTheme(state.theme, prefersDarkMode);
const [json, setJson] = useState(JSON.stringify(state, removeBlobs));
const [root, setRoot] = useState(getApiRoot(config));
@ -80,6 +83,17 @@ export function Settings() {
{t('setting.loadState')}
</Button>
</Stack>
<FormControlLabel control={
<Switch checked={theme === 'dark'}
onClick={() => {
if (theme === 'light') {
state.setTheme('dark');
} else {
state.setTheme('light');
}
}}
/>
} label={t('setting.darkMode')} />
<Stack direction='row' spacing={2}>
<Button onClick={() => state.resetTxt2Img()} color='warning'>{t('setting.reset.txt2img')}</Button>
<Button onClick={() => state.resetImg2Img()} color='warning'>{t('setting.reset.img2img')}</Button>

View File

@ -17,3 +17,13 @@ export function getTab(hash: string): string {
return TAB_LABELS[0];
}
export function getTheme(currentTheme: string, preferDark: boolean): string {
if (currentTheme === '') {
if (preferDark) {
return 'dark';
}
return 'light';
}
return currentTheme;
}

View File

@ -43,8 +43,10 @@ interface BrushSlice {
interface DefaultSlice {
defaults: TabState<BaseImgParams>;
theme: string;
setDefaults(param: Partial<BaseImgParams>): void;
setTheme(theme: string): void;
}
interface HistorySlice {
@ -490,6 +492,7 @@ export function createStateSlices(server: ServerParams) {
defaults: {
...base,
},
theme: '',
setDefaults(params) {
set((prev) => ({
defaults: {
@ -498,6 +501,11 @@ export function createStateSlices(server: ServerParams) {
}
}));
},
setTheme(theme) {
set((prev) => ({
theme,
}));
}
});
const createModelSlice: Slice<ModelSlice> = (set) => ({

View File

@ -164,6 +164,7 @@ export const I18N_STRINGS_DE = {
scheduler: 'Standardplaner',
server: 'API-Server',
state: 'Kundenstatus',
darkMode: 'Dunkelmodus',
},
sourceFilter: {
none: '',

View File

@ -226,6 +226,7 @@ export const I18N_STRINGS_EN = {
scheduler: 'Default Scheduler',
server: 'API Server',
state: 'Client State',
darkMode: 'Dark Mode',
},
scheduler: {
'ddim': 'DDIM',

View File

@ -164,6 +164,7 @@ export const I18N_STRINGS_ES = {
scheduler: 'Programador predeterminado',
server: 'Servidor API',
state: 'Estado del cliente',
darkMode: 'Modo Oscuro',
},
sourceFilter: {
none: '',

View File

@ -164,6 +164,7 @@ export const I18N_STRINGS_FR = {
scheduler: '',
server: '',
state: '',
darkMode: 'Mode Sombre',
},
sourceFilter: {
none: '',