diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index 7a447ad..73f4d65 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -12,7 +12,10 @@ use petgraph::{ use spade::InsertionError; use crate::{ - autorouter::ratsnest::{Ratsnest, RatsnestVertexIndex}, + autorouter::{ + ratsnest::{Ratsnest, RatsnestVertexIndex}, + selection::Selection, + }, drawing::{ dot::FixedDotIndex, graph::{GetLayer, GetMaybeNet}, @@ -122,11 +125,7 @@ impl Autorouter { Ok(Self { layout, ratsnest }) } - pub fn autoroute( - &mut self, - selection: &HashSet, - observer: &mut impl RouterObserverTrait, - ) { + pub fn autoroute(&mut self, selection: &Selection, observer: &mut impl RouterObserverTrait) { if let Some(mut autoroute) = self.autoroute_walk(selection) { while autoroute.next(self, observer) { // @@ -134,7 +133,7 @@ impl Autorouter { } } - pub fn autoroute_walk(&mut self, selection: &HashSet) -> Option { + pub fn autoroute_walk(&mut self, selection: &Selection) -> Option { Autoroute::new( self.ratsnest .graph() diff --git a/src/autorouter/mod.rs b/src/autorouter/mod.rs index d9f3b2f..001b399 100644 --- a/src/autorouter/mod.rs +++ b/src/autorouter/mod.rs @@ -1,4 +1,5 @@ mod autorouter; pub mod ratsnest; +pub mod selection; pub use autorouter::*; diff --git a/src/autorouter/selection.rs b/src/autorouter/selection.rs new file mode 100644 index 0000000..5f6bcc7 --- /dev/null +++ b/src/autorouter/selection.rs @@ -0,0 +1,26 @@ +use std::collections::HashSet; + +use crate::layout::NodeIndex; + +#[derive(Debug, Clone)] +pub struct Selection { + set: HashSet, +} + +impl Selection { + pub fn new() -> Selection { + Self { + set: HashSet::new(), + } + } + + pub fn toggle_at_node(&mut self, node: NodeIndex) { + if !self.set.insert(node) { + self.set.remove(&node); + } + } + + pub fn contains(&self, node: &NodeIndex) -> bool { + self.set.contains(node) + } +} diff --git a/src/bin/topola-egui/overlay.rs b/src/bin/topola-egui/overlay.rs index c0c2ce4..4eb4f36 100644 --- a/src/bin/topola-egui/overlay.rs +++ b/src/bin/topola-egui/overlay.rs @@ -5,7 +5,7 @@ use rstar::AABB; use spade::InsertionError; use topola::{ - autorouter::ratsnest::Ratsnest, + autorouter::{ratsnest::Ratsnest, selection::Selection}, drawing::{ graph::{GetLayer, MakePrimitive}, primitive::MakePrimitiveShape, @@ -20,7 +20,7 @@ use topola::{ pub struct Overlay { ratsnest: Ratsnest, - selection: HashSet, + selection: Selection, active_layer: u64, } @@ -28,7 +28,7 @@ impl Overlay { pub fn new(layout: &Layout) -> Result { Ok(Self { ratsnest: Ratsnest::new(layout)?, - selection: HashSet::new(), + selection: Selection::new(), active_layer: 0, }) } @@ -73,23 +73,17 @@ impl Overlay { }; if shape.contains_point(p) { - self.toggle_selection(node); + self.selection.toggle_at_node(node); return true; } false } - pub fn toggle_selection(&mut self, node: NodeIndex) { - if !self.selection.insert(node) { - self.selection.remove(&node); - } - } - pub fn ratsnest(&self) -> &Ratsnest { &self.ratsnest } - pub fn selection(&self) -> &HashSet { + pub fn selection(&self) -> &Selection { &self.selection } }