From 9da3dc9a2564d83a97799ed664a0a0cbaf72d22e Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 11 Oct 2023 12:37:43 +0100 Subject: [PATCH] Allow editing multiple models in model editor --- .../ql-vscode/src/common/interface-types.ts | 2 +- .../src/model-editor/model-editor-view.ts | 8 ++---- .../src/view/model-editor/LibraryRow.tsx | 2 +- .../src/view/model-editor/MethodRow.tsx | 25 +++++++++++++++---- .../src/view/model-editor/ModelEditor.tsx | 16 +++++++----- .../model-editor/ModeledMethodDataGrid.tsx | 2 +- .../view/model-editor/ModeledMethodsList.tsx | 2 +- 7 files changed, 36 insertions(+), 21 deletions(-) diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index 07937b5e6..c77cb021a 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -614,7 +614,7 @@ export type FromModelEditorMessage = | StopGeneratingMethodsFromLlmMessage | ModelDependencyMessage | HideModeledMethodsMessage - | SetModeledMethodMessage; + | SetMultipleModeledMethodsMessage; interface RevealInEditorMessage { t: "revealInModelEditor"; diff --git a/extensions/ql-vscode/src/model-editor/model-editor-view.ts b/extensions/ql-vscode/src/model-editor/model-editor-view.ts index a39f04980..4f8b4d40a 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-view.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-view.ts @@ -43,7 +43,6 @@ import { AutoModeler } from "./auto-modeler"; import { telemetryListener } from "../common/vscode/telemetry"; import { ModelingStore } from "./modeling-store"; import { ModelEditorViewTracker } from "./model-editor-view-tracker"; -import { convertFromLegacyModeledMethod } from "./shared/modeled-methods-legacy"; export class ModelEditorView extends AbstractWebview< ToModelEditorMessage, @@ -309,11 +308,8 @@ export class ModelEditorView extends AbstractWebview< "model-editor-hide-modeled-methods", ); break; - case "setModeledMethod": { - this.setModeledMethods( - msg.method.signature, - convertFromLegacyModeledMethod(msg.method), - ); + case "setMultipleModeledMethods": { + this.setModeledMethods(msg.methodSignature, msg.modeledMethods); break; } case "telemetry": diff --git a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx index 24614893a..def164463 100644 --- a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx @@ -77,7 +77,7 @@ export type LibraryRowProps = { viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; - onChange: (modeledMethod: ModeledMethod) => void; + onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; onSaveModelClick: (methodSignatures: string[]) => void; onGenerateFromLlmClick: ( dependencyName: string, diff --git a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx index fd0e6c646..9d8b1326a 100644 --- a/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/MethodRow.tsx @@ -68,7 +68,7 @@ export type MethodRowProps = { modelingInProgress: boolean; viewState: ModelEditorViewState; revealedMethodSignature: string | null; - onChange: (modeledMethod: ModeledMethod) => void; + onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; }; export const MethodRow = (props: MethodRowProps) => { @@ -113,6 +113,21 @@ const ModelableMethodRow = forwardRef( [modeledMethodsProp, viewState], ); + const modeledMethodChangedHandlers = useMemo( + () => + modeledMethods.map((_, index) => (modeledMethod: ModeledMethod) => { + const newModeledMethods = [...modeledMethods]; + newModeledMethods[index] = modeledMethod; + onChange( + method.signature, + newModeledMethods.filter( + (m): m is ModeledMethod => m !== undefined, + ), + ); + }), + [method, modeledMethods, onChange], + ); + const jumpToMethod = useCallback( () => sendJumpToMethodMessage(method), [method], @@ -164,7 +179,7 @@ const ModelableMethodRow = forwardRef( key={index} method={method} modeledMethod={modeledMethod} - onChange={onChange} + onChange={modeledMethodChangedHandlers[index]} /> ))} @@ -174,7 +189,7 @@ const ModelableMethodRow = forwardRef( key={index} method={method} modeledMethod={modeledMethod} - onChange={onChange} + onChange={modeledMethodChangedHandlers[index]} /> ))} @@ -184,7 +199,7 @@ const ModelableMethodRow = forwardRef( key={index} method={method} modeledMethod={modeledMethod} - onChange={onChange} + onChange={modeledMethodChangedHandlers[index]} /> ))} @@ -194,7 +209,7 @@ const ModelableMethodRow = forwardRef( key={index} method={method} modeledMethod={modeledMethod} - onChange={onChange} + onChange={modeledMethodChangedHandlers[index]} /> ))} diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index 413b00a5c..9820511a5 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -180,12 +180,16 @@ export function ModelEditor({ [methods], ); - const onChange = useCallback((model: ModeledMethod) => { - vscode.postMessage({ - t: "setModeledMethod", - method: model, - }); - }, []); + const onChange = useCallback( + (methodSignature: string, modeledMethods: ModeledMethod[]) => { + vscode.postMessage({ + t: "setMultipleModeledMethods", + methodSignature, + modeledMethods, + }); + }, + [], + ); const onRefreshClick = useCallback(() => { vscode.postMessage({ diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx index 55719be96..4bb0bc4a1 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx @@ -24,7 +24,7 @@ export type ModeledMethodDataGridProps = { viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; - onChange: (modeledMethod: ModeledMethod) => void; + onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; }; export const ModeledMethodDataGrid = ({ diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx index 21bd5e061..18a49442b 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx @@ -19,7 +19,7 @@ export type ModeledMethodsListProps = { revealedMethodSignature: string | null; viewState: ModelEditorViewState; hideModeledMethods: boolean; - onChange: (modeledMethod: ModeledMethod) => void; + onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void; onSaveModelClick: (methodSignatures: string[]) => void; onGenerateFromLlmClick: ( packageName: string,