egui: log errors

This commit is contained in:
Alain Emilia Anna Zscheile 2024-09-28 19:56:47 +02:00
parent 82574d2976
commit f4d7d5a5a5
4 changed files with 78 additions and 26 deletions

View File

@ -43,3 +43,13 @@ specctra-session-file = Specctra session file
title-error-messages = Error Messages title-error-messages = Error Messages
reset-error-messages = Reset Messages reset-error-messages = Reset Messages
discard-item = Discard discard-item = Discard
specctra-dsn-loader = Specctra DSN file loader
history-loader = History file loader
invoker = Invoker
error-file-load = unable to read file
error-file-specctra-dsn-parse = file failed to parse as Specctra DSN
error-file-history-parse = file failed to parse as History JSON
error-overlay-init = unable to initialize overlay
error-autorouter-init = unable to initialize autorouter

View File

@ -146,36 +146,75 @@ impl App {
fn update_state(&mut self) -> bool { fn update_state(&mut self) -> bool {
let mut content_file_receiver = FileReceiver::new(&self.content_channel.1); let mut content_file_receiver = FileReceiver::new(&self.content_channel.1);
if let Ok(bufread) = content_file_receiver.try_recv() { if let Some(input) = content_file_receiver.try_recv() {
let design = SpecctraDesign::load(bufread).unwrap(); match self.load_specctra_dsn(input) {
let board = design.make_board(); Ok(()) => {}
self.maybe_overlay = Some(Overlay::new(&board).unwrap()); Err(err) => {
self.maybe_layers = Some(Layers::new(&board)); self.error_dialog.push_error("specctra-dsn-loader", err);
self.maybe_design = Some(design); }
self.arc_mutex_maybe_invoker = Arc::new(Mutex::new(Some(Invoker::new( }
Autorouter::new(board).unwrap(),
))));
self.viewport.scheduled_zoom_to_fit = true;
} }
if let Some(invoker) = self.arc_mutex_maybe_invoker.lock().unwrap().as_mut() { if let Some(invoker) = self.arc_mutex_maybe_invoker.lock().unwrap().as_mut() {
let mut history_file_receiver = FileReceiver::new(&self.history_channel.1); let mut history_file_receiver = FileReceiver::new(&self.history_channel.1);
if let Ok(bufread) = history_file_receiver.try_recv() { if let Some(input) = history_file_receiver.try_recv() {
invoker.replay(serde_json::from_reader(bufread).unwrap()) let tr = &self.translator;
match input {
Ok(bufread) => match serde_json::from_reader(bufread) {
Ok(res) => invoker.replay(res),
Err(err) => {
self.error_dialog.push_error(
"history-loader",
format!("{}; {}", tr.text("error-file-history-parse"), err),
);
}
},
Err(err) => {
self.error_dialog.push_error(
"history-loader",
format!("{}; {}", tr.text("error-file-load"), err),
);
}
}
} }
if let Some(ref mut activity) = self.maybe_activity { if let Some(ref mut activity) = self.maybe_activity {
match activity.step(invoker) { return match activity.step(invoker) {
Ok(ActivityStatus::Running) => return true, Ok(ActivityStatus::Running) => true,
Ok(ActivityStatus::Finished(..)) => return false, Ok(ActivityStatus::Finished(..)) => false,
Err(err) => return false, Err(err) => {
} self.error_dialog.push_error("invoker", format!("{}", err));
false
}
};
} }
} }
false false
} }
fn load_specctra_dsn(
&mut self,
input: std::io::Result<std::io::BufReader<std::fs::File>>,
) -> Result<(), String> {
let tr = &self.translator;
let bufread = input.map_err(|err| format!("{}; {}", tr.text("error-file-load"), err))?;
let design = SpecctraDesign::load(bufread)
.map_err(|err| format!("{}; {}", tr.text("error-file-specctra-dsn-parse"), err))?;
let board = design.make_board();
let overlay = Overlay::new(&board)
.map_err(|err| format!("{}; {}", tr.text("error-overlay-init"), err))?;
let layers = Layers::new(&board);
let autorouter = Autorouter::new(board)
.map_err(|err| format!("{}; {}", tr.text("error-autorouter-init"), err))?;
self.maybe_overlay = Some(overlay);
self.maybe_layers = Some(layers);
self.maybe_design = Some(design);
self.arc_mutex_maybe_invoker = Arc::new(Mutex::new(Some(Invoker::new(autorouter))));
self.viewport.scheduled_zoom_to_fit = true;
Ok(())
}
} }
impl eframe::App for App { impl eframe::App for App {

View File

@ -6,8 +6,13 @@ use std::sync::Arc;
use crate::{translator::Translator, viewport::Viewport}; use crate::{translator::Translator, viewport::Viewport};
pub struct ErrorDialog { pub struct ErrorDialog {
pub messages: Vec<(&'static str, String)>, /// messages is a list of error messages to display.
pub window_open: bool, ///
/// first field is the emitting component (as a translator ID),
/// second field is the error message
messages: Vec<(&'static str, String)>,
window_open: bool,
} }
impl ErrorDialog { impl ErrorDialog {

View File

@ -1,5 +1,5 @@
use std::io::{BufReader, Cursor}; use std::io::{BufReader, Cursor};
use std::sync::mpsc::{Receiver, TryRecvError}; use std::sync::mpsc::Receiver;
pub struct FileReceiver<'a> { pub struct FileReceiver<'a> {
receiver: &'a Receiver<String>, receiver: &'a Receiver<String>,
@ -11,14 +11,12 @@ impl<'a> FileReceiver<'a> {
} }
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
pub fn try_recv(&mut self) -> Result<BufReader<std::fs::File>, TryRecvError> { pub fn try_recv(&mut self) -> Option<Result<BufReader<std::fs::File>, std::io::Error>> {
Ok(std::io::BufReader::new( Some(std::fs::File::open(self.receiver.try_recv().ok()?).map(std::io::BufReader::new))
std::fs::File::open(self.receiver.try_recv()?).unwrap(),
))
} }
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
pub fn try_recv(&mut self) -> Result<Cursor<Vec<u8>>, TryRecvError> { pub fn try_recv(&mut self) -> Option<Result<Cursor<Vec<u8>>, std::io::Error>> {
Ok(Cursor::new(self.receiver.try_recv()?.into())) Some(Ok(Cursor::new(self.receiver.try_recv().ok()?.into())))
} }
} }