Skip to content

Commit 205ac27

Browse files
committed
feat: update event names and expand event types in extensions documentation, improve selection tracking logic, and enhance undo/redo operations
1 parent c00f5c9 commit 205ac27

1 file changed

Lines changed: 70 additions & 19 deletions

File tree

website/docs/concepts/extensions.md

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class LoggingExtension extends NodeFlowExtension {
124124
print('Node added: ${node.id}');
125125
case NodeMoved(:final node, :final previousPosition):
126126
print('Node ${node.id} moved from $previousPosition');
127-
case ConnectionCreated(:final connection):
127+
case ConnectionAdded(:final connection):
128128
print('Connection: ${connection.sourceNodeId} → ${connection.targetNodeId}');
129129
default:
130130
// Ignore other events
@@ -144,39 +144,92 @@ class LoggingExtension extends NodeFlowExtension {
144144

145145
### Event Types
146146

147-
Extensions receive all graph events:
147+
Extensions receive all graph events. The event system uses a sealed class hierarchy for exhaustive pattern matching:
148148

149149
```dart
150150
@override
151151
void onEvent(GraphEvent event) {
152152
switch (event) {
153-
// Node events
153+
// Node lifecycle events
154154
case NodeAdded(:final node): ...
155155
case NodeRemoved(:final node): ...
156156
case NodeMoved(:final node, :final previousPosition): ...
157157
case NodeResized(:final node, :final previousSize): ...
158158
case NodeDataChanged(:final node, :final previousData): ...
159-
case NodeSelected(:final nodeIds): ...
160-
case NodeDeselected(:final nodeIds): ...
159+
case NodeVisibilityChanged(:final node, :final wasVisible): ...
160+
case NodeZIndexChanged(:final node, :final previousZIndex): ...
161+
case NodeLockChanged(:final node, :final wasLocked): ...
162+
case NodeGroupChanged(:final node, :final previousGroupId, :final currentGroupId): ...
161163
162164
// Connection events
163-
case ConnectionCreated(:final connection): ...
165+
case ConnectionAdded(:final connection): ...
164166
case ConnectionRemoved(:final connection): ...
165-
case ConnectionSelected(:final connectionIds): ...
166-
case ConnectionDeselected(:final connectionIds): ...
167+
168+
// Selection events
169+
case SelectionChanged(:final selectedNodeIds, :final selectedConnectionIds): ...
167170
168171
// Viewport events
169-
case ViewportChanged(:final viewport): ...
172+
case ViewportChanged(:final viewport, :final previousViewport): ...
173+
174+
// Drag events (for tracking drag operations)
175+
case NodeDragStarted(:final nodeIds, :final startPosition): ...
176+
case NodeDragEnded(:final nodeIds, :final originalPositions): ...
177+
case ConnectionDragStarted(:final sourceNodeId, :final sourcePortId): ...
178+
case ConnectionDragEnded(:final wasConnected, :final connection): ...
179+
case ResizeStarted(:final nodeId, :final initialSize): ...
180+
case ResizeEnded(:final nodeId, :final initialSize, :final finalSize): ...
181+
182+
// Hover events
183+
case NodeHoverChanged(:final nodeId, :final isHovered): ...
184+
case ConnectionHoverChanged(:final connectionId, :final isHovered): ...
185+
case PortHoverChanged(:final nodeId, :final portId, :final isHovered): ...
186+
187+
// Lifecycle events
188+
case GraphCleared(:final previousNodeCount, :final previousConnectionCount): ...
189+
case GraphLoaded(:final nodeCount, :final connectionCount): ...
170190
171191
// Batch events (for undo/redo grouping)
172192
case BatchStarted(:final reason): ...
173193
case BatchEnded(): ...
174194
175-
default: break;
195+
// LOD (Level of Detail) events
196+
case LODLevelChanged(:final previousVisibility, :final currentVisibility): ...
176197
}
177198
}
178199
```
179200

201+
### Event Reference
202+
203+
| Category | Event | Key Properties | Purpose |
204+
|----------|-------|----------------|---------|
205+
| **Node** | `NodeAdded` | `node` | Node created |
206+
| | `NodeRemoved` | `node` | Node deleted |
207+
| | `NodeMoved` | `node`, `previousPosition` | Position changed |
208+
| | `NodeResized` | `node`, `previousSize` | Size changed |
209+
| | `NodeDataChanged` | `node`, `previousData` | Data payload changed |
210+
| | `NodeVisibilityChanged` | `node`, `wasVisible` | Visibility toggled |
211+
| | `NodeZIndexChanged` | `node`, `previousZIndex` | Layer order changed |
212+
| | `NodeLockChanged` | `node`, `wasLocked` | Lock state toggled |
213+
| | `NodeGroupChanged` | `node`, `previousGroupId`, `currentGroupId` | Group membership changed |
214+
| **Connection** | `ConnectionAdded` | `connection` | Connection created |
215+
| | `ConnectionRemoved` | `connection` | Connection deleted |
216+
| **Selection** | `SelectionChanged` | `selectedNodeIds`, `selectedConnectionIds`, `previousNodeIds`, `previousConnectionIds` | Selection state changed |
217+
| **Viewport** | `ViewportChanged` | `viewport`, `previousViewport` | Pan/zoom changed |
218+
| **Drag** | `NodeDragStarted` | `nodeIds`, `startPosition` | Drag operation began |
219+
| | `NodeDragEnded` | `nodeIds`, `originalPositions` | Drag operation ended |
220+
| | `ConnectionDragStarted` | `sourceNodeId`, `sourcePortId`, `isOutput` | Connection drag began |
221+
| | `ConnectionDragEnded` | `wasConnected`, `connection` | Connection drag ended |
222+
| | `ResizeStarted` | `nodeId`, `initialSize` | Resize operation began |
223+
| | `ResizeEnded` | `nodeId`, `initialSize`, `finalSize` | Resize operation ended |
224+
| **Hover** | `NodeHoverChanged` | `nodeId`, `isHovered` | Node hover state changed |
225+
| | `ConnectionHoverChanged` | `connectionId`, `isHovered` | Connection hover state changed |
226+
| | `PortHoverChanged` | `nodeId`, `portId`, `isHovered`, `isOutput` | Port hover state changed |
227+
| **Lifecycle** | `GraphCleared` | `previousNodeCount`, `previousConnectionCount` | Graph was cleared |
228+
| | `GraphLoaded` | `nodeCount`, `connectionCount` | Graph was loaded |
229+
| **Batch** | `BatchStarted` | `reason` | Batch operation began |
230+
| | `BatchEnded` || Batch operation ended |
231+
| **LOD** | `LODLevelChanged` | `previousVisibility`, `currentVisibility`, `normalizedZoom` | Detail level changed |
232+
180233
### Stateful Extensions
181234

182235
Most extensions maintain observable state using MobX:
@@ -209,14 +262,12 @@ class SelectionTrackerExtension extends NodeFlowExtension {
209262
@override
210263
void onEvent(GraphEvent event) {
211264
switch (event) {
212-
case NodeSelected(:final nodeIds):
213-
runInAction(() {
214-
_selectionCount.value += nodeIds.length;
215-
_lastSelectionTime.value = DateTime.now();
216-
});
217-
case NodeDeselected(:final nodeIds):
265+
case SelectionChanged(:final selectedNodeIds, :final previousNodeIds):
218266
runInAction(() {
219-
_selectionCount.value -= nodeIds.length;
267+
_selectionCount.value = selectedNodeIds.length;
268+
if (selectedNodeIds.length > previousNodeIds.length) {
269+
_lastSelectionTime.value = DateTime.now();
270+
}
220271
});
221272
default:
222273
break;
@@ -272,7 +323,7 @@ class UndoRedoExtension extends NodeFlowExtension {
272323
switch (event) {
273324
case NodeMoved():
274325
case NodeResized():
275-
case ConnectionCreated():
326+
case ConnectionAdded():
276327
case ConnectionRemoved():
277328
_undoStack.add(event);
278329
_redoStack.clear(); // Clear redo on new action
@@ -341,7 +392,7 @@ class AutoSaveExtension extends NodeFlowExtension {
341392
case NodeAdded():
342393
case NodeRemoved():
343394
case NodeMoved():
344-
case ConnectionCreated():
395+
case ConnectionAdded():
345396
case ConnectionRemoved():
346397
_scheduleSave();
347398
default:

0 commit comments

Comments
 (0)