mirror of https://codeberg.org/topola/topola.git
egui: log errors
This commit is contained in:
parent
82574d2976
commit
f4d7d5a5a5
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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())))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue