Files
modeling-app/src/Toolbar.tsx

102 lines
2.8 KiB
TypeScript
Raw Normal View History

import { useStore } from './useStore'
2023-01-06 12:45:34 +11:00
import { extrudeSketch } from './lang/modifyAst'
import { getNodePathFromSourceRange } from './lang/abstractSyntaxTree'
export const Toolbar = () => {
2023-01-06 12:45:34 +11:00
const { setGuiMode, guiMode, selectionRange, ast, updateAst } = useStore(
({ guiMode, setGuiMode, selectionRange, ast, updateAst }) => ({
guiMode,
setGuiMode,
selectionRange,
ast,
updateAst,
})
)
return (
<div>
{guiMode.mode === 'default' && (
<button
onClick={() => {
setGuiMode({
mode: 'sketch',
sketchMode: 'selectFace',
})
}}
2022-12-06 05:40:05 +11:00
className="border m-1 px-1 rounded"
>
Start sketch
</button>
)}
2022-12-06 05:40:05 +11:00
{guiMode.mode === 'canEditSketch' && (
<button
onClick={() => {
setGuiMode({
mode: 'sketch',
sketchMode: 'sketchEdit',
pathToNode: guiMode.pathToNode,
2022-12-23 07:37:42 +11:00
quaternion: guiMode.quaternion,
2023-01-04 01:28:26 +11:00
position: guiMode.position,
2022-12-06 05:40:05 +11:00
})
}}
className="border m-1 px-1 rounded"
>
EditSketch
</button>
)}
2023-01-06 12:45:34 +11:00
{guiMode.mode === 'canEditSketch' && (
<>
<button
onClick={() => {
if (!ast) return
const pathToNote = getNodePathFromSourceRange(ast, selectionRange)
const { modifiedAst } = extrudeSketch(ast, pathToNote)
updateAst(modifiedAst)
}}
className="border m-1 px-1 rounded"
>
ExtrudeSketch
</button>
<button
onClick={() => {
if (!ast) return
const pathToNote = getNodePathFromSourceRange(ast, selectionRange)
const { modifiedAst } = extrudeSketch(ast, pathToNote, false)
updateAst(modifiedAst)
}}
className="border m-1 px-1 rounded"
>
ExtrudeSketch (w/o pipe)
</button>
</>
)}
2022-12-06 05:40:05 +11:00
{guiMode.mode !== 'default' && (
2022-12-06 05:40:05 +11:00
<button
onClick={() => setGuiMode({ mode: 'default' })}
className="border m-1 px-1 rounded"
>
Exit sketch
</button>
)}
2022-12-06 05:40:05 +11:00
{guiMode.mode === 'sketch' &&
(guiMode.sketchMode === 'points' ||
guiMode.sketchMode === 'sketchEdit') && (
<button
className={`border m-1 px-1 rounded ${
guiMode.sketchMode === 'points' && 'bg-gray-400'
}`}
2022-12-23 07:37:42 +11:00
onClick={() =>
setGuiMode({
...guiMode,
sketchMode:
guiMode.sketchMode === 'points' ? 'sketchEdit' : 'points',
})
}
2022-12-06 05:40:05 +11:00
>
LineTo{guiMode.sketchMode === 'points' && '✅'}
</button>
)}
</div>
)
}