First draft of a feature tree pane (#4782)
This commit is contained in:
157
src/machines/featureTreeMachine.ts
Normal file
157
src/machines/featureTreeMachine.ts
Normal file
@ -0,0 +1,157 @@
|
||||
import { SourceRange } from 'lang/wasm'
|
||||
import { assign, setup } from 'xstate'
|
||||
|
||||
type FeatureTreeEvent =
|
||||
| {
|
||||
type: 'goToKclSource'
|
||||
data: { targetSourceRange: SourceRange }
|
||||
}
|
||||
| {
|
||||
type: 'selectOperation'
|
||||
data: { targetSourceRange: SourceRange }
|
||||
}
|
||||
| {
|
||||
type: 'enterEditFlow'
|
||||
data: { targetSourceRange: SourceRange }
|
||||
}
|
||||
| { type: 'goToError' }
|
||||
| { type: 'codePaneOpened' }
|
||||
| { type: 'selected' }
|
||||
| { type: 'done' }
|
||||
|
||||
export const featureTreeMachine = setup({
|
||||
types: {
|
||||
context: {} as { targetSourceRange?: SourceRange },
|
||||
events: {} as FeatureTreeEvent,
|
||||
},
|
||||
guards: {
|
||||
codePaneIsOpen: () => false,
|
||||
},
|
||||
actions: {
|
||||
saveTargetSourceRange: assign({
|
||||
targetSourceRange: ({ event }) =>
|
||||
'data' in event ? event.data.targetSourceRange : undefined,
|
||||
}),
|
||||
clearTargetSourceRange: assign({
|
||||
targetSourceRange: undefined,
|
||||
}),
|
||||
sendSelectionEvent: () => {},
|
||||
openCodePane: () => {},
|
||||
sendEditFlowStart: () => {},
|
||||
scrollToError: () => {},
|
||||
},
|
||||
}).createMachine({
|
||||
/** @xstate-layout N4IgpgJg5mDOIC5QDMwEMAuBXATmAKnmAHQCWEANmAMRQD2+dA0gMYUDKduLYA2gAwBdRKAAOdWKQyk6AOxEgAHogCMAFn7EAbAFYAHAHYAnGoOm9OgMw6tAGhABPRBsvF+a6wYBM-A-0uWepYGAL4h9qiYuAREZJQ0sGBULBgA8qJgOJgysgLCSCDiktJyCsoIKipabmo6-Co2Wip+-DoG9k4IWpp+Ae6W-N16KpZeYRHo2HiEYCTkVNRgshiZAKIQUgBiFHQA7nkKRVI5ZapergN6el46515GVdYdiN4GbjpGXiNGV2pan+MQJEpjFZsR6KRZFBGKwOFwcDxiIlktIodRkWAUpADgUjiV5AVyipWipiGZupYVCY1D5+F5ngg-jpiJ8DFo1OoDA13GNwkDJtEZiQIVCYWxONwSBA5DQcWIJMdSoTVG0yTodGoPAZKfwjP52o5EHVNIYvNd9M0zJZAcDBbERdDmOL4Yi6BlZJCoABhOgQMAABTQshoLF9AaDYHSS2xQkOCvxpy6lWIbS0Bm8JkM+ksDKZLK8bL0-S8NOCNoF01iGJSnqRSUxqKg6PrWIgcsK8ZOyq6aj0avTbU1Hg0KgZzVcrU+Xn+9Q+dPLUUrYOrjeI0uD1HbeK7oCJBj7xkafhMX28agZJeqHz0RhstTUD21WgXIKFxCWKxwnvWWx2uzrKKes2KIxvk8rFDuShGpY1RaKMRiHr4va9gyegPsQQRmiYVK+GYL52mCH6ZN+GwYNsexrjKm6xrinZKruqhaLBmr8PUvj6F4nGoeoxDEpYCFMVSowfPhS7CnQnqMKsOA4HQODEG6Syej6fqBhuoaqRGUbBm2NHgYqBIMV0-EproxLpoE7hWGOnFeGSxgaPwei6EYmaiaCczxLQDB0NJsk4FudGGVBFRpsQwRGGmgx6n4cH0oaFSVH21i6LqD5mtYejuW+DpSTJcmURugUQfRIX6MQfwcpqDxpUETwJSoXxqMQ04PjoSXspYtRhHyshhvABS2mJcYlcF5QALR2Al43TtoVJDD46ZfJS1p8kNHlxFQI0GYmNJjn8c21PuIzjuq2X2hJopOnCkrbQm3ZdXZNhsl1fzOSW1kJdYzKeK5VQqJh+7nWCuXXRKCIkCunp3ZB5RFq46ofOq6geDeo4JZqdlaEWt66l8jXfcD4mSWDLpSjKMOlUSzSwXS2qztVfy5jS2g43UnyVOcZ1rRWG2g7C4Ouu6ylhmpYCU2NiD8Zoz1wZq2NaB9OYYyz2O6gE3TtR8XVEwBDbQ7Ro2JtYT1pnLb2K7UyudIrFU3h8ZoamafhZTzi4bVDUJ6zWUIS7trGmS98vvVb+1GBhjUPtqer3KxOi657UCFeLhs7d2FmHe1ARmFr54NdqLUFrZnLBFUutEV+UI-mRf5+w9NgYZSNyBHB6rxTbcHhTY5wmDVMGrRM7tvhXJG-hRid10ZGjNUEjVWM533t4gaHh8aFgaOc+7XOXyzEVXpHkf+64p-p91T744VBEE7h0oEGpTZ0Dx2Sbhi9r4ozNLroN+XJk8hTBV51SRQGE7JiS9ErJjgnSRWC0bCu0Hq+C6JMf7yUUh6KEKlwzBj-uUKqKYgFQNAYrMcVI+yVFcqxfwFhAhf0uo6FByccHLyaC1JygRp5FkagaTo5CyFUj1KxO+gReRhCAA */
|
||||
id: 'featureTree',
|
||||
description: 'Workflows for interacting with the feature tree pane',
|
||||
states: {
|
||||
idle: {
|
||||
on: {
|
||||
goToKclSource: {
|
||||
target: 'goingToKclSource',
|
||||
actions: 'saveTargetSourceRange',
|
||||
},
|
||||
|
||||
selectOperation: {
|
||||
target: 'selecting',
|
||||
actions: 'saveTargetSourceRange',
|
||||
},
|
||||
|
||||
enterEditFlow: {
|
||||
target: 'enteringEditFlow',
|
||||
actions: 'saveTargetSourceRange',
|
||||
},
|
||||
|
||||
goToError: 'goingToError',
|
||||
},
|
||||
},
|
||||
|
||||
goingToKclSource: {
|
||||
states: {
|
||||
selecting: {
|
||||
on: {
|
||||
selected: {
|
||||
target: 'done',
|
||||
},
|
||||
},
|
||||
|
||||
entry: ['sendSelectionEvent'],
|
||||
},
|
||||
|
||||
done: {
|
||||
entry: ['clearTargetSourceRange'],
|
||||
always: '#featureTree.idle',
|
||||
},
|
||||
|
||||
openingCodePane: {
|
||||
on: {
|
||||
codePaneOpened: 'selecting',
|
||||
},
|
||||
|
||||
entry: 'openCodePane',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'openingCodePane',
|
||||
},
|
||||
|
||||
selecting: {
|
||||
states: {
|
||||
selecting: {
|
||||
on: {
|
||||
selected: 'done',
|
||||
},
|
||||
|
||||
entry: 'sendSelectionEvent',
|
||||
},
|
||||
|
||||
done: {
|
||||
always: '#featureTree.idle',
|
||||
entry: 'clearTargetSourceRange',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'selecting',
|
||||
},
|
||||
|
||||
enteringEditFlow: {
|
||||
states: {
|
||||
selecting: {
|
||||
on: {
|
||||
selected: 'done',
|
||||
},
|
||||
},
|
||||
|
||||
done: {
|
||||
always: '#featureTree.idle',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'selecting',
|
||||
entry: 'sendSelectionEvent',
|
||||
exit: ['clearTargetSourceRange', 'sendEditFlowStart'],
|
||||
},
|
||||
|
||||
goingToError: {
|
||||
states: {
|
||||
openingCodePane: {
|
||||
entry: 'openCodePane',
|
||||
|
||||
on: {
|
||||
codePaneOpened: 'done',
|
||||
},
|
||||
},
|
||||
|
||||
done: {
|
||||
entry: 'scrollToError',
|
||||
|
||||
always: '#featureTree.idle',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'openingCodePane',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'idle',
|
||||
})
|
Reference in New Issue
Block a user