egui: get rid of FileHandlerData

This commit is contained in:
Alain Emilia Anna Zscheile 2024-10-03 13:57:08 +02:00
parent 4fef94a5c5
commit d24acb601b
4 changed files with 20 additions and 70 deletions

View File

@ -1,6 +1,7 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{ use std::{
future::Future, future::Future,
io,
sync::{ sync::{
mpsc::{channel, Receiver, Sender}, mpsc::{channel, Receiver, Sender},
Arc, Mutex, Arc, Mutex,
@ -21,7 +22,6 @@ use crate::{
activity::{ActivityStatus, ActivityStepperWithStatus}, activity::{ActivityStatus, ActivityStepperWithStatus},
config::Config, config::Config,
error_dialog::ErrorDialog, error_dialog::ErrorDialog,
file_handler::FileHandlerData,
layers::Layers, layers::Layers,
menu_bar::MenuBar, menu_bar::MenuBar,
overlay::Overlay, overlay::Overlay,
@ -250,3 +250,13 @@ pub fn execute<F: Future<Output = ()> + Send + 'static>(f: F) {
pub fn execute<F: Future<Output = ()> + 'static>(f: F) { pub fn execute<F: Future<Output = ()> + 'static>(f: F) {
wasm_bindgen_futures::spawn_local(f); wasm_bindgen_futures::spawn_local(f);
} }
pub async fn handle_file(file_handle: &rfd::FileHandle) -> io::Result<impl io::BufRead + io::Seek> {
#[cfg(not(target_arch = "wasm32"))]
let res = io::BufReader::new(std::fs::File::open(file_handle.path())?);
#[cfg(target_arch = "wasm32")]
let res = io::Cursor::new(file_handle.read().await);
Ok(res)
}

View File

@ -1,61 +0,0 @@
use std::io;
use std::sync::mpsc::{SendError, Sender};
#[repr(transparent)]
pub enum FileHandlerData {
#[cfg(not(target_arch = "wasm32"))]
File(io::BufReader<std::fs::File>),
#[cfg(target_arch = "wasm32")]
Contents(io::Cursor<Vec<u8>>),
}
macro_rules! fhd_forward {
(match $self:expr => $fname:ident($($arg:expr,)*)) => {{
match $self {
#[cfg(not(target_arch = "wasm32"))]
FileHandlerData::File(brf) => brf.$fname($($arg,)*),
#[cfg(target_arch = "wasm32")]
FileHandlerData::Contents(curs) => curs.$fname($($arg,)*),
}
}};
(fn $fname:ident(&mut self $(,$arg:ident : $argty:ty)*)) => {
#[inline]
fn $fname(&mut self $(,$arg : $argty)*) {
fhd_forward!(match self => $fname($($arg,)*))
}
};
(fn $fname:ident(&mut self $(,$arg:ident : $argty:ty)*) -> $ret:ty) => {
#[inline]
fn $fname(&mut self $(,$arg : $argty)*) -> $ret {
fhd_forward!(match self => $fname($($arg,)*))
}
}
}
impl io::Read for FileHandlerData {
fhd_forward!(fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>);
fhd_forward!(fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize>);
fhd_forward!(fn read_vectored(&mut self, bufs: &mut [io::IoSliceMut<'_>]) -> io::Result<usize>);
}
impl io::BufRead for FileHandlerData {
fhd_forward!(fn fill_buf(&mut self) -> io::Result<&[u8]>);
fhd_forward!(fn consume(&mut self, amt: usize));
}
pub async fn handle_file<R, E, C>(file_handle: &rfd::FileHandle, callback: C) -> Result<R, E>
where
E: From<std::io::Error>,
C: FnOnce(FileHandlerData) -> Result<R, E>,
{
#[cfg(not(target_arch = "wasm32"))]
let res = FileHandlerData::File(io::BufReader::new(std::fs::File::open(file_handle.path())?));
#[cfg(target_arch = "wasm32")]
let res = FileHandlerData::Contents(io::Cursor::new(file_handle.read().await));
callback(res)
}

View File

@ -5,7 +5,6 @@ mod activity;
mod app; mod app;
mod config; mod config;
mod error_dialog; mod error_dialog;
mod file_handler;
mod layers; mod layers;
mod menu_bar; mod menu_bar;
mod overlay; mod overlay;

View File

@ -21,8 +21,7 @@ use topola::{
use crate::{ use crate::{
action::{Action, Switch, Trigger}, action::{Action, Switch, Trigger},
activity::{ActivityStatus, ActivityStepperWithStatus}, activity::{ActivityStatus, ActivityStepperWithStatus},
app::execute, app::{execute, handle_file},
file_handler::{handle_file, FileHandlerData},
overlay::Overlay, overlay::Overlay,
translator::Translator, translator::Translator,
viewport::Viewport, viewport::Viewport,
@ -243,9 +242,11 @@ impl MenuBar {
execute(async move { execute(async move {
if let Some(file_handle) = task.await { if let Some(file_handle) = task.await {
content_sender.send(handle_file(&file_handle, |data| { let data = handle_file(&file_handle)
SpecctraDesign::load(data) .await
}).await); .map_err(Into::into)
.and_then(SpecctraDesign::load);
content_sender.send(data);
ctx.request_repaint(); ctx.request_repaint();
} }
}); });
@ -284,13 +285,14 @@ impl MenuBar {
execute(async move { execute(async move {
if let Some(file_handle) = task.await { if let Some(file_handle) = task.await {
history_sender.send(handle_file(&file_handle, |data| { let data = handle_file(&file_handle).await.and_then(|data| {
match serde_json::from_reader(data) { match serde_json::from_reader(data) {
Ok(history) => Ok(Ok(history)), Ok(history) => Ok(Ok(history)),
Err(err) if err.is_io() => Err(err.into()), Err(err) if err.is_io() => Err(err.into()),
Err(err) => Ok(Err(err)), Err(err) => Ok(Err(err)),
} }
}).await); });
history_sender.send(data);
ctx.request_repaint(); ctx.request_repaint();
} }
}); });