use shared::wellen_helpers; use std::sync::Mutex; use wellen::simple::Waveform; use zoon::*; #[derive(Default)] struct Store { waveform: Mutex>, } static STORE: Lazy = lazy::default(); pub(super) async fn show_window() {} pub(super) async fn pick_and_load_waveform( file: Option, ) -> Option { let file = file.unwrap_throw(); let content = gloo_file::futures::read_as_bytes(&file) .await .unwrap_throw(); let waveform = wellen_helpers::read_from_bytes(content); let Ok(waveform) = waveform else { panic!("Waveform file reading failed") }; *STORE.waveform.lock().unwrap_throw() = Some(waveform); Some(file.name()) } // @TODO Use this `pick_and_load_waveform` version once `showOpenFilePicker` is supported by Safari and Firefox // https://caniuse.com/mdn-api_window_showopenfilepicker // pub(super) async fn pick_and_load_waveform() -> Option { // let file_handles_promise = window().show_open_file_picker().expect_throw( // "failed to open file picker (browser has to support `showOpenFilePicker` and use HTTPS", // ); // let file_handles = JsFuture::from(file_handles_promise).await; // let file_handles = match file_handles { // Ok(file_handles) => file_handles.dyn_into::().unwrap_throw(), // Err(error) => { // println!("file picker error: {error:?}"); // return None; // } // }; // let file_handle = file_handles // .at(0) // .dyn_into::() // .unwrap_throw(); // let file = JsFuture::from(file_handle.get_file()) // .await // .unwrap_throw() // .dyn_into::() // .unwrap_throw(); // let file = gloo_file::File::from(file); // let content = gloo_file::futures::read_as_bytes(&file) // .await // .unwrap_throw(); // let waveform = wellen_helpers::read_from_bytes(content); // let Ok(waveform) = waveform else { // panic!("Waveform file reading failed") // }; // *STORE.waveform.lock().unwrap_throw() = Some(waveform); // Some(file.name()) // } pub(super) async fn get_hierarchy() -> wellen::Hierarchy { let waveform = STORE.waveform.lock().unwrap_throw(); let hierarchy = waveform.as_ref().unwrap_throw().hierarchy(); // @TODO Wrap `hierarchy` in `Waveform` with `Rc/Arc` or add the method `take` / `clone` or refactor? serde_json::from_value(serde_json::to_value(hierarchy).unwrap_throw()).unwrap_throw() } pub(super) async fn load_signal_and_get_timeline( signal_ref: wellen::SignalRef, timeline_width: u32, timeline_viewport_width: u32, timeline_viewport_x: u32, block_height: u32, var_format: shared::VarFormat, ) -> shared::Timeline { let mut waveform_lock = STORE.waveform.lock().unwrap(); let waveform = waveform_lock.as_mut().unwrap(); waveform.load_signals_multi_threaded(&[signal_ref]); let signal = waveform.get_signal(signal_ref).unwrap(); let time_table = waveform.time_table(); let timeline = shared::signal_to_timeline( signal, time_table, timeline_width, timeline_viewport_width, timeline_viewport_x, block_height, var_format, ); timeline } pub(super) async fn unload_signal(signal_ref: wellen::SignalRef) { let mut waveform_lock = STORE.waveform.lock().unwrap_throw(); let waveform = waveform_lock.as_mut().unwrap_throw(); waveform.unload_signals(&[signal_ref]); }