diff --git a/src/App.tsx b/src/App.tsx index b8eb336bf..86416a873 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,6 @@ import { useRef, useEffect, useMemo } from 'react' import { Allotment } from 'allotment' +import { DebugPanel } from './components/DebugPanel' import { asyncLexer } from './lang/tokeniser' import { abstractSyntaxTree } from './lang/abstractSyntaxTree' import { _executor, ExtrudeGroup, SketchGroup } from './lang/executor' @@ -50,6 +51,7 @@ export function App() { isStreamReady, token, formatCode, + debugPanel, } = useStore((s) => ({ editorView: s.editorView, setEditorView: s.setEditorView, @@ -77,6 +79,7 @@ export function App() { setIsStreamReady: s.setIsStreamReady, token: s.token, formatCode: s.formatCode, + debugPanel: s.debugPanel, })) // const onChange = React.useCallback((value: string, viewUpdate: ViewUpdate) => { const onChange = (value: string, viewUpdate: ViewUpdate) => { @@ -291,6 +294,7 @@ export function App() { + {debugPanel && } ) diff --git a/src/components/DebugPanel.tsx b/src/components/DebugPanel.tsx new file mode 100644 index 000000000..45f3a0853 --- /dev/null +++ b/src/components/DebugPanel.tsx @@ -0,0 +1,118 @@ +import { PanelHeader } from '../components/PanelHeader' +import { useStore } from '../useStore' +import { v4 as uuidv4 } from 'uuid' +import { EngineCommand } from '../lang/std/engineConnection' +import { useState } from 'react' +import { ActionButton } from '../components/ActionButton' +import { faCheck } from '@fortawesome/free-solid-svg-icons' + +type SketchModeCmd = EngineCommand['cmd']['DefaultCameraEnableSketchMode'] + +export const DebugPanel = () => { + const { engineCommandManager } = useStore((s) => ({ + engineCommandManager: s.engineCommandManager, + })) + const [sketchModeCmd, setSketchModeCmd] = useState({ + origin: { x: 0, y: 0, z: 0 }, + x_axis: { x: 1, y: 0, z: 0 }, + y_axis: { x: 0, y: 1, z: 0 }, + distance_to_plane: 100, + ortho: true, + }) + if (!sketchModeCmd) return null + return ( +
+ + + + +
+
distance_to_plane
+ { + setSketchModeCmd({ + ...sketchModeCmd, + distance_to_plane: Number(target.value), + }) + }} + /> +
ortho
+ { + console.log(a, (a as any).checked) + setSketchModeCmd({ + ...sketchModeCmd, + ortho: a.target.checked, + }) + }} + /> +
+ { + engineCommandManager?.sendSceneCommand({ + type: 'ModelingCmdReq', + cmd: { + DefaultCameraEnableSketchMode: sketchModeCmd, + }, + cmd_id: uuidv4(), + file_id: uuidv4(), + }) + }} + className="hover:border-succeed-50" + icon={{ + icon: faCheck, + bgClassName: + 'bg-succeed-80 group-hover:bg-succeed-70 hover:bg-succeed-70', + iconClassName: + 'text-succeed-20 group-hover:text-succeed-10 hover:text-succeed-10', + }} + > + Send sketch mode command + +
+ ) +} + +const Xyz = ({ + pointKey, + data, + onChange, +}: { + pointKey: 'origin' | 'y_axis' | 'x_axis' + data: SketchModeCmd + onChange: (a: SketchModeCmd) => void +}) => { + if (!data) return null + return ( +
+
{pointKey}
+ {Object.entries(data[pointKey]).map(([axis, val]) => { + return ( +
+
{axis}
+ { + onChange({ + ...data, + [pointKey]: { + ...data[pointKey], + [axis]: Number(target.value), + }, + }) + }} + /> +
+ ) + })} +
+ ) +} diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index 338bcfad4..2e8094d10 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -47,7 +47,7 @@ interface XYZ { y: number z: number } -interface EngineCommand { +export interface EngineCommand { type: 'ModelingCmdReq' cmd: { StartPath?: {} @@ -74,6 +74,13 @@ interface EngineCommand { CameraDragMove?: MouseDrag CameraDragStart?: MouseStuff CameraDragEnd?: MouseStuff + DefaultCameraEnableSketchMode?: { + origin: XYZ + x_axis: XYZ + y_axis: XYZ + distance_to_plane: number + ortho: boolean + } } cmd_id: uuid file_id: uuid diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 1bfd38e73..dbb1f9329 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -12,16 +12,21 @@ export const Settings = () => { setDefaultDir: saveDefaultDir, defaultProjectName: originalDefaultProjectName, setDefaultProjectName: saveDefaultProjectName, + saveDebugPanel, + originalDebugPanel, } = useStore((s) => ({ defaultDir: s.defaultDir, setDefaultDir: s.setDefaultDir, defaultProjectName: s.defaultProjectName, setDefaultProjectName: s.setDefaultProjectName, + saveDebugPanel: s.setDebugPanel, + originalDebugPanel: s.debugPanel, })) const [defaultDir, setDefaultDir] = useState(originalDefaultDir) const [defaultProjectName, setDefaultProjectName] = useState( originalDefaultProjectName ) + const [debugPanel, setDebugPanel] = useState(originalDebugPanel) async function handleDirectorySelection() { const newDirectory = await open({ @@ -38,6 +43,7 @@ export const Settings = () => { const handleSaveClick = () => { saveDefaultDir(defaultDir) saveDefaultProjectName(defaultProjectName) + saveDebugPanel(debugPanel) toast.success('Settings saved!') } @@ -103,6 +109,16 @@ export const Settings = () => { onChange={(e) => setDefaultProjectName(e.target.value)} /> + + setDebugPanel(e.target.checked)} + /> + void token: string setToken: (token: string) => void + debugPanel: boolean + setDebugPanel: (debugPanel: boolean) => void } let pendingAstUpdates: number[] = [] @@ -323,6 +320,8 @@ export const useStore = create()( setHomeMenuItems: (homeMenuItems) => set({ homeMenuItems }), token: '', setToken: (token) => set({ token }), + debugPanel: false, + setDebugPanel: (debugPanel) => set({ debugPanel }), }), { name: 'store', @@ -333,6 +332,7 @@ export const useStore = create()( 'defaultDir', 'defaultProjectName', 'token', + 'debugPanel' ].includes(key)) ), } diff --git a/tsconfig.node.json b/tsconfig.node.json index 836558409..dcfd13701 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -1,9 +1,11 @@ { - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": [ + "vite.config.ts" + ] } \ No newline at end of file