diff --git a/src/main.rs b/src/main.rs index 4eab1c2..5efd5c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,15 @@ -use eframe::{App, CreationContext, NativeOptions, run_native}; +use eframe::{App, NativeOptions, run_native}; use egui::{Context, Key}; use egui_graphs::{DefaultGraphView, Graph, SettingsInteraction}; -use petgraph::prelude::{EdgeIndex, NodeIndex, StableGraph}; +use petgraph::prelude::{EdgeIndex, NodeIndex}; -pub struct BrainWave { - g: Graph, -} - -impl BrainWave { - fn new(_: &CreationContext<'_>) -> Self { - let g = generate_graph(); - Self { g: Graph::from(&g) } - } -} +mod r#static; +pub use r#static::BrainWave; impl App for BrainWave { fn update(&mut self, ctx: &Context, _: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { + // graph viewer ui.add( &mut DefaultGraphView::new(&mut self.g).with_interactions( &SettingsInteraction::new() @@ -27,7 +20,9 @@ impl App for BrainWave { .with_edge_selection_multi_enabled(true), ), ); + // input event handler ui.input(|input| { + // delete if input.key_pressed(Key::Delete) { handle_graph_delete(&mut self.g); } @@ -36,54 +31,39 @@ impl App for BrainWave { } } -fn generate_graph() -> StableGraph<(), ()> { - let mut g = StableGraph::new(); - - let a = g.add_node(()); - let b = g.add_node(()); - let c = g.add_node(()); - - g.add_edge(a, b, ()); - g.add_edge(b, c, ()); - - g -} - fn handle_graph_delete(graph: &mut Graph) { - enum EdgeOrNode { + enum EdgeOrNodeIndex { Edge(EdgeIndex), Node(NodeIndex), } - let mut to_remove = Vec::new(); - { - let snodes = graph.selected_nodes(); - let sedges = graph.selected_edges(); - if snodes.len() + sedges.len() != 0 { - for node in snodes { - to_remove.push(EdgeOrNode::Node(*node)); + graph + .selected_nodes() + .iter() + .copied() + .map(EdgeOrNodeIndex::Node) + .chain( + graph + .selected_edges() + .iter() + .copied() + .map(EdgeOrNodeIndex::Edge), + ) + .collect::>() + .into_iter() + .for_each(|e| match e { + EdgeOrNodeIndex::Node(node) => { + graph.remove_node(node); } - for edge in sedges { - to_remove.push(EdgeOrNode::Edge(*edge)); + EdgeOrNodeIndex::Edge(edge) => { + graph.remove_edge(edge); } - } - } - for e in to_remove { - match e { - EdgeOrNode::Edge(edge_index) => { - graph.remove_edge(edge_index); - } - EdgeOrNode::Node(node_index) => { - graph.remove_node(node_index); - } - } - } + }) } -fn main() { +fn main() -> eframe::Result { run_native( "basic", NativeOptions::default(), Box::new(|cc| Ok(Box::new(BrainWave::new(cc)))), ) - .unwrap(); }