@@ -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
151151void 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
182235Most 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