From d74a06b2eab207e7f2632b38022b11aaede32365 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Mon, 22 Sep 2025 15:03:14 +0200 Subject: [PATCH] feat(topola-egui): Hide ratlines that were already routed --- crates/topola-egui/src/displayer.rs | 12 ++++++++++- crates/topola-egui/src/menu_bar.rs | 16 +++++++-------- crates/topola-egui/src/overlay.rs | 32 ++++++++++++----------------- crates/topola-egui/src/workspace.rs | 7 +++---- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/crates/topola-egui/src/displayer.rs b/crates/topola-egui/src/displayer.rs index 2de8292..6023894 100644 --- a/crates/topola-egui/src/displayer.rs +++ b/crates/topola-egui/src/displayer.rs @@ -162,8 +162,18 @@ impl<'a> Displayer<'a> { } fn display_ratsnest(&mut self) { - let graph = self.workspace.overlay.ratsnest().graph(); + let graph = self + .workspace + .interactor + .invoker() + .autorouter() + .ratsnest() + .graph(); for edge in graph.edge_references() { + if edge.weight().band_termseg.is_some() { + continue; + } + let from = graph.node_weight(edge.source()).unwrap().pos; let to = graph.node_weight(edge.target()).unwrap().pos; diff --git a/crates/topola-egui/src/menu_bar.rs b/crates/topola-egui/src/menu_bar.rs index f19d99e..db992d1 100644 --- a/crates/topola-egui/src/menu_bar.rs +++ b/crates/topola-egui/src/menu_bar.rs @@ -279,20 +279,20 @@ impl MenuBar { // NOTE: we need to check `unselect` first because `Ctrl+A` would also match `Ctrl+Shift+A` workspace.overlay.unselect_all(); } else if actions.edit.select_all.consume_key_triggered(ctx, ui) { - let board = workspace.interactor.invoker().autorouter().board(); - workspace - .overlay - .select_all(board, &workspace.appearance_panel); + workspace.overlay.select_all( + workspace.interactor.invoker().autorouter(), + &workspace.appearance_panel, + ); } else if actions .edit .recalculate_topo_navmesh .consume_key_triggered(ctx, ui) { if let Some(active_layer) = workspace.appearance_panel.active_layer { - let board = workspace.interactor.invoker().autorouter().board(); - workspace - .overlay - .recalculate_topo_navmesh(board, active_layer); + workspace.overlay.recalculate_topo_navmesh( + workspace.interactor.invoker().autorouter(), + active_layer, + ); } } else if actions.place.place_via.consume_key_enabled( ctx, diff --git a/crates/topola-egui/src/overlay.rs b/crates/topola-egui/src/overlay.rs index 38ce78e..7a7b53e 100644 --- a/crates/topola-egui/src/overlay.rs +++ b/crates/topola-egui/src/overlay.rs @@ -8,8 +8,8 @@ use spade::InsertionError; use topola::{ autorouter::{ - ratsnest::Ratsnest, selection::{BboxSelectionKind, Selection}, + Autorouter, }, board::{AccessMesadata, Board}, router::ng::{calculate_navmesh as ng_calculate_navmesh, PieNavmesh}, @@ -25,7 +25,6 @@ pub enum SelectionMode { } pub struct Overlay { - ratsnest: Ratsnest, pub selection: Selection, planar_incr_navmesh: Option, reselect_bbox: Option<(SelectionMode, Point)>, @@ -36,7 +35,6 @@ const INF: f64 = f64::INFINITY; impl Overlay { pub fn new(board: &Board) -> Result { Ok(Self { - ratsnest: Ratsnest::new(board.layout())?, selection: Selection::new(), planar_incr_navmesh: None, reselect_bbox: None, @@ -49,11 +47,11 @@ impl Overlay { pub fn select_all( &mut self, - board: &Board, + autorouter: &Autorouter, appearance_panel: &AppearancePanel, ) { self.select_all_in_bbox( - board, + autorouter.board(), appearance_panel, &AABB::from_corners([-INF, -INF], [INF, INF]), BboxSelectionKind::CompletelyInside, @@ -67,17 +65,17 @@ impl Overlay { pub fn recalculate_topo_navmesh( &mut self, - board: &Board, + autorouter: &Autorouter, active_layer: usize, ) { - if let Ok(pien) = ng_calculate_navmesh(board, active_layer) { + if let Ok(pien) = ng_calculate_navmesh(autorouter.board(), active_layer) { self.planar_incr_navmesh = Some(pien); } } pub fn drag_start( &mut self, - _board: &Board, + _autorouter: &Autorouter, _appearance_panel: &AppearancePanel, at: Point, ctrl: bool, @@ -98,7 +96,7 @@ impl Overlay { pub fn drag_stop( &mut self, - board: &Board, + autorouter: &Autorouter, appearance_panel: &AppearancePanel, at: Point, ) { @@ -109,14 +107,14 @@ impl Overlay { match selmode { SelectionMode::Substitution => { self.selection = Selection::new(); - self.select_all_in_bbox(board, appearance_panel, &aabb, bsk); + self.select_all_in_bbox(autorouter.board(), appearance_panel, &aabb, bsk); } SelectionMode::Addition => { - self.select_all_in_bbox(board, appearance_panel, &aabb, bsk); + self.select_all_in_bbox(autorouter.board(), appearance_panel, &aabb, bsk); } SelectionMode::Toggling => { let old_selection = self.take_selection(); - self.select_all_in_bbox(board, appearance_panel, &aabb, bsk); + self.select_all_in_bbox(autorouter.board(), appearance_panel, &aabb, bsk); self.selection ^= &old_selection; } } @@ -125,20 +123,20 @@ impl Overlay { pub fn click( &mut self, - board: &Board, + autorouter: &Autorouter, appearance_panel: &AppearancePanel, at: Point, ) { if self.reselect_bbox.is_some() { // handle bounding box selection (takes precendence over other interactions) // this is mostly in order to allow the user to recover from a missed/dropped drag_stop event - self.drag_stop(board, appearance_panel, at); + self.drag_stop(autorouter, appearance_panel, at); return; } let old_selection = self.take_selection(); self.select_all_in_bbox( - board, + autorouter.board(), appearance_panel, &AABB::from_point([at.x(), at.y()]), BboxSelectionKind::MerelyIntersects, @@ -157,10 +155,6 @@ impl Overlay { .select_all_in_bbox(board, aabb, &appearance_panel.visible[..], bsk); } - pub fn ratsnest(&self) -> &Ratsnest { - &self.ratsnest - } - pub fn selection(&self) -> &Selection { &self.selection } diff --git a/crates/topola-egui/src/workspace.rs b/crates/topola-egui/src/workspace.rs index 46eb66f..e6f1988 100644 --- a/crates/topola-egui/src/workspace.rs +++ b/crates/topola-egui/src/workspace.rs @@ -111,7 +111,6 @@ impl Workspace { } } } else { - let board = self.interactor.invoker().autorouter().board(); match interactive_event.kind { InteractiveEventKind::PointerPrimaryButtonClicked => { if menu_bar.is_placing_via { @@ -127,7 +126,7 @@ impl Workspace { })); } else { self.overlay.click( - board, + self.interactor.invoker().autorouter(), &self.appearance_panel, interactive_input.pointer_pos, ); @@ -135,7 +134,7 @@ impl Workspace { } InteractiveEventKind::PointerPrimaryButtonDragStarted => { self.overlay.drag_start( - board, + self.interactor.invoker().autorouter(), &self.appearance_panel, interactive_input.pointer_pos, interactive_event.ctrl, @@ -144,7 +143,7 @@ impl Workspace { } InteractiveEventKind::PointerPrimaryButtonDragStopped => { self.overlay.drag_stop( - board, + self.interactor.invoker().autorouter(), &self.appearance_panel, interactive_input.pointer_pos, );