use crate::types::connection::Connection;
use crate::types::edge::{EdgeAnchor, EdgeId};
use crate::types::node::NodeId;
#[derive(Debug, Default, Clone)]
pub struct FlowEvents {
pub connections_made: Vec<Connection>,
pub connection_started: Option<NodeId>,
pub connection_ended: bool,
pub nodes_drag_started: Vec<NodeId>,
pub nodes_dragged: Vec<(NodeId, egui::Pos2)>,
pub nodes_drag_stopped: Vec<NodeId>,
pub nodes_resized: Vec<(NodeId, f32, f32)>,
pub nodes_clicked: Vec<NodeId>,
pub edges_clicked: Vec<EdgeId>,
pub selection_changed: bool,
pub selected_nodes: Vec<NodeId>,
pub selected_edges: Vec<EdgeId>,
pub nodes_deleted: Vec<NodeId>,
pub edges_deleted: Vec<EdgeId>,
pub node_hovered: Option<NodeId>,
pub edge_hovered: Option<EdgeId>,
pub edge_anchors_changed: Vec<(EdgeId, Option<EdgeAnchor>, Option<EdgeAnchor>)>,
pub viewport_changed: bool,
}
impl FlowEvents {
pub fn is_empty(&self) -> bool {
self.connections_made.is_empty()
&& self.connection_started.is_none()
&& !self.connection_ended
&& self.nodes_drag_started.is_empty()
&& self.nodes_dragged.is_empty()
&& self.nodes_drag_stopped.is_empty()
&& self.nodes_resized.is_empty()
&& self.nodes_clicked.is_empty()
&& self.edges_clicked.is_empty()
&& !self.selection_changed
&& self.nodes_deleted.is_empty()
&& self.edges_deleted.is_empty()
&& self.node_hovered.is_none()
&& self.edge_hovered.is_none()
&& self.edge_anchors_changed.is_empty()
&& !self.viewport_changed
}
pub(crate) fn push_connection(&mut self, conn: Connection) {
self.connections_made.push(conn);
}
pub(crate) fn set_connection_started(&mut self, node_id: NodeId) {
self.connection_started = Some(node_id);
}
pub(crate) fn set_connection_ended(&mut self) {
self.connection_ended = true;
}
pub(crate) fn push_drag_start(&mut self, id: NodeId) {
if !self.nodes_drag_started.contains(&id) {
self.nodes_drag_started.push(id);
}
}
pub(crate) fn push_dragged(&mut self, id: NodeId, new_pos: egui::Pos2) {
if let Some(entry) = self.nodes_dragged.iter_mut().find(|(eid, _)| *eid == id) {
entry.1 = new_pos;
} else {
self.nodes_dragged.push((id, new_pos));
}
}
pub(crate) fn push_drag_stop(&mut self, id: NodeId) {
if !self.nodes_drag_stopped.contains(&id) {
self.nodes_drag_stopped.push(id);
}
}
pub(crate) fn push_resized(&mut self, id: NodeId, w: f32, h: f32) {
if let Some(entry) = self.nodes_resized.iter_mut().find(|(eid, ..)| *eid == id) {
entry.1 = w;
entry.2 = h;
} else {
self.nodes_resized.push((id, w, h));
}
}
pub(crate) fn push_node_click(&mut self, id: NodeId) {
if !self.nodes_clicked.contains(&id) {
self.nodes_clicked.push(id);
}
}
pub(crate) fn push_edge_click(&mut self, id: EdgeId) {
if !self.edges_clicked.contains(&id) {
self.edges_clicked.push(id);
}
}
pub(crate) fn set_selection_changed(
&mut self,
selected_nodes: Vec<NodeId>,
selected_edges: Vec<EdgeId>,
) {
self.selection_changed = true;
self.selected_nodes = selected_nodes;
self.selected_edges = selected_edges;
}
pub(crate) fn push_nodes_deleted(&mut self, ids: impl IntoIterator<Item = NodeId>) {
self.nodes_deleted.extend(ids);
}
pub(crate) fn push_edges_deleted(&mut self, ids: impl IntoIterator<Item = EdgeId>) {
self.edges_deleted.extend(ids);
}
pub(crate) fn set_node_hovered(&mut self, id: NodeId) {
self.node_hovered = Some(id);
}
pub(crate) fn set_edge_hovered(&mut self, id: EdgeId) {
self.edge_hovered = Some(id);
}
pub(crate) fn push_anchor_changed(
&mut self,
id: EdgeId,
source: Option<EdgeAnchor>,
target: Option<EdgeAnchor>,
) {
self.edge_anchors_changed.push((id, source, target));
}
pub(crate) fn set_viewport_changed(&mut self) {
self.viewport_changed = true;
}
}