* Add basic Popover functionality * Fix up light mode of basic bar * Add support for 2D and 3D mode styling * Turn toolbar buttons back on * Remove ActionButton until after tool logic refactor * Add transitions * Add initial modeling machine This is not a full description of how the modelingMachine should work, but begins to replicate all of the features of our useStore in XState instead of zustand. * Add fillet tool flow * Refactor: break out engine manager setup into hook Preparing for making a wrapper component around the App that will manage the engine manager at the same level as the modelingMachine. * Create modeling provider, move engine management to it * Refactor: move other engine-related useEffect into hook * Add TS schema, selection actions to modelingMachine * Add barebones modeling machine to app Only implementing adding to code-based selections in the text editor so far * Update moved useEffect hook after merge * give myself reminder TODO * fix engineCommandManager waitForReady Promise * enable devtools * make utility class for handling default planes * progresson startNewSketch and EditSketch * add provider to tests * too large of a commit put all of the lang state into another singleton, but did lots of work on xstate too * fix edit sketch ast issue * re-execute on sketch exit * prettierignore xstate typegen file * add move tool button back in * handle mouse commands with xState states * fix move * remove old imports * big useStore delete * fix some destructuring bugs * start of constraint actions * add horizontal/vertical distance constraints * fix more destructuring errors * fix * add angle constaints * add align vertically/horizontally constraints * add length and equal length constraints * rename modal states to be more cmd bar friendly * add doesPipeHave query * add another query * add extrude states * state machine clean up * xstate layout tweak * make xstate types happy * Revamp cursor logic and place curors after ast mod * Xstate merge (#796) * turning back on all planes (#720) * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix more tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix stdlib Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> compile Signed-off-by: Jess Frazelle <github@jessfraz.com> update sample code Signed-off-by: Jess Frazelle <github@jessfraz.com> re-enable the planes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fix all tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> boilerplate Signed-off-by: Jess Frazelle <github@jessfraz.com> Cut release v0.9.2 (#714) rust make default planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> use the planes from engine Signed-off-by: Jess Frazelle <github@jessfraz.com> fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> negative args Signed-off-by: Jess Frazelle <github@jessfraz.com> diable camera Signed-off-by: Jess Frazelle <github@jessfraz.com> hide planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updatress Signed-off-by: Jess Frazelle <github@jessfraz.com> fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> cleanups Signed-off-by: Jess Frazelle <github@jessfraz.com> Bump kittycad from 0.2.26 to 0.2.27 in /src-tauri (#726) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump tauri-plugin-fs-extra from `b04bde3` to `6c7a4c0` in /src-tauri (#725) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `b04bde3` to `6c7a4c0`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](b04bde3461...6c7a4c0984
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump toml from 0.8.0 to 0.8.1 in /src-tauri (#724) Bumps [toml](https://github.com/toml-rs/toml) from 0.8.0 to 0.8.1. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.0...toml-v0.8.1) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump openapitor from `61a1605` to `d3e98c4` in /src/wasm-lib (#723) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `61a1605` to `d3e98c4`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](61a16059b3...d3e98c4ec0
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump kittycad from 0.2.26 to 0.2.27 in /src/wasm-lib (#722) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump thiserror from 1.0.48 to 1.0.49 in /src/wasm-lib (#721) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.48 to 1.0.49. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/1.0.48...1.0.49) --- updated-dependencies: - dependency-name: thiserror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump expectorate from 1.0.7 to 1.1.0 in /src/wasm-lib (#712) Bumps [expectorate](https://github.com/oxidecomputer/expectorate) from 1.0.7 to 1.1.0. - [Release notes](https://github.com/oxidecomputer/expectorate/releases) - [Commits](https://github.com/oxidecomputer/expectorate/compare/v1.0.7...v1.1.0) --- updated-dependencies: - dependency-name: expectorate dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump clap from 4.4.4 to 4.4.5 in /src/wasm-lib (#711) Bumps [clap](https://github.com/clap-rs/clap) from 4.4.4 to 4.4.5. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.4.4...v4.4.5) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> refactor cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> type improvements * use new sketchmode no camera Signed-off-by: Jess Frazelle <github@jessfraz.com> * js working better Signed-off-by: Jess Frazelle <github@jessfraz.com> * start of negative planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * tests and neg Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * images Signed-off-by: Jess Frazelle <github@jessfraz.com> * norma;s Signed-off-by: Jess Frazelle <github@jessfraz.com> * better initial load of planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * ts Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix edit sketch Signed-off-by: Jess Frazelle <github@jessfraz.com> * add regression test for 2d solid issue Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * show planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * canecel in progress Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix ci as well Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * stopping point Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * refactor Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * it works Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * Hide planes (#797) * hide planes in one go Signed-off-by: Jess Frazelle <github@jessfraz.com> * update hide; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * make tsc happy * Make "Replay Onboarding" button available on home settings page (#804) * Fix unrelated bug, settings button in the home sidebar doesn't go to the home settings after my previous fixes to routes * Turn on "Replay Onboarding" button in home settings * Use ONBOARDING_PROJECT_NAME in both places * Fix formatting * Cut release v0.10.0 (#803) Co-authored-by: Frank Noirot <frank@kittycad.io> * Bump kittycad from 0.2.28 to 0.2.31 in /src-tauri (#798) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.28 to 0.2.31. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.28...v0.2.31) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump openapitor from `fa0345c` to `c122a9b` in /src/wasm-lib (#800) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `fa0345c` to `c122a9b`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](fa0345c514...c122a9b1d6
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump syn from 2.0.37 to 2.0.38 in /src/wasm-lib (#801) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.37 to 2.0.38. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.37...2.0.38) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump winnow from 0.5.15 to 0.5.16 in /src/wasm-lib (#799) Bumps [winnow](https://github.com/winnow-rs/winnow) from 0.5.15 to 0.5.16. - [Changelog](https://github.com/winnow-rs/winnow/blob/main/CHANGELOG.md) - [Commits](https://github.com/winnow-rs/winnow/compare/v0.5.15...v0.5.16) --- updated-dependencies: - dependency-name: winnow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tauri-plugin-fs-extra from `fa32d1a` to `9f27e6e` in /src-tauri (#802) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `fa32d1a` to `9f27e6e`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](fa32d1afa9...9f27e6e441
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * better plane selection Signed-off-by: Jess Frazelle <github@jessfraz.com> * use the sketch plane id Signed-off-by: Jess Frazelle <github@jessfraz.com> * add todo w bug Signed-off-by: Jess Frazelle <github@jessfraz.com> * Improve Prop Typings for Modals. Remove instances of `any`. (#792) * Update typings for modals. Remove instances of `any` * Fix generic type for creating modals * cleanup other stuffs Signed-off-by: Jess Frazelle <github@jessfraz.com> * make plane id available when selecting default plane * few clean up things * change enter sketch action order to make sure plane id is available to 'enter edit mode' * Revert "Improve Prop Typings for Modals. Remove instances of `any`. (… (#813) Revert "Improve Prop Typings for Modals. Remove instances of `any`. (#792)" This reverts commit629f326f4c
. * ffmpeg instructions (#814) * fix some tsc stuff * small tweak --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Kurt Hutten Irev-Dev <k.hutten@protonmail.ch> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com> * clean up * fix test and tsc * remove one more thing from useStore * tweak state digrame layout * fmt --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Frank Johnson <frankjohnson1993@gmail.com> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com>
424 lines
10 KiB
TypeScript
424 lines
10 KiB
TypeScript
import { create } from 'zustand'
|
|
import { persist } from 'zustand/middleware'
|
|
import { addLineHighlight, EditorView } from './editor/highlightextension'
|
|
import {
|
|
parse,
|
|
Program,
|
|
_executor,
|
|
ProgramMemory,
|
|
Position,
|
|
PathToNode,
|
|
Rotation,
|
|
SourceRange,
|
|
} from './lang/wasm'
|
|
import { enginelessExecutor } from './lib/testHelpers'
|
|
import { EditorSelection } from '@codemirror/state'
|
|
import { EngineCommandManager } from './lang/std/engineConnection'
|
|
import { KCLError } from './lang/errors'
|
|
import { kclManager } from 'lang/KclSinglton'
|
|
import { DefaultPlanes } from './wasm-lib/kcl/bindings/DefaultPlanes'
|
|
|
|
export type Axis = 'y-axis' | 'x-axis' | 'z-axis'
|
|
|
|
export type Selection = {
|
|
type:
|
|
| 'default'
|
|
| 'line-end'
|
|
| 'line-mid'
|
|
| 'face'
|
|
| 'point'
|
|
| 'edge'
|
|
| 'line'
|
|
| 'arc'
|
|
| 'all'
|
|
range: SourceRange
|
|
}
|
|
export type Selections = {
|
|
otherSelections: Axis[]
|
|
codeBasedSelections: Selection[]
|
|
}
|
|
export type ToolTip =
|
|
| 'lineTo'
|
|
| 'line'
|
|
| 'angledLine'
|
|
| 'angledLineOfXLength'
|
|
| 'angledLineOfYLength'
|
|
| 'angledLineToX'
|
|
| 'angledLineToY'
|
|
| 'xLine'
|
|
| 'yLine'
|
|
| 'xLineTo'
|
|
| 'yLineTo'
|
|
| 'angledLineThatIntersects'
|
|
|
|
export const toolTips = [
|
|
'sketch_line',
|
|
'move',
|
|
// original tooltips
|
|
'line',
|
|
'lineTo',
|
|
'angledLine',
|
|
'angledLineOfXLength',
|
|
'angledLineOfYLength',
|
|
'angledLineToX',
|
|
'angledLineToY',
|
|
'xLine',
|
|
'yLine',
|
|
'xLineTo',
|
|
'yLineTo',
|
|
'angledLineThatIntersects',
|
|
] as any as ToolTip[]
|
|
|
|
export type PaneType =
|
|
| 'code'
|
|
| 'variables'
|
|
| 'debug'
|
|
| 'kclErrors'
|
|
| 'logs'
|
|
| 'lspMessages'
|
|
|
|
export interface SelectionRangeTypeMap {
|
|
[key: number]: Selection['type']
|
|
}
|
|
|
|
export interface StoreState {
|
|
editorView: EditorView | null
|
|
setEditorView: (editorView: EditorView) => void
|
|
highlightRange: [number, number]
|
|
setHighlightRange: (range: Selection['range']) => void
|
|
isShiftDown: boolean
|
|
setIsShiftDown: (isShiftDown: boolean) => void
|
|
mediaStream?: MediaStream
|
|
setMediaStream: (mediaStream: MediaStream) => void
|
|
isStreamReady: boolean
|
|
setIsStreamReady: (isStreamReady: boolean) => void
|
|
isLSPServerReady: boolean
|
|
setIsLSPServerReady: (isLSPServerReady: boolean) => void
|
|
buttonDownInStream: number | undefined
|
|
setButtonDownInStream: (buttonDownInStream: number | undefined) => void
|
|
didDragInStream: boolean
|
|
setDidDragInStream: (didDragInStream: boolean) => void
|
|
fileId: string
|
|
setFileId: (fileId: string) => void
|
|
streamDimensions: { streamWidth: number; streamHeight: number }
|
|
setStreamDimensions: (dimensions: {
|
|
streamWidth: number
|
|
streamHeight: number
|
|
}) => void
|
|
|
|
showHomeMenu: boolean
|
|
setHomeShowMenu: (showMenu: boolean) => void
|
|
isBannerDismissed: boolean
|
|
setBannerDismissed: (isBannerDismissed: boolean) => void
|
|
openPanes: PaneType[]
|
|
setOpenPanes: (panes: PaneType[]) => void
|
|
homeMenuItems: {
|
|
name: string
|
|
path: string
|
|
}[]
|
|
setHomeMenuItems: (items: { name: string; path: string }[]) => void
|
|
}
|
|
|
|
export const useStore = create<StoreState>()(
|
|
persist(
|
|
(set, get) => {
|
|
return {
|
|
editorView: null,
|
|
setEditorView: (editorView) => {
|
|
set({ editorView })
|
|
},
|
|
highlightRange: [0, 0],
|
|
setHighlightRange: (selection) => {
|
|
set({ highlightRange: selection })
|
|
const editorView = get().editorView
|
|
if (editorView) {
|
|
editorView.dispatch({ effects: addLineHighlight.of(selection) })
|
|
}
|
|
},
|
|
isShiftDown: false,
|
|
setIsShiftDown: (isShiftDown) => set({ isShiftDown }),
|
|
setMediaStream: (mediaStream) => set({ mediaStream }),
|
|
isStreamReady: false,
|
|
setIsStreamReady: (isStreamReady) => set({ isStreamReady }),
|
|
isLSPServerReady: false,
|
|
setIsLSPServerReady: (isLSPServerReady) => set({ isLSPServerReady }),
|
|
buttonDownInStream: undefined,
|
|
setButtonDownInStream: (buttonDownInStream) => {
|
|
set({ buttonDownInStream })
|
|
},
|
|
didDragInStream: false,
|
|
setDidDragInStream: (didDragInStream) => {
|
|
set({ didDragInStream })
|
|
},
|
|
// For stream event handling
|
|
fileId: '',
|
|
setFileId: (fileId) => set({ fileId }),
|
|
streamDimensions: { streamWidth: 1280, streamHeight: 720 },
|
|
setStreamDimensions: (streamDimensions) => {
|
|
set({ streamDimensions })
|
|
},
|
|
|
|
// tauri specific app settings
|
|
defaultDir: {
|
|
dir: '',
|
|
},
|
|
isBannerDismissed: false,
|
|
setBannerDismissed: (isBannerDismissed) => set({ isBannerDismissed }),
|
|
openPanes: ['code'],
|
|
setOpenPanes: (openPanes) => set({ openPanes }),
|
|
showHomeMenu: true,
|
|
setHomeShowMenu: (showHomeMenu) => set({ showHomeMenu }),
|
|
homeMenuItems: [],
|
|
setHomeMenuItems: (homeMenuItems) => set({ homeMenuItems }),
|
|
}
|
|
},
|
|
{
|
|
name: 'store',
|
|
partialize: (state) =>
|
|
Object.fromEntries(
|
|
Object.entries(state).filter(([key]) => ['openPanes'].includes(key))
|
|
),
|
|
}
|
|
)
|
|
)
|
|
|
|
const defaultProgramMemory: ProgramMemory['root'] = {
|
|
_0: {
|
|
type: 'UserVal',
|
|
value: 0,
|
|
__meta: [],
|
|
},
|
|
_90: {
|
|
type: 'UserVal',
|
|
value: 90,
|
|
__meta: [],
|
|
},
|
|
_180: {
|
|
type: 'UserVal',
|
|
value: 180,
|
|
__meta: [],
|
|
},
|
|
_270: {
|
|
type: 'UserVal',
|
|
value: 270,
|
|
__meta: [],
|
|
},
|
|
PI: {
|
|
type: 'UserVal',
|
|
value: Math.PI,
|
|
__meta: [],
|
|
},
|
|
}
|
|
|
|
export async function executeCode({
|
|
engineCommandManager,
|
|
code,
|
|
lastAst,
|
|
defaultPlanes,
|
|
force,
|
|
}: {
|
|
code: string
|
|
lastAst: Program
|
|
engineCommandManager: EngineCommandManager
|
|
defaultPlanes: DefaultPlanes
|
|
force?: boolean
|
|
}): Promise<
|
|
| {
|
|
logs: string[]
|
|
errors: KCLError[]
|
|
programMemory: ProgramMemory
|
|
ast: Program
|
|
isChange: true
|
|
}
|
|
| { isChange: false }
|
|
> {
|
|
let ast: Program
|
|
try {
|
|
ast = parse(code)
|
|
} catch (e) {
|
|
let errors: KCLError[] = []
|
|
let logs: string[] = [JSON.stringify(e)]
|
|
if (e instanceof KCLError) {
|
|
errors = [e]
|
|
logs = []
|
|
if (e.msg === 'file is empty') engineCommandManager.endSession()
|
|
}
|
|
return {
|
|
isChange: true,
|
|
logs,
|
|
errors,
|
|
programMemory: {
|
|
root: {},
|
|
return: null,
|
|
},
|
|
ast: {
|
|
start: 0,
|
|
end: 0,
|
|
body: [],
|
|
nonCodeMeta: {
|
|
nonCodeNodes: {},
|
|
start: null,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
// Check if the ast we have is equal to the ast in the storage.
|
|
// If it is, we don't need to update the ast.
|
|
if (JSON.stringify(ast) === JSON.stringify(lastAst) && !force)
|
|
return { isChange: false }
|
|
|
|
const { logs, errors, programMemory } = await executeAst({
|
|
ast,
|
|
engineCommandManager,
|
|
defaultPlanes,
|
|
})
|
|
return {
|
|
ast,
|
|
logs,
|
|
errors,
|
|
programMemory,
|
|
isChange: true,
|
|
}
|
|
}
|
|
|
|
export async function executeAst({
|
|
ast,
|
|
engineCommandManager,
|
|
defaultPlanes,
|
|
useFakeExecutor = false,
|
|
}: {
|
|
ast: Program
|
|
engineCommandManager: EngineCommandManager
|
|
defaultPlanes: DefaultPlanes
|
|
useFakeExecutor?: boolean
|
|
}): Promise<{
|
|
logs: string[]
|
|
errors: KCLError[]
|
|
programMemory: ProgramMemory
|
|
}> {
|
|
try {
|
|
if (!useFakeExecutor) {
|
|
engineCommandManager.endSession()
|
|
engineCommandManager.startNewSession()
|
|
}
|
|
const programMemory = await (useFakeExecutor
|
|
? enginelessExecutor(ast, {
|
|
root: defaultProgramMemory,
|
|
return: null,
|
|
})
|
|
: _executor(
|
|
ast,
|
|
{
|
|
root: defaultProgramMemory,
|
|
return: null,
|
|
},
|
|
engineCommandManager,
|
|
defaultPlanes
|
|
))
|
|
|
|
await engineCommandManager.waitForAllCommands(ast, programMemory)
|
|
return {
|
|
logs: [],
|
|
errors: [],
|
|
programMemory,
|
|
}
|
|
} catch (e: any) {
|
|
if (e instanceof KCLError) {
|
|
return {
|
|
errors: [e],
|
|
logs: [],
|
|
programMemory: {
|
|
root: {},
|
|
return: null,
|
|
},
|
|
}
|
|
} else {
|
|
console.log(e)
|
|
return {
|
|
logs: [e],
|
|
errors: [],
|
|
programMemory: {
|
|
root: {},
|
|
return: null,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function dispatchCodeMirrorCursor({
|
|
selections,
|
|
editorView,
|
|
}: {
|
|
selections: Selections
|
|
editorView: EditorView
|
|
}): {
|
|
selectionRangeTypeMap: SelectionRangeTypeMap
|
|
} {
|
|
const ranges: ReturnType<typeof EditorSelection.cursor>[] = []
|
|
const selectionRangeTypeMap: SelectionRangeTypeMap = {}
|
|
selections.codeBasedSelections.forEach(({ range, type }) => {
|
|
if (range?.[1]) {
|
|
ranges.push(EditorSelection.cursor(range[1]))
|
|
selectionRangeTypeMap[range[1]] = type
|
|
}
|
|
})
|
|
setTimeout(() => {
|
|
ranges.length &&
|
|
editorView.dispatch({
|
|
selection: EditorSelection.create(
|
|
ranges,
|
|
selections.codeBasedSelections.length - 1
|
|
),
|
|
})
|
|
})
|
|
return {
|
|
selectionRangeTypeMap,
|
|
}
|
|
}
|
|
|
|
export function setCodeMirrorCursor({
|
|
codeSelection,
|
|
currestSelections,
|
|
editorView,
|
|
isShiftDown,
|
|
}: {
|
|
codeSelection?: Selection
|
|
currestSelections: Selections
|
|
editorView: EditorView
|
|
isShiftDown: boolean
|
|
}): SelectionRangeTypeMap {
|
|
// This DOES NOT set the `selectionRanges` in xstate context
|
|
// instead it updates/dispatches to the editor, which in turn updates the xstate context
|
|
// I've found this the best way to deal with the editor without causing an infinite loop
|
|
// and really we want the editor to be in charge of cursor positions and for `selectionRanges` mirror it
|
|
// because we want to respect the user manually placing the cursor too.
|
|
const code = kclManager.code
|
|
if (!codeSelection) {
|
|
const selectionRangeTypeMap = dispatchCodeMirrorCursor({
|
|
editorView,
|
|
selections: {
|
|
otherSelections: currestSelections.otherSelections,
|
|
codeBasedSelections: [
|
|
{
|
|
range: [0, code.length ? code.length - 1 : 0],
|
|
type: 'default',
|
|
},
|
|
],
|
|
},
|
|
})
|
|
return selectionRangeTypeMap
|
|
}
|
|
const selections: Selections = {
|
|
...currestSelections,
|
|
codeBasedSelections: isShiftDown
|
|
? [...currestSelections.codeBasedSelections, codeSelection]
|
|
: [codeSelection],
|
|
}
|
|
const selectionRangeTypeMap = dispatchCodeMirrorCursor({
|
|
editorView,
|
|
selections,
|
|
})
|
|
return selectionRangeTypeMap
|
|
}
|