mirror of https://codeberg.org/topola/topola.git
egui: store invoker in state instead of reconstructing it each time
This commit is contained in:
parent
7bcb3926d4
commit
8a3bf45fd8
|
|
@ -56,4 +56,8 @@ impl<R: RulesTrait> Invoker<R> {
|
||||||
pub fn redo(&mut self) {
|
pub fn redo(&mut self) {
|
||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn autorouter(&self) -> &Autorouter<R> {
|
||||||
|
&self.autorouter
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ pub struct App {
|
||||||
overlay: Option<Overlay>,
|
overlay: Option<Overlay>,
|
||||||
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
layout: Option<Arc<Mutex<Layout<DsnRules>>>>,
|
invoker: Option<Arc<Mutex<Invoker<DsnRules>>>>,
|
||||||
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
shared_data: Arc<Mutex<SharedData>>,
|
shared_data: Arc<Mutex<SharedData>>,
|
||||||
|
|
@ -74,7 +74,7 @@ impl Default for App {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
overlay: None,
|
overlay: None,
|
||||||
layout: None,
|
invoker: None,
|
||||||
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),
|
||||||
|
|
@ -157,14 +157,18 @@ impl eframe::App for App {
|
||||||
let design = DsnDesign::load_from_string(file_contents).unwrap();
|
let design = DsnDesign::load_from_string(file_contents).unwrap();
|
||||||
let layout = design.make_layout();
|
let layout = design.make_layout();
|
||||||
self.overlay = Some(Overlay::new(&layout).unwrap());
|
self.overlay = Some(Overlay::new(&layout).unwrap());
|
||||||
self.layout = Some(Arc::new(Mutex::new(layout)));
|
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||||
|
Autorouter::new(Arc::new(Mutex::new(layout))).unwrap(),
|
||||||
|
))));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if let Ok(path) = self.text_channel.1.try_recv() {
|
if let Ok(path) = self.text_channel.1.try_recv() {
|
||||||
let design = DsnDesign::load_from_file(&path).unwrap();
|
let design = DsnDesign::load_from_file(&path).unwrap();
|
||||||
let layout = design.make_layout();
|
let layout = design.make_layout();
|
||||||
self.overlay = Some(Overlay::new(&layout).unwrap());
|
self.overlay = Some(Overlay::new(&layout).unwrap());
|
||||||
self.layout = Some(Arc::new(Mutex::new(layout)));
|
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||||
|
Autorouter::new(Arc::new(Mutex::new(layout))).unwrap(),
|
||||||
|
))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -199,13 +203,14 @@ impl eframe::App for App {
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
|
||||||
if ui.button("Autoroute").clicked() {
|
if ui.button("Autoroute").clicked() {
|
||||||
if let (Some(layout_arc_mutex), Some(overlay)) = (&self.layout, &self.overlay) {
|
if let (Some(invoker_arc_mutex), Some(overlay)) = (&self.invoker, &self.overlay)
|
||||||
let layout = layout_arc_mutex.clone();
|
{
|
||||||
|
let invoker = invoker_arc_mutex.clone();
|
||||||
let shared_data_arc_mutex = self.shared_data.clone();
|
let shared_data_arc_mutex = self.shared_data.clone();
|
||||||
let selection = overlay.selection().clone();
|
let selection = overlay.selection().clone();
|
||||||
|
|
||||||
execute(async move {
|
execute(async move {
|
||||||
let mut invoker = Invoker::new(Autorouter::new(layout).unwrap());
|
let mut invoker = invoker.lock().unwrap();
|
||||||
let mut execute = invoker.execute_walk(&Command::Autoroute(selection));
|
let mut execute = invoker.execute_walk(&Command::Autoroute(selection));
|
||||||
|
|
||||||
if let Execute::Autoroute(ref mut autoroute) = execute {
|
if let Execute::Autoroute(ref mut autoroute) = execute {
|
||||||
|
|
@ -272,12 +277,14 @@ impl eframe::App for App {
|
||||||
let transform = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect);
|
let transform = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect);
|
||||||
let mut painter = Painter::new(ui, transform);
|
let mut painter = Painter::new(ui, transform);
|
||||||
|
|
||||||
if let Some(layout_arc_mutex) = &self.layout {
|
if let Some(invoker_arc_mutex) = &self.invoker {
|
||||||
if let (layout, shared_data, Some(overlay)) = (
|
if let (invoker, shared_data, Some(overlay)) = (
|
||||||
&layout_arc_mutex.lock().unwrap(),
|
&invoker_arc_mutex.lock().unwrap(),
|
||||||
self.shared_data.lock().unwrap(),
|
self.shared_data.lock().unwrap(),
|
||||||
&mut self.overlay,
|
&mut self.overlay,
|
||||||
) {
|
) {
|
||||||
|
let layout = &invoker.autorouter().layout().lock().unwrap();
|
||||||
|
|
||||||
if ctx.input(|i| i.pointer.any_click()) {
|
if ctx.input(|i| i.pointer.any_click()) {
|
||||||
overlay.click(
|
overlay.click(
|
||||||
layout,
|
layout,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue