ferrum_flow/graph/
store.rs1use 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 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 NodeOrderInsert { id: NodeId },
21 NodeOrderRemove { index: usize },
22
23 AddPort(Port),
25
26 RemovePort(PortId),
27
28 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 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 NodeOrderUpdate(Vec<NodeId>),
68
69 PortAdded(Port),
71 PortRemoved { id: PortId },
72
73 EdgeAdded(Edge),
75 EdgeRemoved { id: EdgeId },
76
77 RedrawRequested,
79
80 Batch(Vec<GraphChangeKind>),
81}