First draft of a feature tree pane (#4782)

This commit is contained in:
Frank Noirot
2024-12-20 16:19:59 -05:00
committed by GitHub
parent 1d06cc7845
commit c02e31a530
78 changed files with 1466 additions and 65 deletions

View 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',
})