diff --git a/src/App.tsx b/src/App.tsx index fe706920d..d6107a0b9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,12 +9,7 @@ import { DebugPanel } from './components/DebugPanel' import { v4 as uuidv4 } from 'uuid' import { asyncLexer } from './lang/tokeniser' import { abstractSyntaxTree } from './lang/abstractSyntaxTree' -import { - _executor, - ProgramMemory, - ExtrudeGroup, - SketchGroup, -} from './lang/executor' +import { _executor } from './lang/executor' import CodeMirror from '@uiw/react-codemirror' import { langs } from '@uiw/codemirror-extensions-langs' import { linter, lintGutter } from '@codemirror/lint' @@ -358,7 +353,7 @@ export function App() { return (
- -
- -
-
- + +
+ +
+
+ setEditorView(_editorView)} + /> +
+
+
+ setEditorView(_editorView)} + open={openPanes.includes('variables')} + title="Variables" + icon={faSquareRootVariable} /> -
-
-
- - - -
+ + + +
{debugPanel && ( diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index e0e7b7a09..84057cbf0 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -1,6 +1,5 @@ import { faArrowRotateBack, - faCheck, faFolder, faXmark, } from '@fortawesome/free-solid-svg-icons' @@ -8,27 +7,29 @@ import { ActionButton } from '../components/ActionButton' import { AppHeader } from '../components/AppHeader' import { open } from '@tauri-apps/api/dialog' import { baseUnits, useStore } from '../useStore' -import { useState } from 'react' +import { useRef } from 'react' import { toast } from 'react-hot-toast' import { Toggle } from '../components/Toggle/Toggle' import { useNavigate } from 'react-router-dom' +import { useHotkeys } from 'react-hotkeys-hook' export const Settings = () => { const navigate = useNavigate() + useHotkeys('esc', () => navigate('/')) const { - defaultDir: ogDefaultDir, - setDefaultDir: saveDefaultDir, - defaultProjectName: ogDefaultProjectName, - setDefaultProjectName: saveDefaultProjectName, - defaultUnitSystem: ogDefaultUnitSystem, - setDefaultUnitSystem: saveDefaultUnitSystem, - defaultBaseUnit: ogDefaultBaseUnit, - setDefaultBaseUnit: saveDefaultBaseUnit, - saveDebugPanel, - originalDebugPanel, + defaultDir, + setDefaultDir, + defaultProjectName, + setDefaultProjectName, + defaultUnitSystem, + setDefaultUnitSystem, + defaultBaseUnit, + setDefaultBaseUnit, + setDebugPanel, + debugPanel, setOnboardingStatus, - theme: ogTheme, - setTheme: saveTheme, + theme, + setTheme, } = useStore((s) => ({ defaultDir: s.defaultDir, setDefaultDir: s.setDefaultDir, @@ -38,20 +39,13 @@ export const Settings = () => { setDefaultUnitSystem: s.setDefaultUnitSystem, defaultBaseUnit: s.defaultBaseUnit, setDefaultBaseUnit: s.setDefaultBaseUnit, - saveDebugPanel: s.setDebugPanel, - originalDebugPanel: s.debugPanel, + setDebugPanel: s.setDebugPanel, + debugPanel: s.debugPanel, setOnboardingStatus: s.setOnboardingStatus, theme: s.theme, setTheme: s.setTheme, })) - const [defaultDir, setDefaultDir] = useState(ogDefaultDir) - const [defaultProjectName, setDefaultProjectName] = - useState(ogDefaultProjectName) - const [defaultUnitSystem, setDefaultUnitSystem] = - useState(ogDefaultUnitSystem) - const [defaultBaseUnit, setDefaultBaseUnit] = useState(ogDefaultBaseUnit) - const [debugPanel, setDebugPanel] = useState(originalDebugPanel) - const [theme, setTheme] = useState(ogTheme) + const ogDefaultProjectName = useRef(defaultProjectName) async function handleDirectorySelection() { const newDirectory = await open({ @@ -65,16 +59,6 @@ export const Settings = () => { } } - const handleSaveClick = () => { - saveDefaultDir(defaultDir) - saveDefaultProjectName(defaultProjectName) - saveDefaultUnitSystem(defaultUnitSystem) - saveDefaultBaseUnit(defaultBaseUnit) - saveDebugPanel(debugPanel) - saveTheme(theme) - toast.success('Settings saved!') - } - return ( <> @@ -92,7 +76,7 @@ export const Settings = () => { Close -
+

User Settings

{(window as any).__TAURI__ && ( { + onChange={(e) => { setDefaultDir({ - base: ogDefaultDir.base, + base: defaultDir.base, dir: e.target.value, }) - } + toast.success('Default directory updated') + }} /> { setDefaultProjectName(e.target.value)} + onChange={(e) => { + setDefaultProjectName(e.target.value) + }} + onBlur={() => { + ogDefaultProjectName.current !== defaultProjectName && + toast.success('Default project name updated') + }} /> { onLabel="Metric" name="settings-units" checked={defaultUnitSystem === 'metric'} - onChange={(e) => - setDefaultUnitSystem(e.target.checked ? 'metric' : 'imperial') - } + onChange={(e) => { + const newUnitSystem = e.target.checked ? 'metric' : 'imperial' + setDefaultUnitSystem(newUnitSystem) + setDefaultBaseUnit(baseUnits[newUnitSystem][0]) + toast.success('Unit system set to ' + newUnitSystem) + }} /> { id="base-unit" className="block w-full px-3 py-1 border border-chalkboard-30 bg-transparent" value={defaultBaseUnit} - onChange={(e) => setDefaultBaseUnit(e.target.value)} + onChange={(e) => { + setDefaultBaseUnit(e.target.value) + toast.success('Base unit changed to ' + e.target.value) + }} > {baseUnits[defaultUnitSystem].map((unit) => ( { offLabel="Dark" onLabel="Light" checked={theme === 'light'} - onChange={(e) => setTheme(e.target.checked ? 'light' : 'dark')} + onChange={(e) => { + const newTheme = e.target.checked ? 'light' : 'dark' + setTheme(newTheme) + toast.success( + newTheme.slice(0, 1).toLocaleUpperCase() + + newTheme.slice(1) + + ' mode activated' + ) + }} /> { Replay Onboarding - - Save Settings -
) @@ -233,7 +230,7 @@ export function SettingsSection({ children, }: SettingsSectionProps) { return ( -
+

{title}

{description}