egui: add button to modally invoke via placement

This commit is contained in:
Mikolaj Wielgus 2024-06-10 16:49:05 +02:00
parent b09ffad9b3
commit 6884ca6531
1 changed files with 37 additions and 8 deletions

View File

@ -30,7 +30,7 @@ use topola::{
shape::ShapeTrait, shape::ShapeTrait,
GenericNode, GenericNode,
}, },
layout::{zone::MakePolyShape, Layout}, layout::{via::ViaWeight, zone::MakePolyShape, Layout},
math::Circle, math::Circle,
router::{ router::{
draw::DrawException, draw::DrawException,
@ -71,6 +71,9 @@ pub struct App {
#[serde(skip)] #[serde(skip)]
from_rect: egui::emath::Rect, from_rect: egui::emath::Rect,
#[serde(skip)]
is_placing_via: bool,
#[serde(skip)] #[serde(skip)]
show_ratsnest: bool, show_ratsnest: bool,
} }
@ -83,6 +86,7 @@ impl Default for App {
shared_data: Default::default(), shared_data: Default::default(),
text_channel: channel(), text_channel: channel(),
from_rect: egui::Rect::from_x_y_ranges(0.0..=1000000.0, 0.0..=500000.0), from_rect: egui::Rect::from_x_y_ranges(0.0..=1000000.0, 0.0..=500000.0),
is_placing_via: false,
show_ratsnest: true, show_ratsnest: true,
} }
} }
@ -291,6 +295,10 @@ impl eframe::App for App {
} }
} }
ui.toggle_value(&mut self.is_placing_via, "Place Via");
ui.separator();
if ui.button("Undo").clicked() if ui.button("Undo").clicked()
|| ctx.input_mut(|i| i.consume_key(egui::Modifiers::CTRL, egui::Key::Z)) || ctx.input_mut(|i| i.consume_key(egui::Modifiers::CTRL, egui::Key::Z))
{ {
@ -355,6 +363,34 @@ impl eframe::App for App {
let mut painter = Painter::new(ui, transform); let mut painter = Painter::new(ui, transform);
if let Some(invoker_arc_mutex) = &self.invoker { if let Some(invoker_arc_mutex) = &self.invoker {
if ctx.input(|i| i.pointer.any_click()) {
if self.is_placing_via {
let invoker_arc_mutex = invoker_arc_mutex.clone();
execute(async move {
let mut invoker = invoker_arc_mutex.lock().unwrap();
invoker.execute(
Command::PlaceVia(ViaWeight {
from_layer: 0,
to_layer: 0,
circle: Circle {
pos: point! {x: latest_pos.x as f64, y: -latest_pos.y as f64},
r: 100.0,
},
maybe_net: None,
}),
&mut EmptyRouterObserver,
);
});
} else if let Some(overlay) = &mut self.overlay {
let invoker = invoker_arc_mutex.lock().unwrap();
overlay.click(
invoker.autorouter().board(),
point! {x: latest_pos.x as f64, y: -latest_pos.y as f64},
);
}
}
if let (invoker, shared_data, Some(overlay)) = ( if let (invoker, shared_data, Some(overlay)) = (
&invoker_arc_mutex.lock().unwrap(), &invoker_arc_mutex.lock().unwrap(),
self.shared_data.lock().unwrap(), self.shared_data.lock().unwrap(),
@ -362,13 +398,6 @@ impl eframe::App for App {
) { ) {
let board = invoker.autorouter().board(); let board = invoker.autorouter().board();
if ctx.input(|i| i.pointer.any_click()) {
overlay.click(
board,
point! {x: latest_pos.x as f64, y: -latest_pos.y as f64},
);
}
for primitive in board.layout().drawing().layer_primitive_nodes(1) { for primitive in board.layout().drawing().layer_primitive_nodes(1) {
let shape = primitive.primitive(board.layout().drawing()).shape(); let shape = primitive.primitive(board.layout().drawing()).shape();