2022-11-27 14:06:33 +11:00
|
|
|
import { useStore } from './useStore'
|
2023-01-06 12:45:34 +11:00
|
|
|
import { extrudeSketch } from './lang/modifyAst'
|
|
|
|
import { getNodePathFromSourceRange } from './lang/abstractSyntaxTree'
|
2022-11-27 14:06:33 +11:00
|
|
|
|
|
|
|
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,
|
|
|
|
})
|
|
|
|
)
|
2022-11-27 14:06:33 +11:00
|
|
|
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"
|
2022-11-27 14:06:33 +11:00
|
|
|
>
|
|
|
|
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>
|
2022-11-28 09:37:46 +11:00
|
|
|
)}
|
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
|
|
|
|
2022-11-27 14:06:33 +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-11-27 14:06:33 +11:00
|
|
|
)}
|
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>
|
|
|
|
)}
|
2022-11-27 14:06:33 +11:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|