diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index ebd2938ab4..132583a586 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -163,6 +163,7 @@ Note that you may need to encode special characters like `[`(by `%5B`) and `]` ( To achieve that a new concept, `ProjectSemanticData` has been added along with a dedicated table to keep the information previously contained in `SemanticData` - https://github.com/eclipse-sirius/sirius-web/issues/4501[#4501] [browser] Extract the model browser into reusable modules - https://github.com/eclipse-sirius/sirius-web/issues/4514[#4514] [sirius-web] Added support for Ctrl+Shift+Z (Linux/macOS) to trigger redo in addition to Ctrl+Y (Windows) +- https://github.com/eclipse-sirius/sirius-web/issues/4206[#4206] [diagram] Improve performance of diagram viewport change == v2025.1.0 diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/core/useViewportZoom.ts b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/core/useViewportZoom.ts new file mode 100644 index 0000000000..00dd9367d5 --- /dev/null +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/core/useViewportZoom.ts @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2024 Obeo and others. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +import type { ReactFlowState } from '@xyflow/react'; +import { useStore } from '@xyflow/react'; +import { shallow } from 'zustand/shallow'; + +const viewportZoomSelector = (state: ReactFlowState) => state.transform[2]; + +export function useViewportZoom(): number { + return useStore(viewportZoomSelector, shallow); +} diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/edge/BendPoint.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/edge/BendPoint.tsx index 59fa814bd0..956ce19db5 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/edge/BendPoint.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/edge/BendPoint.tsx @@ -10,13 +10,13 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -import { useRef, RefObject } from 'react'; -import { useViewport } from '@xyflow/react'; +import { RefObject, useRef } from 'react'; import Draggable, { DraggableData } from 'react-draggable'; +import { useViewportZoom } from '../core/useViewportZoom'; import { BendPointProps, TemporaryBendPointProps } from './BendPoint.types'; export const BendPoint = ({ x, y, index, onDrag, onDragStop, onDoubleClick }: BendPointProps) => { - const { zoom } = useViewport(); + const zoom = useViewportZoom(); const nodeRef = useRef(null); return ( @@ -39,7 +39,7 @@ export const BendPoint = ({ x, y, index, onDrag, onDragStop, onDoubleClick }: Be }; export const TemporaryBendPoint = ({ x, y, index, onDrag, onDragStop }: TemporaryBendPointProps) => { - const { zoom } = useViewport(); + const zoom = useViewportZoom(); const nodeRef = useRef(null); return ( ): UseArrangeAllValue => { const { getNodes, getEdges, setNodes, setEdges } = useReactFlow, Edge>(); - const viewport = useViewport(); + const zoom = useViewportZoom(); const { layout } = useLayout(); const { synchronizeLayoutData } = useSynchronizeLayoutData(); const { diagramDescription } = useDiagramDescription(); @@ -140,7 +141,7 @@ export const useArrangeAll = (reactFlowWrapper: React.MutableRefObject ({ - labels: computeLabels(node, viewport.zoom, reactFlowWrapper), + labels: computeLabels(node, zoom, reactFlowWrapper), ...node, })), edges, @@ -182,11 +183,7 @@ export const useArrangeAll = (reactFlowWrapper: React.MutableRefObject[] = nodes .filter((node) => !node.data.isBorderNode) .map((node) => {