Skip to main content

ferrum_flow/graph/
store.rs

1use gpui::{Pixels, Size};
2use serde::{Deserialize, Serialize};
3
4use crate::{Edge, EdgeId, Node, NodeId, Port, PortId};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub enum GraphOp {
8    // --- Node ---
9    AddNode(Node),
10
11    RemoveNode { id: NodeId },
12
13    MoveNode { id: NodeId, x: f32, y: f32 },
14
15    ResizeNode { id: NodeId, size: Size<Pixels> },
16
17    UpdateNodeData { id: NodeId, data: serde_json::Value },
18
19    // --- node_order ---
20    NodeOrderInsert { id: NodeId },
21    NodeOrderRemove { index: usize },
22
23    // --- Port ---
24    AddPort(Port),
25
26    RemovePort(PortId),
27
28    // --- Edge ---
29    AddEdge(Edge),
30
31    RemoveEdge(EdgeId),
32
33    Batch(Vec<GraphOp>),
34}
35
36#[derive(Debug, Clone)]
37pub struct GraphChange {
38    pub kind: GraphChangeKind,
39    pub source: ChangeSource,
40}
41
42impl GraphChange {
43    pub fn is_local(&self) -> bool {
44        matches!(self.source, ChangeSource::Local)
45    }
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
49pub enum ChangeSource {
50    Local,
51    Remote,
52    Undo,
53    Redo,
54}
55
56#[derive(Debug, Clone)]
57pub enum GraphChangeKind {
58    // --- Node ---
59    NodeAdded(Node),
60    NodeRemoved { id: NodeId },
61    NodeMoved { id: NodeId, x: f32, y: f32 },
62    NodeSetWidthed { id: NodeId, width: f32 },
63    NodeSetHeighted { id: NodeId, height: f32 },
64    NodeDataUpdated { id: NodeId, data: serde_json::Value },
65
66    // --- node_order ---
67    NodeOrderUpdate(Vec<NodeId>),
68
69    // --- Port ---
70    PortAdded(Port),
71    PortRemoved { id: PortId },
72
73    // --- Edge ---
74    EdgeAdded(Edge),
75    EdgeRemoved { id: EdgeId },
76
77    /// No graph mutation; used to request a frame repaint (e.g. after remote awareness updates).
78    RedrawRequested,
79
80    Batch(Vec<GraphChangeKind>),
81}