From 633888809518f22355cff400d41761f3c5018b01 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Mon, 16 Sep 2024 19:38:51 +0300 Subject: [PATCH] M: allow single operand synthesis --- .../DlgCreateOperation/DlgCreateOperation.tsx | 2 +- .../EditorOssGraph/NodeContextMenu.tsx | 2 +- .../pages/OssPage/EditorOssGraph/OssFlow.tsx | 45 ++------------ .../EditorOssGraph/ToolbarOssGraph.tsx | 2 +- .../src/pages/OssPage/OssEditContext.tsx | 61 +++++++++++++++---- 5 files changed, 57 insertions(+), 55 deletions(-) diff --git a/rsconcept/frontend/src/dialogs/DlgCreateOperation/DlgCreateOperation.tsx b/rsconcept/frontend/src/dialogs/DlgCreateOperation/DlgCreateOperation.tsx index a1988cfa..d1f957aa 100644 --- a/rsconcept/frontend/src/dialogs/DlgCreateOperation/DlgCreateOperation.tsx +++ b/rsconcept/frontend/src/dialogs/DlgCreateOperation/DlgCreateOperation.tsx @@ -45,7 +45,7 @@ function DlgCreateOperation({ hideWindow, oss, onCreate, initialInputs }: DlgCre if (alias === '') { return false; } - if (activeTab === TabID.SYNTHESIS && inputs.length === 1) { + if (activeTab === TabID.SYNTHESIS && inputs.length === 0) { return false; } if (activeTab === TabID.INPUT && !attachedID) { diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx index 0e483f4e..2e6fd822 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx @@ -50,7 +50,7 @@ function NodeContextMenu({ } const argumentIDs = controller.schema.graph.expandInputs([operation.id]); - if (!argumentIDs || argumentIDs.length < 2) { + if (!argumentIDs || argumentIDs.length < 1) { return false; } diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx index eb71b74d..37593193 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx @@ -24,7 +24,7 @@ import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useOSS } from '@/context/OssContext'; import useLocalStorage from '@/hooks/useLocalStorage'; import { OssNode } from '@/models/miscellaneous'; -import { OperationID, OperationType } from '@/models/oss'; +import { OperationID } from '@/models/oss'; import { PARAMETER, storage } from '@/utils/constants'; import { errors } from '@/utils/labels'; @@ -132,48 +132,11 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) { return; } - let target = { x: 0, y: 0 }; const positions = getPositions(); - if (positions.length == 0) { - target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 }); - } else if (inputs.length <= 1) { - let inputsNodes = positions.filter(pos => - controller.schema!.items.find( - operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id - ) - ); - if (inputsNodes.length > 0) { - inputsNodes = positions; - } - const maxX = Math.max(...inputsNodes.map(node => node.position_x)); - const minY = Math.min(...inputsNodes.map(node => node.position_y)); - target.x = maxX + 180; - target.y = minY; - } else { - const inputsNodes = positions.filter(pos => inputs.includes(pos.id)); - const maxY = Math.max(...inputsNodes.map(node => node.position_y)); - const minX = Math.min(...inputsNodes.map(node => node.position_x)); - const maxX = Math.max(...inputsNodes.map(node => node.position_x)); - target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize; - target.y = maxY + 100; - } - - let flagIntersect = false; - do { - flagIntersect = positions.some( - position => - Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance && - Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance - ); - if (flagIntersect) { - target.x += PARAMETER.ossMinDistance; - target.y += PARAMETER.ossMinDistance; - } - } while (flagIntersect); - + const target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 }); controller.promptCreateOperation({ - x: target.x, - y: target.y, + defaultX: target.x, + defaultY: target.y, inputs: inputs, positions: positions, callback: () => flow.fitView({ duration: PARAMETER.zoomDuration }) diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/ToolbarOssGraph.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/ToolbarOssGraph.tsx index 63fd7e2e..70397b1a 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/ToolbarOssGraph.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/ToolbarOssGraph.tsx @@ -76,7 +76,7 @@ function ToolbarOssGraph({ } const argumentIDs = controller.schema.graph.expandInputs([selectedOperation.id]); - if (!argumentIDs || argumentIDs.length < 2) { + if (!argumentIDs || argumentIDs.length < 1) { return false; } diff --git a/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx b/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx index af0155eb..a1e96f72 100644 --- a/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx +++ b/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx @@ -36,8 +36,8 @@ import { errors, information } from '@/utils/labels'; import { RSTabID } from '../RSFormPage/RSTabs'; export interface ICreateOperationPrompt { - x: number; - y: number; + defaultX: number; + defaultY: number; inputs: OperationID[]; positions: IOperationPosition[]; callback: (newID: OperationID) => void; @@ -221,19 +221,58 @@ export const OssEditState = ({ selected, setSelected, children }: OssEditStatePr [model] ); - const promptCreateOperation = useCallback(({ x, y, inputs, positions, callback }: ICreateOperationPrompt) => { - setInsertPosition({ x: x, y: y }); - setInitialInputs(inputs); - setPositions(positions); - setCreateCallback(() => callback); - setShowCreateOperation(true); - }, []); + const promptCreateOperation = useCallback( + ({ defaultX, defaultY, inputs, positions, callback }: ICreateOperationPrompt) => { + setInsertPosition({ x: defaultX, y: defaultY }); + setInitialInputs(inputs); + setPositions(positions); + setCreateCallback(() => callback); + setShowCreateOperation(true); + }, + [] + ); const handleCreateOperation = useCallback( (data: IOperationCreateData) => { + const target = insertPosition; + if (data.item_data.operation_type === OperationType.INPUT) { + let inputsNodes = positions.filter(pos => + model.schema!.items.find( + operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id + ) + ); + if (inputsNodes.length > 0) { + inputsNodes = positions; + } + const maxX = Math.max(...inputsNodes.map(node => node.position_x)); + const minY = Math.min(...inputsNodes.map(node => node.position_y)); + target.x = maxX + PARAMETER.ossDistanceX; + target.y = minY; + } else { + const argNodes = positions.filter(pos => data.arguments!.includes(pos.id)); + const maxY = Math.max(...argNodes.map(node => node.position_y)); + const minX = Math.min(...argNodes.map(node => node.position_x)); + const maxX = Math.max(...argNodes.map(node => node.position_x)); + target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize; + target.y = maxY + PARAMETER.ossDistanceY; + } + + let flagIntersect = false; + do { + flagIntersect = positions.some( + position => + Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance && + Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance + ); + if (flagIntersect) { + target.x += PARAMETER.ossMinDistance; + target.y += PARAMETER.ossMinDistance; + } + } while (flagIntersect); + data.positions = positions; - data.item_data.position_x = insertPosition.x; - data.item_data.position_y = insertPosition.y; + data.item_data.position_x = target.x; + data.item_data.position_y = target.y; model.createOperation(data, operation => { toast.success(information.newOperation(operation.alias)); if (createCallback) {