Interactive Editing
This document describes the interactive editing system that enables users to modify nodes and lines in the graph through direct manipulation. The editing system provides visual controllers for resizing nodes, repositioning elements, adjusting line paths, and editing text labels.
For information about user interaction events (clicking, dragging, expanding/collapsing), see User Interaction & Events. For layout and positioning algorithms, see Layout System.
Editing System Architecture
The editing system is implemented in RelationGraphWith91Editing and consists of four specialized controllers that manage different aspects of interactive editing:
- editingController: Node selection, multi-node bounding box, and resize operations
- editingLineController: Line vertex manipulation, control points, and text editing
- nodeConnectController: Connection target highlighting during line creation
- editingReferenceLine: Alignment guides with optional snapping during node drag
Diagram: Editing System Components and Data Flow
graph TB
subgraph "Core Implementation"
With91Editing["RelationGraphWith91Editing
packages/.../RelationGraphWith91Editing.ts"]
With7Event["RelationGraphWith7Event
packages/.../RelationGraphWith7Event.ts"]
end
subgraph "Four Editing Controllers"
editingController["options.editingController
nodes: RGNode[]
show, x, y, width, height"]
editingLineController["options.editingLineController
line: RGLine | null
startPoint, endPoint
ctrlPoint1, ctrlPoint2
line44Splits: RGCtrlPointForLine44[]
line49Points: RGPosition[]
text: {x, y, width, height}"]
nodeConnectController["options.nodeConnectController
node: RGLineTarget
show, x, y, width, height"]
editingReferenceLine["options.editingReferenceLine
show, directionV, directionH
v_x, v_y, v_height
h_x, h_y, h_width"]
end
subgraph "Public API Methods"
setEditingNodes["setEditingNodes(nodes)"]
addEditingNode["addEditingNode(node)"]
setEditingLine["setEditingLine(line)"]
onResizeStart["onResizeStart(type, e)"]
startMoveLineVertex["startMoveLineVertex(type, e, cb)"]
startMoveLine6CtrlPoint["startMoveLine6CtrlPoint(idx, e, cb)"]
startMoveLine44CtrlPoint["startMoveLine44CtrlPoint(split, e, cb)"]
end
subgraph "Internal Update Methods"
updateEditingControllerView["_updateEditingControllerView()"]
updateEditingLineView["_updateEditingLineView()"]
updateEditingConnectControllerView["_updateEditingConnectControllerView()"]
updateReferenceLineView["updateReferenceLineView(node, x, y, buff_x, buff_y)"]
end
With91Editing --> editingController
With91Editing --> editingLineController
With91Editing --> nodeConnectController
With91Editing --> editingReferenceLine
setEditingNodes --> updateEditingControllerView
addEditingNode --> updateEditingControllerView
setEditingLine --> updateEditingLineView
onResizeStart --> updateEditingControllerView
With7Event --> With91Editing
With7Event -.provides.-> startMoveLineVertex
With7Event -.provides.-> startMoveLine6CtrlPoint
editingController -.read by.-> updateEditingControllerView
editingLineController -.read by.-> updateEditingLineView
nodeConnectController -.read by.-> updateEditingConnectControllerView
editingReferenceLine -.read by.-> updateReferenceLineViewSources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:1-1087, packages/relation-graph-models/models/RelationGraphWith7Event.ts:36-1056
Node Selection and Editing
Selection State
The editing system maintains a collection of currently selected nodes in options.editingController.nodes. Nodes can be added or removed from the editing set programmatically or through user interaction.
graph LR
subgraph "Selection API"
setEditingNodes["setEditingNodes(nodes)
RelationGraphWith91Editing:36"]
addEditingNode["addEditingNode(node)
RelationGraphWith91Editing:52"]
removeEditingNode["removeEditingNode(node)
RelationGraphWith91Editing:66"]
toggleEditingNode["toggleEditingNode(node)
RelationGraphWith91Editing:76"]
end
subgraph "Internal State"
editingController["editingController
nodes: RGNode[]
show: boolean
x, y, width, height"]
end
subgraph "View Update"
updateView["_updateEditingControllerView()
RelationGraphWith91Editing:98
Calculate bounding box
Position overlay"]
end
setEditingNodes --> editingController
addEditingNode --> editingController
removeEditingNode --> editingController
toggleEditingNode --> editingController
editingController --> updateViewThe controller’s position and size are automatically calculated from the bounding box of all selected nodes, with an optional padding applied when multiple nodes are selected.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:36-92, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:98-133
Node Resizing
When nodes are selected, resize handles appear at eight positions around the editing controller defined by RGResizeHandlePosition type. Users drag these handles to resize selected nodes proportionally.
| Handle Position | Adjusts | Implementation Logic |
|---|---|---|
't' |
Y position, height | newY = startEventXy + buff_ynewHeight = startHeight * scale - buff_y |
'r' |
Width only | newWidth = startWidth * scale + buff_x |
'b' |
Height only | newHeight = startHeight * scale + buff_y |
'l' |
X position, width | newX = startEventXy + buff_xnewWidth = startWidth * scale - buff_x |
'tl' |
X, Y, width, height | Combines top and left logic |
'tr' |
Y, width, height | Combines top and right logic |
'bl' |
X, width, height | Combines bottom and left logic |
'br' |
Width, height | Combines bottom and right logic |
Diagram: Resize Operation Flow
graph TB
subgraph "Resize Method Calls"
onResizeStart["onResizeStart(type: RGResizeHandlePosition, e)
Line 150"]
setupListeners["Setup mousemove/mouseup listeners
_onResizing, _onResizeEnd"]
startRAF["Start requestAnimationFrame loop
_resizeDraggingTimer"]
onResizingRequest["onResizingRequest()
Line 204
Called each frame"]
applyResizeScale["_applyResizeScale(e)
Line 272
Calculate scale_x, scale_y
Update all selected nodes"]
emitBeforeResize["Emit RGEventNames.beforeNodeResize
Per node, can cancel"]
updateNodes["dataProvider.updateNode(id, {x, y, width, height})"]
onResizeEnd["onResizeEnd(e)
Line 327
Cancel RAF, cleanup listeners"]
end
subgraph "State Variables"
startPoint["_startPoint: {x, y}"]
startSize["_startSize: {x, y, width, height,
widthOnCanvas, heightOnCanvas}"]
nodeStartSizeMap["_nodeStartSizeMap
WeakMap<RGNode, size>"]
resizeType["_resizeType: RGResizeHandlePosition"]
resizeDraggingEvent["_resizeDraggingEvent: RGUserEvent"]
end
onResizeStart --> startPoint
onResizeStart --> startSize
onResizeStart --> nodeStartSizeMap
onResizeStart --> resizeType
onResizeStart --> setupListeners
onResizeStart --> startRAF
setupListeners --> resizeDraggingEvent
startRAF --> onResizingRequest
onResizingRequest --> applyResizeScale
applyResizeScale --> emitBeforeResize
emitBeforeResize --> updateNodes
onResizingRequest --> onResizingRequest
setupListeners --> onResizeEndThe resize system uses requestAnimationFrame for smooth rendering and stores initial node dimensions in _nodeStartSizeMap (WeakMap). Scale factors are computed independently for X and Y axes based on the resize handle type. The RGEventNames.beforeNodeResize event allows custom logic to modify or cancel individual node resizing.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:150-340
Node Dragging with Reference Lines
The dragging system provides visual alignment guides through editingReferenceLine state. When options.showReferenceLine is enabled, the system displays vertical and horizontal lines when the dragged node aligns with nearby nodes.
Diagram: Reference Line Calculation Flow
graph TB
subgraph "Drag Event Flow"
onNodeDragStart["onNodeDragStart(willMoveNode, e)
RelationGraphWith7Event:80"]
draggingCallback["draggingCallback()
Called each RAF tick"]
draggingSelectedNodes["draggingSelectedNodes(node, newX, newY, buff_x, buff_y)
RelationGraphWith91Editing:347"]
updateReferenceLineView["updateReferenceLineView(node, x, y, buff_x, buff_y)
RelationGraphWith91Editing:429
Returns: {showV, fixedX, showH, fixedY} | undefined"]
end
subgraph "Alignment Detection"
filterNearNodes["Filter nodes within 600px
Exclude dragging nodes
Sort by distance to draggedNode"]
checkAlignments["For each nearNode:
Check 6 alignments:
- XStart, XCenter, XEnd
- YStart, YCenter, YEnd
matchDistance: 5px"]
setLineState["Update options.editingReferenceLine:
directionV, directionH
v_x, v_y, v_height
h_x, h_y, h_width"]
applySnap["If options.referenceLineAdsorption:
Return fixedX, fixedY
to snap position"]
end
onNodeDragStart --> draggingCallback
draggingCallback --> draggingSelectedNodes
draggingSelectedNodes --> updateReferenceLineView
updateReferenceLineView --> filterNearNodes
filterNearNodes --> checkAlignments
checkAlignments --> setLineState
checkAlignments --> applySnap
applySnap --> draggingSelectedNodesAlignment Detection Logic:
| Alignment Type | Comparison | Reference Line Position |
|---|---|---|
| XStart | abs(draggedNode.x - node.x) < 5 |
Vertical line at node.x |
| XCenter | abs(draggedNode.centerX - node.centerX) < 5 |
Vertical line at node.centerX |
| XEnd | abs(draggedNode.endX - node.endX) < 5 |
Vertical line at node.endX |
| YStart | abs(draggedNode.y - node.y) < 5 |
Horizontal line at node.y |
| YCenter | abs(draggedNode.centerY - node.centerY) < 5 |
Horizontal line at node.centerY |
| YEnd | abs(draggedNode.endY - node.endY) < 5 |
Horizontal line at node.endY |
The system uses getNodeDistance() from RGGraphMath to sort candidate nodes by proximity. When options.referenceLineAdsorption is true, the returned fixedX and fixedY values override the dragged position to snap nodes to alignment.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:347-588, packages/relation-graph-models/models/RelationGraphWith7Event.ts:80-234, packages/relation-graph-models/utils/RGGraphMath.ts
Line Editing Components
Line Editing Controller Overview
The RGEditingLineController component provides interactive controls for modifying line properties. It displays draggable handles at line vertices, control points for curves, split points for orthogonal lines, and an editable text label.
graph TB
subgraph "Line Editing State"
EditingLine["editingLineController.line
RGLine object being edited"]
StartEnd["startPoint: x, y
endPoint: x, y"]
CtrlPoints["ctrlPoint1: x, y
ctrlPoint2: x, y
For lineShape 6"]
Splits["line44Splits[]
RGCtrlPointForLine44[]
For lineShape 44, 49"]
TextPos["text: x, y
Text label position"]
end
subgraph "Visual Elements"
StartDot["Start Vertex Handle
class: rg-line-ctrl-dot start-dot"]
EndDot["End Vertex Handle
class: rg-line-ctrl-dot end-dot"]
CtrlDot["Control Point Handles
class: rg-line-ctrl-dot ctrl-dot"]
SplitDot["Split Point Handles
class: rg-line-ctrl-dot ctrl-split"]
TextEditor["Text Editor
class: rg-line-ctrl-text
Double-click to edit"]
CtrlLines["SVG Guide Lines
Connect vertices to control points"]
end
EditingLine --> StartEnd
EditingLine --> CtrlPoints
EditingLine --> Splits
EditingLine --> TextPos
StartEnd --> StartDot
StartEnd --> EndDot
CtrlPoints --> CtrlDot
Splits --> SplitDot
TextPos --> TextEditor
CtrlPoints --> CtrlLinesThe controller’s visibility is controlled by editingLineController.show. When a line is set for editing using graphInstance.setEditingLine(line), the controller automatically positions all handles and updates the view.
Sources: packages/platforms/vue3/src/relation-graph/src/core4vue3/editing/RGEditingLineController.vue:1-198, packages/platforms/react/src/relation-graph/src/core4react/editing/RGEditingLineController.tsx:1-199
Vertex Manipulation
Line start and end vertices can be dragged to reconnect lines. The startMoveLineVertex() method implements vertex dragging with target detection.
Diagram: Vertex Drag and Drop Flow
graph TB
subgraph "Drag Initiation"
mousedown["User mousedown on vertex handle
.rg-line-ctrl-dot.start-dot
.rg-line-ctrl-dot.end-dot"]
startMoveLineVertex["startMoveLineVertex(type, e, callback)
type: 'start' | 'end'
Line 718"]
setupDrag["RGDragUtils.startDrag()
Setup mousemove/mouseup"]
end
subgraph "Dragging Loop"
updatePreviewLine["Update newLinkTemplate
fromNode or toNode position
Follow mouse cursor"]
detectTarget["Check event.target:
- isNode(element)?
- .rg-connect-target?
- Canvas point"]
showConnectCtrl["Show nodeConnectController
if hovering over node"]
end
subgraph "Drop Handling"
onLineVertexBeDropped["onLineVertexBeDropped(e)
Line 755"]
determineTarget["Determine drop target:
- RGNode
- RGConnectTarget (targetType, targetData)
- {x, y} canvas position"]
createLineJson["Create JsonLine:
from: fromNode.id | position
to: toNode.id | position
Copy line properties"]
invokeCallback["callback(fromNode, toNode, lineJson)
Or defaultLineVertexBeChangedHandler"]
end
mousedown --> startMoveLineVertex
startMoveLineVertex --> setupDrag
setupDrag --> updatePreviewLine
updatePreviewLine --> detectTarget
detectTarget --> showConnectCtrl
setupDrag --> onLineVertexBeDropped
onLineVertexBeDropped --> determineTarget
determineTarget --> createLineJson
createLineJson --> invokeCallbackTarget Type Determination:
// From RelationGraphWith91Editing.ts:755-820
if (isNode(targetElement)) {
// Node connection
toNode = targetElement as RGNode;
toNodeTargetType = RGInnerConnectTargetType.Node;
} else if (targetElement.closest('.rg-connect-target')) {
// Custom connect target
const targetData = connectTargetElement.dataset.targetData;
const targetType = connectTargetElement.dataset.targetType;
toNodeTargetType = targetType;
} else {
// Canvas point
const canvasXy = getCanvasXyByClientXy(clientXy);
toNode = canvasXy;
toNodeTargetType = RGInnerConnectTargetType.CanvasPoint;
}
The defaultLineVertexBeChangedHandler (line 1029) automatically removes the old line and adds the new line to the graph. Custom callbacks can override this behavior.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:718-900, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:1029-1087
Control Point Manipulation
For curve line shapes (lineShape = 6), two Bezier control points allow path adjustment. The startMoveLine6CtrlPoint() method handles control point dragging.
Diagram: Bezier Control Point Editing
graph TB
subgraph "Control Point State"
ctrlPoint1["editingLineController.ctrlPoint1
{x, y} on view coordinates"]
ctrlPoint2["editingLineController.ctrlPoint2
{x, y} on view coordinates"]
end
subgraph "Drag Method"
startMoveLine6CtrlPoint["startMoveLine6CtrlPoint(ctrlPointIndex, e, callback)
ctrlPointIndex: 1 | 2
Line 902"]
dragLoop["RGDragUtils.startDrag()
Update control point position"]
calcOffset["Calculate offset from default position
Relative to link junction points"]
storeInData["Store in line.data:
cp1_offsetX, cp1_offsetY
cp2_offsetX, cp2_offsetY"]
invokeCallback["callback(line, ctrlPointIndex)"]
end
subgraph "Path Regeneration"
updateLine["dataProvider.updateLine(line.id, {data})"]
createLineDrawInfo["createLineDrawInfo(link, line)
Reads control point offsets
Generates new SVG path"]
end
ctrlPoint1 -.user drags.-> startMoveLine6CtrlPoint
ctrlPoint2 -.user drags.-> startMoveLine6CtrlPoint
startMoveLine6CtrlPoint --> dragLoop
dragLoop --> calcOffset
calcOffset --> storeInData
storeInData --> invokeCallback
invokeCallback --> updateLine
updateLine --> createLineDrawInfoControl Point Storage Schema:
// Stored in line.data object
interface Line6CtrlData {
cp1_offsetX?: number; // Control point 1 X offset from default
cp1_offsetY?: number; // Control point 1 Y offset from default
cp2_offsetX?: number; // Control point 2 X offset from default
cp2_offsetY?: number; // Control point 2 Y offset from default
}
Default control point positions are calculated in generateLineForCurve() based on junction point directions. User offsets are applied on top of these defaults.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:902-953, packages/relation-graph-models/utils/line/generateLineForCurve.ts
Orthogonal Line Split Points
For orthogonal lines (lineShape 44 and 49), the system displays draggable split points at segment junctions. The startMoveLine44CtrlPoint() method implements split point manipulation.
Diagram: Orthogonal Line Split Point Editing
graph TB
subgraph "Split Point Data Structure"
RGCtrlPointForLine44["RGCtrlPointForLine44
pIndex: number (segment index)
optionName: string (fd/td/cx/cy/cp-N)
direction: 'v' | 'h'
x, y: number (view coordinates)
startDirection, endDirection
hide?: boolean"]
end
subgraph "Line 44 Split Types"
fd["'fd' - From Distance
Distance from start node"]
td["'td' - To Distance
Distance from end node"]
cx["'cx' - Center X
Vertical center line"]
cy["'cy' - Center Y
Horizontal center line"]
end
subgraph "Manipulation Flow"
startMoveLine44CtrlPoint["startMoveLine44CtrlPoint(split, e, callback)
Line 956"]
dragLogic["RGDragUtils.startDrag()
Constrain movement:
- Vertical: X only
- Horizontal: Y only"]
updateLinePoints["updateLinePoints(line, points)
From RGLinePath.ts
Recalculate path with new split position"]
storeData["Store in line.data.pathPoints
Array of RGPosition"]
invokeCallback["callback(line)
Update complete"]
end
RGCtrlPointForLine44 --> fd
RGCtrlPointForLine44 --> td
RGCtrlPointForLine44 --> cx
RGCtrlPointForLine44 --> cy
startMoveLine44CtrlPoint --> dragLogic
dragLogic --> updateLinePoints
updateLinePoints --> storeData
storeData --> invokeCallbackSplit Point Naming for 3-Segment Lines:
| Segment Count | Split Positions | optionName Values |
|---|---|---|
| 3 segments | 2 split points | Determined by topology: - Center line: 'cx' or 'cy'- Near start: 'fd'- Near end: 'td' |
| 4 segments | 3 split points | split[1] = 'fd'split[2] = 'td' |
| 5 segments | 4 split points | split[1] = 'fd'split[2] = 'cx' or 'cy'split[3] = 'td' |
The direction field constrains drag movement: vertical splits move horizontally (changing X), horizontal splits move vertically (changing Y). Updated paths are stored in line.data.pathPoints and used by generateLineFor49() for rendering.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:956-1013, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:615-796, packages/relation-graph-models/utils/line/RGLinePath.ts:33-47, packages/relation-graph-models/types.ts:710-722
Text Label Editing
Line text labels support drag repositioning and inline editing via double-click. The startMoveLineText() method handles text position dragging.
Diagram: Text Label Manipulation
graph TB
subgraph "Text Drag Flow"
startMoveLineText["startMoveLineText(e, callback)
Line 1015"]
dragLoop["RGDragUtils.startDrag()
Update text position"]
calcTextOffset["Calculate offset from default:
textOffset_x = dragX - defaultX
textOffset_y = dragY - defaultY"]
updateLineData["Store in line:
line.textOffsetX
line.textOffsetY"]
invokeCallback["callback(line)"]
end
subgraph "Text Edit Flow"
detectDoubleClick["Click detection
If clicks < 500ms apart:
Enter edit mode"]
showInput["Display input element
over text label"]
onTextChange["onLineTextChange(newText)
dataProvider.updateLine(id, {text})"]
hideInput["Exit edit mode
Hide input element"]
end
subgraph "Text Position Calculation"
defaultPos["Default position from
lineDrawInfo.textPosition
(center of path)"]
applyOffset["Applied offset:
finalX = defaultX + textOffsetX
finalY = defaultY + textOffsetY"]
viewCoords["Convert to view coordinates
editingLineController.text.x, .y"]
end
startMoveLineText --> dragLoop
dragLoop --> calcTextOffset
calcTextOffset --> updateLineData
updateLineData --> invokeCallback
detectDoubleClick --> showInput
showInput --> onTextChange
onTextChange --> hideInput
defaultPos --> applyOffset
applyOffset --> viewCoordsText Position Storage:
Text offsets are stored directly on the line object, not in line.data:
interface RGLine {
textOffsetX?: number; // Offset from default X position
textOffsetY?: number; // Offset from default Y position
text?: string; // Text content
}
The default text position is calculated in createLineDrawInfo() at the path midpoint. User-applied offsets are added to this default position during rendering.
Sources: packages/relation-graph-models/models/RelationGraphWith91Editing.ts:1015-1087, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:615-908
Interactive Line Creation
The line creation workflow allows users to interactively create connections by selecting source and target nodes. The startCreatingLinePlot() method initiates this mode.
Diagram: Line Creation State Machine
graph TB
subgraph "Initiation"
startCreatingLinePlot["startCreatingLinePlot(e, setting)
Line 487
Set options.creatingLinePlot = true"]
setupTemplate["Create newLineTemplate
from setting.template
Create newLinkTemplate"]
setFromNode["If setting.fromNode:
Set newLinkTemplate.fromNode
Skip step 1"]
addListeners["Add mousemove listener:
onMovingWhenCreatingLinePlot"]
end
subgraph "Step 1: Select From Node"
clickNode1["User clicks node
onNodeClickWhenCreatingLinePlot
Line 828"]
setFromNode1["Set newLinkTemplate.fromNode
Record _step1EventTime"]
end
subgraph "Step 2: Mouse Move"
onMovingWhenCreatingLinePlot["onMovingWhenCreatingLinePlot($event)
Line 580
Update toNode.x, toNode.y"]
detectHover["Detect hover target:
- isNode() → show nodeConnectController
- .rg-connect-target → parse targetType/Data
- else → canvas point"]
updateJunctionPoint["Update toJunctionPoint
based on hover element"]
updateTempLink["Update newLinkTemplate.toNode
Follow mouse position"]
end
subgraph "Step 3: Select To Target"
clickTarget["User clicks target
onNodeClickWhenCreatingLinePlot (node)
OR onCanvasClickWhenCreatingLinePlot (canvas)"]
onReadyToCreateLine["onReadyToCreateLine(fromNode, toNode)
Line 867"]
createLineJson["Create JsonLine from template
Set from/to based on isReverse"]
emitEvent["Emit RGEventNames.onLineBeCreated
{fromNode, toNode, lineJson}"]
callbackHandler["Call _onCreateLineCallback
OR listener.onLineBeCreated"]
stopCreatingLinePlot["stopCreatingLinePlot()
Line 553
Clean up state and listeners"]
end
startCreatingLinePlot --> setupTemplate
setupTemplate --> setFromNode
setFromNode --> addListeners
addListeners --> clickNode1
clickNode1 --> setFromNode1
setFromNode1 --> onMovingWhenCreatingLinePlot
onMovingWhenCreatingLinePlot --> detectHover
detectHover --> updateJunctionPoint
updateJunctionPoint --> updateTempLink
updateTempLink --> clickTarget
clickTarget --> onReadyToCreateLine
onReadyToCreateLine --> createLineJson
createLineJson --> emitEvent
emitEvent --> callbackHandler
callbackHandler --> stopCreatingLinePlotCreation Mode State:
// Key state properties during creation
interface CreatingLineState {
creatingLinePlot: boolean; // Mode active flag
newLineTemplate: RGLine; // Line appearance template
newLinkTemplate: { // Connection state
fromNode: RGLineTarget | null; // Source node/position
toNode: RGLineTarget; // Target (follows mouse)
toNodeObject: RGNode | null; // Final target node
};
nodeConnectController: { // Connection UI
show: boolean;
node: RGLineTarget;
x, y, width, height: number;
};
}
The nodeConnectController displays junction point handles when hovering over nodes. For custom connection targets, use the RGConnectTarget component with data-target-type and data-target-data attributes.
Sources: packages/relation-graph-models/models/RelationGraphWith7Event.ts:486-870, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:383-412
Editing State Persistence
Editing state is stored in the RGOptionsFull object and synchronized with the framework-specific data providers.
| State Property | Type | Purpose |
|---|---|---|
editingController.nodes |
RGNode[] |
Currently selected nodes for editing |
editingController.show |
boolean |
Whether the node editing controller is visible |
editingController.x, y, width, height |
number |
Position and size of the editing overlay |
editingLineController.line |
RGLine |
Currently edited line |
editingLineController.show |
boolean |
Whether the line editing controller is visible |
editingLineController.startPoint |
{x, y} |
Start vertex handle position on view |
editingLineController.endPoint |
{x, y} |
End vertex handle position on view |
editingLineController.ctrlPoint1 |
{x, y} |
First bezier control point position |
editingLineController.ctrlPoint2 |
{x, y} |
Second bezier control point position |
editingLineController.line44Splits |
RGCtrlPointForLine44[] |
Orthogonal line split points |
editingLineController.text |
{x, y} |
Text label position on view |
editingReferenceLine |
Object | Alignment guide configuration |
showReferenceLine |
boolean |
Whether to show reference lines during drag |
referenceLineAdsorption |
boolean |
Whether to snap to reference lines |
Updates to these properties trigger view updates through the reactive data provider system. The _updateEditingControllerView() and _updateEditingLineView() methods recalculate positions and sync the state with the UI components.
Sources: packages/relation-graph-models/types.ts:640-685, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:98-133, packages/relation-graph-models/models/RelationGraphWith91Editing.ts:615-700