mirror of https://codeberg.org/topola/topola.git
egui: put sender and receiver in wrapper objects
This commit is contained in:
parent
e9ba5cd9b3
commit
0745604658
|
|
@ -41,8 +41,8 @@ use topola::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
bottom::Bottom, layers::Layers, overlay::Overlay, painter::Painter, top::Top,
|
bottom::Bottom, file_receiver::FileReceiver, layers::Layers, overlay::Overlay,
|
||||||
viewport::Viewport,
|
painter::Painter, top::Top, viewport::Viewport,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Deserialize/Serialize is needed to persist app state between restarts.
|
/// Deserialize/Serialize is needed to persist app state between restarts.
|
||||||
|
|
@ -59,7 +59,7 @@ pub struct App {
|
||||||
maybe_execute: Option<ExecuteWithStatus>,
|
maybe_execute: Option<ExecuteWithStatus>,
|
||||||
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
text_channel: (Sender<String>, Receiver<String>),
|
content_channel: (Sender<String>, Receiver<String>),
|
||||||
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
viewport: Viewport,
|
viewport: Viewport,
|
||||||
|
|
@ -83,7 +83,7 @@ impl Default for App {
|
||||||
maybe_overlay: None,
|
maybe_overlay: None,
|
||||||
arc_mutex_maybe_invoker: Arc::new(Mutex::new(None)),
|
arc_mutex_maybe_invoker: Arc::new(Mutex::new(None)),
|
||||||
maybe_execute: None,
|
maybe_execute: None,
|
||||||
text_channel: channel(),
|
content_channel: channel(),
|
||||||
viewport: Viewport::new(),
|
viewport: Viewport::new(),
|
||||||
top: Top::new(),
|
top: Top::new(),
|
||||||
bottom: Bottom::new(),
|
bottom: Bottom::new(),
|
||||||
|
|
@ -113,29 +113,16 @@ impl App {
|
||||||
|
|
||||||
self.update_counter = 0.0;
|
self.update_counter = 0.0;
|
||||||
|
|
||||||
if cfg!(target_arch = "wasm32") {
|
let mut file_receiver = FileReceiver::new(&self.content_channel.1);
|
||||||
if let Ok(file_contents) = self.text_channel.1.try_recv() {
|
|
||||||
let design = SpecctraDesign::load(file_contents.as_bytes()).unwrap();
|
if let Ok(bufread) = file_receiver.try_recv() {
|
||||||
let board = design.make_board();
|
let design = SpecctraDesign::load(bufread).unwrap();
|
||||||
self.maybe_overlay = Some(Overlay::new(&board).unwrap());
|
let board = design.make_board();
|
||||||
self.maybe_layers = Some(Layers::new(&board));
|
self.maybe_overlay = Some(Overlay::new(&board).unwrap());
|
||||||
self.arc_mutex_maybe_invoker = Arc::new(Mutex::new(Some(Invoker::new(
|
self.maybe_layers = Some(Layers::new(&board));
|
||||||
Autorouter::new(board).unwrap(),
|
self.arc_mutex_maybe_invoker = Arc::new(Mutex::new(Some(Invoker::new(
|
||||||
))));
|
Autorouter::new(board).unwrap(),
|
||||||
}
|
))))
|
||||||
} else {
|
|
||||||
if let Ok(path) = self.text_channel.1.try_recv() {
|
|
||||||
let design = SpecctraDesign::load(&mut std::io::BufReader::new(
|
|
||||||
std::fs::File::open(path).unwrap(),
|
|
||||||
))
|
|
||||||
.unwrap();
|
|
||||||
let board = design.make_board();
|
|
||||||
self.maybe_overlay = Some(Overlay::new(&board).unwrap());
|
|
||||||
self.maybe_layers = Some(Layers::new(&board));
|
|
||||||
self.arc_mutex_maybe_invoker = Arc::new(Mutex::new(Some(Invoker::new(
|
|
||||||
Autorouter::new(board).unwrap(),
|
|
||||||
))));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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() {
|
||||||
|
|
@ -161,7 +148,7 @@ impl eframe::App for App {
|
||||||
|
|
||||||
self.top.update(
|
self.top.update(
|
||||||
ctx,
|
ctx,
|
||||||
self.text_channel.0.clone(),
|
self.content_channel.0.clone(),
|
||||||
self.arc_mutex_maybe_invoker.clone(),
|
self.arc_mutex_maybe_invoker.clone(),
|
||||||
&mut self.maybe_execute,
|
&mut self.maybe_execute,
|
||||||
&mut self.maybe_overlay,
|
&mut self.maybe_overlay,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
use std::io::BufReader;
|
||||||
|
use std::sync::mpsc::{Receiver, TryRecvError};
|
||||||
|
|
||||||
|
pub struct FileReceiver<'a> {
|
||||||
|
receiver: &'a Receiver<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> FileReceiver<'a> {
|
||||||
|
pub fn new(receiver: &'a Receiver<String>) -> Self {
|
||||||
|
Self { receiver }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
|
pub fn try_recv(&mut self) -> Result<BufReader<std::fs::File>, TryRecvError> {
|
||||||
|
Ok(std::io::BufReader::new(
|
||||||
|
std::fs::File::open(self.receiver.try_recv()?).unwrap(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
pub fn try_recv(&mut self) -> Result<&[u8], TryRecvError> {
|
||||||
|
self.receiver.try_recv().unwrap().as_bytes()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
use std::sync::mpsc::{SendError, Sender};
|
||||||
|
|
||||||
|
pub struct FileSender {
|
||||||
|
sender: Sender<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FileSender {
|
||||||
|
pub fn new(sender: Sender<String>) -> Self {
|
||||||
|
Self { sender }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn send(&self, file_handle: rfd::FileHandle) -> Result<(), SendError<String>> {
|
||||||
|
self.sender.send(self.handle_text(&file_handle).await)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
|
async fn handle_text(&self, file_handle: &rfd::FileHandle) -> String {
|
||||||
|
file_handle.path().to_str().unwrap().to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
async fn handle_text(&self, file_handle: &rfd::FileHandle) {
|
||||||
|
std::str::from_utf8(&file_handle.read().await)
|
||||||
|
.unwrap()
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
mod app;
|
mod app;
|
||||||
mod bottom;
|
mod bottom;
|
||||||
|
mod file_receiver;
|
||||||
|
mod file_sender;
|
||||||
mod layers;
|
mod layers;
|
||||||
mod overlay;
|
mod overlay;
|
||||||
mod painter;
|
mod painter;
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ use topola::{
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::{channel_text, execute},
|
app::{channel_text, execute},
|
||||||
|
file_sender::FileSender,
|
||||||
overlay::Overlay,
|
overlay::Overlay,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -47,7 +48,8 @@ impl Top {
|
||||||
|
|
||||||
execute(async move {
|
execute(async move {
|
||||||
if let Some(file_handle) = task.await {
|
if let Some(file_handle) = task.await {
|
||||||
sender.send(channel_text(file_handle).await);
|
let file_sender = FileSender::new(sender);
|
||||||
|
file_sender.send(file_handle).await;
|
||||||
ctx.request_repaint();
|
ctx.request_repaint();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue