use serde::{Deserialize, Serialize};
use crate::core::{
Binding, BindingEndpoint, BindingId, CanvasPoint, CanvasRect, CanvasSize, Edge, EdgeId,
EdgeKind, EdgeReconnectable, GraphId, GraphImport, Group, GroupId, Node, NodeExtent, NodeId,
NodeKindKey, NodeOrigin, Port, PortId, StickyNote, StickyNoteId, Symbol, SymbolId,
};
use crate::types::TypeDesc;
use super::endpoints::EdgeEndpoints;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum GraphOp {
AddNode { id: NodeId, node: Node },
RemoveNode {
id: NodeId,
node: Node,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
ports: Vec<(PortId, Port)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
edges: Vec<(EdgeId, Edge)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
bindings: Vec<(BindingId, Binding)>,
},
SetNodePos {
id: NodeId,
from: CanvasPoint,
to: CanvasPoint,
},
SetNodeOrigin {
id: NodeId,
from: Option<NodeOrigin>,
to: Option<NodeOrigin>,
},
SetNodeKind {
id: NodeId,
from: NodeKindKey,
to: NodeKindKey,
},
SetNodeKindVersion { id: NodeId, from: u32, to: u32 },
SetNodeSelectable {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeFocusable {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeDraggable {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeConnectable {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeDeletable {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeParent {
id: NodeId,
from: Option<GroupId>,
to: Option<GroupId>,
},
SetNodeExtent {
id: NodeId,
from: Option<NodeExtent>,
to: Option<NodeExtent>,
},
SetNodeExpandParent {
id: NodeId,
from: Option<bool>,
to: Option<bool>,
},
SetNodeSize {
id: NodeId,
from: Option<CanvasSize>,
to: Option<CanvasSize>,
},
SetNodeHidden { id: NodeId, from: bool, to: bool },
SetNodeCollapsed { id: NodeId, from: bool, to: bool },
SetNodePorts {
id: NodeId,
from: Vec<PortId>,
to: Vec<PortId>,
},
SetNodeData {
id: NodeId,
from: serde_json::Value,
to: serde_json::Value,
},
AddPort { id: PortId, port: Port },
RemovePort {
id: PortId,
port: Port,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
edges: Vec<(EdgeId, Edge)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
bindings: Vec<(BindingId, Binding)>,
},
SetPortConnectable {
id: PortId,
from: Option<bool>,
to: Option<bool>,
},
SetPortConnectableStart {
id: PortId,
from: Option<bool>,
to: Option<bool>,
},
SetPortConnectableEnd {
id: PortId,
from: Option<bool>,
to: Option<bool>,
},
SetPortType {
id: PortId,
from: Option<TypeDesc>,
to: Option<TypeDesc>,
},
SetPortData {
id: PortId,
from: serde_json::Value,
to: serde_json::Value,
},
AddEdge { id: EdgeId, edge: Edge },
RemoveEdge {
id: EdgeId,
edge: Edge,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
bindings: Vec<(BindingId, Binding)>,
},
SetEdgeKind {
id: EdgeId,
from: EdgeKind,
to: EdgeKind,
},
SetEdgeSelectable {
id: EdgeId,
from: Option<bool>,
to: Option<bool>,
},
SetEdgeFocusable {
id: EdgeId,
from: Option<bool>,
to: Option<bool>,
},
SetEdgeHidden { id: EdgeId, from: bool, to: bool },
SetEdgeInteractionWidth {
id: EdgeId,
from: Option<f32>,
to: Option<f32>,
},
SetEdgeDeletable {
id: EdgeId,
from: Option<bool>,
to: Option<bool>,
},
SetEdgeReconnectable {
id: EdgeId,
from: Option<EdgeReconnectable>,
to: Option<EdgeReconnectable>,
},
SetEdgeEndpoints {
id: EdgeId,
from: EdgeEndpoints,
to: EdgeEndpoints,
},
AddImport { id: GraphId, import: GraphImport },
RemoveImport { id: GraphId, import: GraphImport },
SetImportAlias {
id: GraphId,
from: Option<String>,
to: Option<String>,
},
AddSymbol { id: SymbolId, symbol: Symbol },
RemoveSymbol { id: SymbolId, symbol: Symbol },
SetSymbolName {
id: SymbolId,
from: String,
to: String,
},
SetSymbolType {
id: SymbolId,
from: Option<TypeDesc>,
to: Option<TypeDesc>,
},
SetSymbolDefaultValue {
id: SymbolId,
from: Option<serde_json::Value>,
to: Option<serde_json::Value>,
},
SetSymbolMeta {
id: SymbolId,
from: serde_json::Value,
to: serde_json::Value,
},
AddGroup { id: GroupId, group: Group },
RemoveGroup {
id: GroupId,
group: Group,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
detached: Vec<(NodeId, Option<GroupId>)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
bindings: Vec<(BindingId, Binding)>,
},
SetGroupRect {
id: GroupId,
from: CanvasRect,
to: CanvasRect,
},
SetGroupTitle {
id: GroupId,
from: String,
to: String,
},
SetGroupColor {
id: GroupId,
from: Option<String>,
to: Option<String>,
},
AddStickyNote { id: StickyNoteId, note: StickyNote },
RemoveStickyNote {
id: StickyNoteId,
note: StickyNote,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
bindings: Vec<(BindingId, Binding)>,
},
SetStickyNoteText {
id: StickyNoteId,
from: String,
to: String,
},
SetStickyNoteRect {
id: StickyNoteId,
from: CanvasRect,
to: CanvasRect,
},
SetStickyNoteColor {
id: StickyNoteId,
from: Option<String>,
to: Option<String>,
},
AddBinding { id: BindingId, binding: Binding },
RemoveBinding { id: BindingId, binding: Binding },
SetBindingSubject {
id: BindingId,
from: BindingEndpoint,
to: BindingEndpoint,
},
SetBindingTarget {
id: BindingId,
from: BindingEndpoint,
to: BindingEndpoint,
},
SetBindingKind {
id: BindingId,
from: Option<String>,
to: Option<String>,
},
SetBindingMeta {
id: BindingId,
from: serde_json::Value,
to: serde_json::Value,
},
}