diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 0db9ce7..8c45559 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -8,7 +8,7 @@ mod controls_panel; use controls_panel::ControlsPanel; mod waveform_panel; -use waveform_panel::WaveformPanel; +use waveform_panel::{PixiController, WaveformPanel}; mod header_panel; use header_panel::HeaderPanel; @@ -27,6 +27,7 @@ struct Store { selected_var_refs: MutableVec, hierarchy: Mutable>>, loaded_filename: Mutable>, + canvas_controller: Mutable>>>, } static STORE: Lazy = lazy::default(); @@ -45,6 +46,7 @@ fn root() -> impl Element { let selected_var_refs = STORE.selected_var_refs.clone(); let layout: Mutable = <_>::default(); let loaded_filename = STORE.loaded_filename.clone(); + let canvas_controller = STORE.canvas_controller.clone(); Column::new() .s(Height::fill()) .s(Scrollbars::y_and_clip_x()) @@ -69,13 +71,15 @@ fn root() -> impl Element { let hierarchy = hierarchy.clone(); let selected_var_refs = selected_var_refs.clone(); let loaded_filename = loaded_filename.clone(); + let canvas_controller = canvas_controller.clone(); map_ref!{ let layout = layout.signal(), let hierarchy_is_some = hierarchy.signal_ref(Option::is_some) => { - (*hierarchy_is_some && matches!(layout, Layout::Tree)).then(clone!((hierarchy, selected_var_refs, loaded_filename) move || WaveformPanel::new( + (*hierarchy_is_some && matches!(layout, Layout::Tree)).then(clone!((hierarchy, selected_var_refs, loaded_filename, canvas_controller) move || WaveformPanel::new( hierarchy.clone(), selected_var_refs.clone(), loaded_filename.clone(), + canvas_controller.clone(), ))) } } @@ -85,10 +89,11 @@ fn root() -> impl Element { map_ref!{ let layout = layout.signal(), let hierarchy_is_some = hierarchy.signal_ref(Option::is_some) => { - (*hierarchy_is_some && matches!(layout, Layout::Columns)).then(clone!((hierarchy, selected_var_refs, loaded_filename) move || WaveformPanel::new( + (*hierarchy_is_some && matches!(layout, Layout::Columns)).then(clone!((hierarchy, selected_var_refs, loaded_filename, canvas_controller) move || WaveformPanel::new( hierarchy.clone(), selected_var_refs.clone(), loaded_filename.clone(), + canvas_controller.clone(), ))) } } diff --git a/frontend/src/platform.rs b/frontend/src/platform.rs index ca5a818..20a7707 100644 --- a/frontend/src/platform.rs +++ b/frontend/src/platform.rs @@ -3,6 +3,8 @@ // NOTE: `FASTWAVE_PLATFORM` is set in `Makefile.toml` tasks and then in `build.rs` +use crate::STORE; + #[cfg(FASTWAVE_PLATFORM = "TAURI")] mod tauri; #[cfg(FASTWAVE_PLATFORM = "TAURI")] @@ -63,9 +65,23 @@ pub async fn unload_signal(signal_ref: wellen::SignalRef) { } pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { - platform::add_decoders(decoder_paths).await + let count = platform::add_decoders(decoder_paths).await; + if count > 0 { + redraw_all_timeline_rows().await; + } + count } pub async fn remove_all_decoders() -> RemovedDecodersCount { - platform::remove_all_decoders().await + let count = platform::remove_all_decoders().await; + if count > 0 { + redraw_all_timeline_rows().await; + } + count +} + +async fn redraw_all_timeline_rows() { + if let Some(controller) = STORE.canvas_controller.get_cloned().get_cloned() { + controller.redraw_all_rows().await + } } diff --git a/frontend/src/waveform_panel.rs b/frontend/src/waveform_panel.rs index ee6eb83..e2ce51f 100644 --- a/frontend/src/waveform_panel.rs +++ b/frontend/src/waveform_panel.rs @@ -4,7 +4,8 @@ use wellen::GetItem; use zoon::*; mod pixi_canvas; -use pixi_canvas::{PixiCanvas, PixiController}; +use pixi_canvas::PixiCanvas; +pub use pixi_canvas::PixiController; const ROW_HEIGHT: u32 = 40; const ROW_GAP: u32 = 4; @@ -14,7 +15,7 @@ pub struct WaveformPanel { selected_var_refs: MutableVec, hierarchy: Mutable>>, loaded_filename: Mutable>, - canvas_controller: Mutable>>, + canvas_controller: Mutable>>>, } impl WaveformPanel { @@ -22,12 +23,13 @@ impl WaveformPanel { hierarchy: Mutable>>, selected_var_refs: MutableVec, loaded_filename: Mutable>, + canvas_controller: Mutable>>>, ) -> impl Element { Self { selected_var_refs, hierarchy, loaded_filename, - canvas_controller: Mutable::new(Mutable::default().read_only()), + canvas_controller, } .root() } diff --git a/frontend/src/waveform_panel/pixi_canvas.rs b/frontend/src/waveform_panel/pixi_canvas.rs index ffc8806..cb74f6f 100644 --- a/frontend/src/waveform_panel/pixi_canvas.rs +++ b/frontend/src/waveform_panel/pixi_canvas.rs @@ -5,7 +5,7 @@ use zoon::*; pub struct PixiCanvas { raw_el: RawHtmlEl, - controller: ReadOnlyMutable>, + controller: Mutable>>, #[allow(dead_code)] width: ReadOnlyMutable, #[allow(dead_code)] @@ -32,7 +32,8 @@ impl HasIds for PixiCanvas {} impl PixiCanvas { pub fn new(row_height: u32, row_gap: u32) -> Self { - let controller: Mutable> = Mutable::new(None); + let controller: Mutable>> = + Mutable::new(None); let width = Mutable::new(0); let height = Mutable::new(0); let resize_task = Task::start_droppable( @@ -77,7 +78,7 @@ impl PixiCanvas { )); // -- // -- Self { - controller: controller.read_only(), + controller: controller.clone(), width: width.read_only(), height: height.read_only(), task_with_controller: task_with_controller.clone(), @@ -105,14 +106,14 @@ impl PixiCanvas { }) .after_insert(clone!((controller, timeline_getter) move |element| { Task::start(async move { - let pixi_controller = js_bridge::PixiController::new( + let pixi_controller = SendWrapper::new(js_bridge::PixiController::new( 1., width.get(), 0, row_height, row_gap, &timeline_getter - ); + )); pixi_controller.init(&element).await; controller.set(Some(pixi_controller)); }); @@ -131,7 +132,7 @@ impl PixiCanvas { pub fn task_with_controller + 'static>( self, - f: impl FnOnce(ReadOnlyMutable>) -> FUT, + f: impl FnOnce(Mutable>>) -> FUT, ) -> Self { self.task_with_controller .set(Some(Task::start_droppable(f(self.controller.clone())))); @@ -186,6 +187,8 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn destroy(this: &PixiController); + // -- FastWave-specific -- + #[wasm_bindgen(method)] pub fn get_timeline_zoom(this: &PixiController) -> f64; @@ -195,8 +198,6 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn get_timeline_viewport_x(this: &PixiController) -> i32; - // -- FastWave-specific -- - #[wasm_bindgen(method)] pub fn set_var_format(this: &PixiController, index: usize, var_format: JsValue); @@ -224,5 +225,8 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn clear_vars(this: &PixiController); + + #[wasm_bindgen(method)] + pub async fn redraw_all_rows(this: &PixiController); } } diff --git a/frontend/typescript/bundles/pixi_canvas.js b/frontend/typescript/bundles/pixi_canvas.js index 674bb70..607cf53 100644 --- a/frontend/typescript/bundles/pixi_canvas.js +++ b/frontend/typescript/bundles/pixi_canvas.js @@ -35265,6 +35265,8 @@ var PixiController = class { clear_vars() { this.var_signal_rows.slice().reverse().forEach((row) => row.destroy()); } + request_timeline_redraw() { + } }; var VarSignalRow = class { signal_ref_index; diff --git a/frontend/typescript/pixi_canvas/pixi_canvas.ts b/frontend/typescript/pixi_canvas/pixi_canvas.ts index 39b896d..ea1ea42 100644 --- a/frontend/typescript/pixi_canvas/pixi_canvas.ts +++ b/frontend/typescript/pixi_canvas/pixi_canvas.ts @@ -199,6 +199,10 @@ export class PixiController { clear_vars() { this.var_signal_rows.slice().reverse().forEach(row => row.destroy()); } + + request_timeline_redraw() { + + } } class VarSignalRow { diff --git a/src-tauri/src/component_manager.rs b/src-tauri/src/component_manager.rs index 1055f30..8d92458 100644 --- a/src-tauri/src/component_manager.rs +++ b/src-tauri/src/component_manager.rs @@ -59,10 +59,25 @@ pub async fn remove_all_decoders() -> RemovedDecodersCount { // @TODO Remove / improve comments below // Testing +// +// Rust // FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm"]) // FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm", "../test_files/components/rust_decoder/rust_decoder.wasm"]) +// +// JS // FW.add_decoders(["../test_files/components/javascript_decoder/javascript_decoder.wasm"]) +// +// Python // FW.add_decoders(["../test_files/components/python_decoder/python_decoder.wasm"]) +// +// Remove all +// FW.remove_all_decoders() +// +// All Debug +// FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm", "../test_files/components/javascript_decoder/javascript_decoder.wasm", "../test_files/components/python_decoder/python_decoder.wasm"]) +// +// All Release +// FW.add_decoders(["../../test_files/components/rust_decoder/rust_decoder.wasm", "../../test_files/components/javascript_decoder/javascript_decoder.wasm", "../../test_files/components/python_decoder/python_decoder.wasm"]) pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { println!("decoders in Tauri: {decoder_paths:#?}"); println!("Current dir: {:#?}", std::env::current_dir().unwrap());