UNPKG

@webwriter/flowchart

Version:

Create programming flowcharts with interactive tasks. Use standardized Elements such as loops and Branchings.

70 lines (54 loc) 2.96 kB
import { GraphNode } from "../../definitions/GraphNode"; import { Arrow } from "../../definitions/Arrow"; import { findLastGraphNode, removeOldConnection, isWithinCircle } from "../helper/utilities"; export function handleNodeDragStart( ctx: CanvasRenderingContext2D, x: number, y: number, graphNodes: GraphNode[], selectedArrow?: Arrow ) { const draggedNode = findLastGraphNode(ctx, graphNodes, x, y); let isDragging = false; let dragOffset: { x: number; y: number } | undefined; if (draggedNode && !selectedArrow) { isDragging = true; dragOffset = { x: x - draggedNode.x, y: y - draggedNode.y }; } return { draggedNode, isDragging, dragOffset }; } export function handleMultipleNodesDragStart( ctx: CanvasRenderingContext2D, x: number, y: number, selectedNodes: GraphNode[], selectedArrow?: Arrow ) { let draggedNodes: GraphNode[] = []; let isDragging = false; let dragOffset: { x: number; y: number } | undefined; const nodeUnderMouse = findLastGraphNode(ctx, selectedNodes, x, y); if (nodeUnderMouse && !selectedArrow) { isDragging = true; dragOffset = { x: x - nodeUnderMouse.x, y: y - nodeUnderMouse.y }; draggedNodes = selectedNodes; } return { draggedNodes, isDragging, dragOffset }; } export function handleArrowDragStart( ctx: CanvasRenderingContext2D, x: number, y: number, graphNodes: GraphNode[], selectedArrow: Arrow, handleAnchorClick: ( tempElement: GraphNode, tempAnchor: number) => void) { let arrowToMove: Arrow; let arrowStart: { node: GraphNode; anchor: number }; if (selectedArrow) { const { points } = selectedArrow; // Überprüfe ob einer der Ankerpunkte berührt wurde, wenn ja setze die Variablen zum ziehen. if (isWithinCircle(x, y, points[points.length - 1].x, points[points.length - 1].y, 5)) { let tempElement: GraphNode; let tempAnchor: number; const nearestElement = findLastGraphNode(ctx, graphNodes, x, y); // Bestimme das Startelement von dem der temporäre Pfeil gesetzt werden soll if (nearestElement) { tempElement = selectedArrow.from; for (let i = 0; i < tempElement.connections.length; i++) { if (tempElement.connections[i].connectedToId === nearestElement.id) { tempAnchor = tempElement.connections[i].anchor } } // Rufe handleAnchorClick auf um einen temporären Pfeil zu zeichnen. handleAnchorClick( tempElement, tempAnchor); // Lösche die alten Verbindungsinformationen innerhalb der Knoten und die Verbindung removeOldConnection(selectedArrow.from, selectedArrow.to); // Entferne den alte Verbindung arrowToMove = selectedArrow; arrowStart = { node: tempElement, anchor: tempAnchor }; } } } return { arrowToMove, arrowStart }; }