Skip to content

Commit 8fe8822

Browse files
author
Oskar Widmark
committed
refactor: move components out of SideDrawer
1 parent 5eda2f5 commit 8fe8822

File tree

7 files changed

+305
-279
lines changed

7 files changed

+305
-279
lines changed

src/App.tsx

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ import {
2727
} from './constants';
2828
import { SortAppBar } from './AppBar';
2929
import { CanvasController } from './canvas-controller';
30+
import { Colors } from './Colors';
31+
import { ColumnSlider } from './ColumnSlider';
32+
import { Options } from './Options';
33+
import { ResetPresetSelect } from './ResetPresetSelect';
34+
import { SortingAlgorithmSelect } from './SortingAlgorithmSelect';
35+
import { TimeSlider } from './TimeSlider';
3036

3137
type Props = {
3238
playSound: () => void;
@@ -431,28 +437,48 @@ class App extends React.Component<Props> {
431437
</div>
432438
<SideDrawer
433439
areSettingsOpen={this.state.areSettingsOpen}
434-
resetPreset={this.state.settings.resetPreset}
435-
chosenSortAlg={this.state.settings.chosenSortAlg}
436440
toggleDisplaySettings={this.toggleDisplaySettings}
437-
chooseSortAlg={this.chooseSortAlg}
438-
chooseResetPreset={this.chooseResetPreset}
439-
changeColumnNbr={this.changeColumnNbr}
440-
changeSwapTime={this.changeSwapTime}
441-
changeCompareTime={this.changeCompareTime}
442-
columnNbr={this.state.settings.columnNbr}
443-
swapTime={this.state.settings.swapTime}
444-
compareTime={this.state.settings.compareTime}
445-
algorithmOptions={this.state.settings.algorithmOptions}
446-
setAlgorithmOption={this.setAlgorithmOption}
447-
colorPreset={this.state.settings.colorPreset}
448-
columnColor={this.state.settings.columnColor}
449-
backgroundColor={this.state.settings.backgroundColor}
450-
highlightColor={this.state.settings.highlightColor}
451-
setColorPreset={this.setColorPreset}
452-
setColumnColor={this.setColumnColor}
453-
setBackgroundColor={this.setBackgroundColor}
454-
setHighlightColor={this.setHighlightColor}
455-
/>
441+
>
442+
<SortingAlgorithmSelect
443+
chosenSortAlg={this.state.settings.chosenSortAlg}
444+
chooseSortAlg={this.chooseSortAlg}
445+
/>
446+
<Options
447+
chosenSortAlg={this.state.settings.chosenSortAlg}
448+
algorithmOptions={this.state.settings.algorithmOptions}
449+
setAlgorithmOption={this.setAlgorithmOption}
450+
/>
451+
<ColumnSlider
452+
columnNbr={this.state.settings.columnNbr}
453+
chosenSortAlg={this.state.settings.chosenSortAlg}
454+
algorithmOptions={this.state.settings.algorithmOptions}
455+
changeColumnNbr={this.changeColumnNbr}
456+
/>
457+
<TimeSlider
458+
title="Time per swap (ms)"
459+
time={this.state.settings.swapTime}
460+
changeTime={this.changeSwapTime}
461+
/>
462+
<TimeSlider
463+
title="Time per comparison (ms)"
464+
time={this.state.settings.compareTime}
465+
changeTime={this.changeCompareTime}
466+
/>
467+
<ResetPresetSelect
468+
resetPreset={this.state.settings.resetPreset}
469+
chooseResetPreset={this.chooseResetPreset}
470+
/>
471+
<Colors
472+
colorPreset={this.state.settings.colorPreset}
473+
columnColor={this.state.settings.columnColor}
474+
backgroundColor={this.state.settings.backgroundColor}
475+
highlightColor={this.state.settings.highlightColor}
476+
setColorPreset={this.setColorPreset}
477+
setColumnColor={this.setColumnColor}
478+
setBackgroundColor={this.setBackgroundColor}
479+
setHighlightColor={this.setHighlightColor}
480+
/>
481+
</SideDrawer>
456482
</div>
457483
</div>
458484
);

src/Colors.tsx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import {
2+
FormControl,
3+
Typography,
4+
Stack,
5+
TextField,
6+
MenuItem,
7+
Grid2,
8+
} from '@mui/material';
9+
import { ColorPreset } from './types';
10+
11+
export function Colors(props: {
12+
colorPreset: ColorPreset;
13+
setColorPreset: (string: ColorPreset) => void;
14+
columnColor: string;
15+
setColumnColor: (string: string) => void;
16+
backgroundColor: string;
17+
setBackgroundColor: (string: string) => void;
18+
highlightColor: string;
19+
setHighlightColor: (string: string) => void;
20+
}) {
21+
const {
22+
colorPreset,
23+
setColorPreset,
24+
columnColor,
25+
setColumnColor,
26+
backgroundColor,
27+
setBackgroundColor,
28+
highlightColor,
29+
setHighlightColor,
30+
} = props;
31+
32+
return (
33+
<div className="select-wrapper">
34+
<FormControl component="fieldset">
35+
<Typography
36+
align="left"
37+
variant="h6"
38+
color="textSecondary"
39+
gutterBottom
40+
>
41+
Colors
42+
</Typography>
43+
<Stack direction="column" spacing={2} alignItems="left">
44+
<TextField
45+
value={colorPreset}
46+
label="Preset"
47+
size="small"
48+
select
49+
onChange={(e) => setColorPreset(e.target.value as ColorPreset)}
50+
>
51+
{Object.values(ColorPreset).map((v) => (
52+
<MenuItem value={v} key={v}>
53+
<Typography align="left" variant="body1" color="textSecondary">
54+
{v}
55+
</Typography>
56+
</MenuItem>
57+
))}
58+
</TextField>
59+
{colorPreset === ColorPreset.Custom && (
60+
<Grid2 container spacing={2}>
61+
<TextField
62+
label="Columns"
63+
value={columnColor}
64+
type="color"
65+
size="small"
66+
sx={{ width: 100 }}
67+
onChange={(e) => setColumnColor(e.target.value)}
68+
/>
69+
<TextField
70+
label="Background"
71+
value={backgroundColor}
72+
type="color"
73+
size="small"
74+
sx={{ width: 100 }}
75+
onChange={(e) => setBackgroundColor(e.target.value)}
76+
/>
77+
<TextField
78+
label="Highlight"
79+
value={highlightColor}
80+
type="color"
81+
size="small"
82+
sx={{ width: 100 }}
83+
onChange={(e) => setHighlightColor(e.target.value)}
84+
/>
85+
</Grid2>
86+
)}
87+
</Stack>
88+
</FormControl>
89+
</div>
90+
);
91+
}

src/ColumnSlider.tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { Typography, Slider } from '@mui/material';
2+
import { POWERS_OF_TWO } from './constants';
3+
import { useEffect } from 'react';
4+
import { AlgorithmOptions, SortName } from './types';
5+
6+
export function ColumnSlider(props: {
7+
columnNbr: number;
8+
chosenSortAlg: SortName;
9+
algorithmOptions: AlgorithmOptions;
10+
changeColumnNbr: (_: unknown, value: number | number[]) => void;
11+
}) {
12+
const { columnNbr, chosenSortAlg, algorithmOptions, changeColumnNbr } = props;
13+
14+
// Bitonic Sort and recursive Odd-even mergesort requires a power of two
15+
const requiresPowerOfTwoColumns =
16+
chosenSortAlg === SortName.BitonicSort ||
17+
(chosenSortAlg === SortName.OddEvenMergesort &&
18+
algorithmOptions.type === 'recursive');
19+
20+
useEffect(() => {
21+
if (requiresPowerOfTwoColumns) {
22+
changeColumnNbr(undefined, 2 ** Math.floor(Math.log2(columnNbr)));
23+
}
24+
}, [requiresPowerOfTwoColumns, changeColumnNbr, columnNbr]);
25+
26+
return (
27+
<div>
28+
<Typography align="left" variant="h6" color="textSecondary" gutterBottom>
29+
# Columns
30+
</Typography>
31+
<div className="col-slider">
32+
<Slider
33+
defaultValue={columnNbr}
34+
aria-labelledby="discrete-slider"
35+
valueLabelDisplay="auto"
36+
min={8}
37+
max={1024}
38+
step={requiresPowerOfTwoColumns ? null : 1}
39+
marks={
40+
requiresPowerOfTwoColumns
41+
? POWERS_OF_TWO.map((value) => ({
42+
value,
43+
}))
44+
: false
45+
}
46+
onChangeCommitted={changeColumnNbr}
47+
/>
48+
</div>
49+
</div>
50+
);
51+
}

src/ResetPresetSelect.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import {
2+
SelectChangeEvent,
3+
FormControl,
4+
Typography,
5+
Select,
6+
MenuItem,
7+
} from '@mui/material';
8+
import { ResetPreset } from './types';
9+
10+
export function ResetPresetSelect(props: {
11+
resetPreset: ResetPreset;
12+
chooseResetPreset: (event: SelectChangeEvent<ResetPreset>) => void;
13+
}) {
14+
const { resetPreset, chooseResetPreset } = props;
15+
return (
16+
<div className="select-wrapper">
17+
<FormControl component="fieldset">
18+
<Typography
19+
align="left"
20+
variant="h6"
21+
color="textSecondary"
22+
gutterBottom
23+
>
24+
Reset Preset
25+
</Typography>
26+
<Select
27+
defaultValue={resetPreset}
28+
value={resetPreset}
29+
onChange={chooseResetPreset}
30+
size="small"
31+
>
32+
{Object.values(ResetPreset).map((v) => (
33+
<MenuItem value={v} key={v}>
34+
<Typography align="left" variant="body1" color="textSecondary">
35+
{v}
36+
</Typography>
37+
</MenuItem>
38+
))}
39+
</Select>
40+
</FormControl>
41+
</div>
42+
);
43+
}

0 commit comments

Comments
 (0)