Skip to content

Commit 1db5e89

Browse files
committed
switch to rootjs for graph painting
1 parent 7ac8913 commit 1db5e89

File tree

7 files changed

+58
-246
lines changed

7 files changed

+58
-246
lines changed

delta_q/Cargo.lock

-168
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

delta_q/Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ edition = "2021"
77
name = "editor-web"
88

99
[dependencies]
10-
charts-rs = { version = "0.3.17" }
1110
gloo-utils = { version = "0.2.0" }
1211
iter_tools = "0.21.0"
1312
js-sys = { version = "0.3.70" }
@@ -17,7 +16,7 @@ smallstr = { version = "0.3.0", features = ["std", "serde"] }
1716
tracing = "0.1.40"
1817
wasm-bindgen = { version = "0.2.93" }
1918
wasm-bindgen-futures = { version = "0.4.43" }
20-
web-sys = "0.3.70"
19+
web-sys = { version = "0.3.70", features = ["MessageEventInit"] }
2120
winnow = "0.6.20"
2221
yew = { version = "0.21.0", features = ["csr"] }
2322
yew-agent = "0.3.0"

delta_q/index.html

+31
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,35 @@
44
<link data-trunk rel="rust" data-bin="editor-web" data-type="main" data-weak-refs />
55
<link data-trunk rel="rust" data-bin="worker" data-type="worker" data-weak-refs />
66
</head>
7+
<body>
8+
<script type="module">
9+
import * as core from 'https://root.cern/js/7.7.4/modules/core.mjs';
10+
window.core = core;
11+
core.settings.HandleKeys = false;
12+
import * as draw from 'https://root.cern/js/7.7.4/modules/draw.mjs';
13+
window.draw = draw;
14+
import { cleanup } from 'https://root.cern/js/7.7.4/modules/base/ObjectPainter.mjs';
15+
window.cleanup = cleanup;
16+
17+
window.addEventListener('rootjs', (event) => {
18+
const { data } = event;
19+
if (data === null || typeof data !== 'object') {
20+
cleanup('output');
21+
} else {
22+
const { bins, values, max, name } = data;
23+
const hist = core.createHistogram('TH1F', bins.length);
24+
hist.fXaxis.fXbins = bins;
25+
for (const idx in values) {
26+
hist.setBinContent(parseInt(idx) + 1, values[idx]);
27+
}
28+
hist.fXaxis.fXmin = 0;
29+
hist.fXaxis.fXmax = max;
30+
hist.fTitle = name;
31+
console.log(hist);
32+
cleanup('output');
33+
draw.draw('output', hist, 'nostat minimum:0 maximum:1.1');
34+
}
35+
});
36+
</script>
37+
</body>
738
</html>

delta_q/src/bin/editor-web.rs

+21-14
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ macro_rules! cloned {
55
}};
66
}
77

8-
use delta_q::{cdf_to_svg, CalcCdf, DeltaQ, DeltaQComponent, DeltaQContext, EvaluationContext};
9-
use web_sys::HtmlInputElement;
8+
use delta_q::{CalcCdf, DeltaQ, DeltaQComponent, DeltaQContext, EvaluationContext};
9+
use gloo_utils::window;
10+
use js_sys::Reflect;
11+
use wasm_bindgen::JsValue;
12+
use web_sys::{HtmlInputElement, MessageEvent, MessageEventInit};
1013
use yew::{prelude::*, suspense::use_future_with};
1114
use yew_agent::{oneshot::OneshotProvider, prelude::use_oneshot_runner};
1215
use yew_hooks::use_local_storage;
@@ -15,6 +18,9 @@ use yew_hooks::use_local_storage;
1518
fn app_main() -> HtmlResult {
1619
let ctx_handle = use_local_storage::<EvaluationContext>("delta_q".to_owned());
1720
let ctx = use_reducer(cloned!(ctx_handle; move || (*ctx_handle).clone().unwrap_or_default()));
21+
if Some(&*ctx) != ctx_handle.as_ref() {
22+
ctx_handle.set((*ctx).clone());
23+
}
1824

1925
let selected = use_state::<Option<String>, _>(|| None);
2026
let select = cloned!(selected; Callback::from(move |n| selected.set(Some(n))));
@@ -23,21 +29,27 @@ fn app_main() -> HtmlResult {
2329
let epoch = use_state(|| 0);
2430

2531
let agent = use_oneshot_runner::<CalcCdf>();
26-
let cdf = use_future_with(
32+
use_future_with(
2733
(selected.clone(), epoch.clone()),
2834
cloned!(ctx; move |deps| async move {
2935
if let Some(name) = deps.0.as_deref() {
30-
agent.run((name.to_string(), (*ctx).clone())).await
31-
} else {
32-
Err("no name".to_owned())
36+
let cdf = agent.run((name.to_string(), (*ctx).clone())).await?;
37+
let data = js_sys::Object::new();
38+
Reflect::set(&data, &"bins".into(), &cdf.iter().map(|x| JsValue::from(x.0)).collect::<js_sys::Array>()).unwrap();
39+
Reflect::set(&data, &"values".into(), &cdf.iter().map(|x| JsValue::from(x.1)).collect::<js_sys::Array>()).unwrap();
40+
Reflect::set(&data, &"max".into(), &(cdf.width() * 1.2).max(0.1).into()).unwrap();
41+
Reflect::set(&data, &"name".into(), &name.into()).unwrap();
42+
let init = MessageEventInit::new();
43+
init.set_data(&data);
44+
let _ = window().dispatch_event(&*MessageEvent::new_with_event_init_dict("rootjs", &init).map_err(|e| format!("{e:?}"))?);
3345
}
46+
Ok::<_, String>(())
3447
}),
3548
)?;
3649

37-
let on_change = cloned!(ctx, epoch, ctx_handle;
50+
let on_change = cloned!(ctx, epoch;
3851
Callback::from(move |(name, dq): (String, Option<DeltaQ>)| {
3952
ctx.dispatch((name.clone(), dq.clone()));
40-
ctx_handle.set((*ctx).clone());
4153
epoch.set(*epoch + 1);
4254
})
4355
);
@@ -72,11 +84,6 @@ fn app_main() -> HtmlResult {
7284
let dq = selected.as_ref().and_then(|name| ctx.get(name));
7385
// web_sys::console::log_1(&JsValue::from_str(&format!("{dq:?}")));
7486

75-
let cdf = match &*cdf {
76-
Ok(cdf) => cdf_to_svg(cdf),
77-
Err(e) => html! { <p>{ "no CDF result: " }{ e }</p> },
78-
};
79-
8087
let add_on_change = on_change.reform(cloned!(selected; move |x: (String, Option<DeltaQ>)| {
8188
selected.set(Some(x.0.clone()));
8289
x
@@ -96,7 +103,6 @@ fn app_main() -> HtmlResult {
96103
<DeltaQComponent delta_q={dq.clone()} {on_change} />
97104
</ContextProvider<DeltaQContext>>
98105
</div>
99-
{ cdf }
100106
}
101107
</div>
102108
})
@@ -198,6 +204,7 @@ fn app() -> Html {
198204
html! {
199205
<div>
200206
<h1>{ "DeltaQ Editor" }</h1>
207+
<div id="output" style="width: 50%; height: 30%; border: 1px solid black;" />
201208
<Suspense fallback={waiting}>
202209
<OneshotProvider<CalcCdf> path="worker.js">
203210
<AppMain />

delta_q/src/cdf.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ impl CDF {
246246
CDFIterator {
247247
cdf: self.data.iter(),
248248
prev: (0.0, 0.0),
249-
first: true,
250-
last: true,
249+
first: false,
250+
last: false,
251251
}
252252
}
253253

delta_q/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ mod render;
1515
pub use agent::CalcCdf;
1616
pub use cdf::{CDFError, CompactionMode, CDF};
1717
pub use delta_q::{DeltaQ, EvaluationContext};
18-
pub use render::{cdf_to_svg, DeltaQComponent, DeltaQContext};
18+
pub use render::{DeltaQComponent, DeltaQContext};

0 commit comments

Comments
 (0)