request_timeline_redraw()
This commit is contained in:
parent
55f1b42ab0
commit
7015cc9ce6
|
@ -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<wellen::VarRef>,
|
||||
hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>,
|
||||
loaded_filename: Mutable<Option<Filename>>,
|
||||
canvas_controller: Mutable<Mutable<Option<SendWrapper<PixiController>>>>,
|
||||
}
|
||||
|
||||
static STORE: Lazy<Store> = lazy::default();
|
||||
|
@ -45,6 +46,7 @@ fn root() -> impl Element {
|
|||
let selected_var_refs = STORE.selected_var_refs.clone();
|
||||
let layout: Mutable<Layout> = <_>::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(),
|
||||
)))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<DecoderPath>) -> 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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<wellen::VarRef>,
|
||||
hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>,
|
||||
loaded_filename: Mutable<Option<Filename>>,
|
||||
canvas_controller: Mutable<ReadOnlyMutable<Option<PixiController>>>,
|
||||
canvas_controller: Mutable<Mutable<Option<SendWrapper<PixiController>>>>,
|
||||
}
|
||||
|
||||
impl WaveformPanel {
|
||||
|
@ -22,12 +23,13 @@ impl WaveformPanel {
|
|||
hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>,
|
||||
selected_var_refs: MutableVec<wellen::VarRef>,
|
||||
loaded_filename: Mutable<Option<Filename>>,
|
||||
canvas_controller: Mutable<Mutable<Option<SendWrapper<PixiController>>>>,
|
||||
) -> impl Element {
|
||||
Self {
|
||||
selected_var_refs,
|
||||
hierarchy,
|
||||
loaded_filename,
|
||||
canvas_controller: Mutable::new(Mutable::default().read_only()),
|
||||
canvas_controller,
|
||||
}
|
||||
.root()
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ use zoon::*;
|
|||
|
||||
pub struct PixiCanvas {
|
||||
raw_el: RawHtmlEl<web_sys::HtmlElement>,
|
||||
controller: ReadOnlyMutable<Option<js_bridge::PixiController>>,
|
||||
controller: Mutable<Option<SendWrapper<js_bridge::PixiController>>>,
|
||||
#[allow(dead_code)]
|
||||
width: ReadOnlyMutable<u32>,
|
||||
#[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<Option<js_bridge::PixiController>> = Mutable::new(None);
|
||||
let controller: Mutable<Option<SendWrapper<js_bridge::PixiController>>> =
|
||||
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<FUT: Future<Output = ()> + 'static>(
|
||||
self,
|
||||
f: impl FnOnce(ReadOnlyMutable<Option<js_bridge::PixiController>>) -> FUT,
|
||||
f: impl FnOnce(Mutable<Option<SendWrapper<js_bridge::PixiController>>>) -> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -199,6 +199,10 @@ export class PixiController {
|
|||
clear_vars() {
|
||||
this.var_signal_rows.slice().reverse().forEach(row => row.destroy());
|
||||
}
|
||||
|
||||
request_timeline_redraw() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class VarSignalRow {
|
||||
|
|
|
@ -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<DecoderPath>) -> AddedDecodersCount {
|
||||
println!("decoders in Tauri: {decoder_paths:#?}");
|
||||
println!("Current dir: {:#?}", std::env::current_dir().unwrap());
|
||||
|
|
Loading…
Reference in a new issue