@@ -5,8 +5,11 @@ macro_rules! cloned {
5
5
} } ;
6
6
}
7
7
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 } ;
10
13
use yew:: { prelude:: * , suspense:: use_future_with} ;
11
14
use yew_agent:: { oneshot:: OneshotProvider , prelude:: use_oneshot_runner} ;
12
15
use yew_hooks:: use_local_storage;
@@ -15,6 +18,9 @@ use yew_hooks::use_local_storage;
15
18
fn app_main ( ) -> HtmlResult {
16
19
let ctx_handle = use_local_storage :: < EvaluationContext > ( "delta_q" . to_owned ( ) ) ;
17
20
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
+ }
18
24
19
25
let selected = use_state :: < Option < String > , _ > ( || None ) ;
20
26
let select = cloned ! ( selected; Callback :: from( move |n| selected. set( Some ( n) ) ) ) ;
@@ -23,21 +29,27 @@ fn app_main() -> HtmlResult {
23
29
let epoch = use_state ( || 0 ) ;
24
30
25
31
let agent = use_oneshot_runner :: < CalcCdf > ( ) ;
26
- let cdf = use_future_with (
32
+ use_future_with (
27
33
( selected. clone ( ) , epoch. clone ( ) ) ,
28
34
cloned ! ( ctx; move |deps| async move {
29
35
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:?}" ) ) ?) ;
33
45
}
46
+ Ok :: <_, String >( ( ) )
34
47
} ) ,
35
48
) ?;
36
49
37
- let on_change = cloned ! ( ctx, epoch, ctx_handle ;
50
+ let on_change = cloned ! ( ctx, epoch;
38
51
Callback :: from( move |( name, dq) : ( String , Option <DeltaQ >) | {
39
52
ctx. dispatch( ( name. clone( ) , dq. clone( ) ) ) ;
40
- ctx_handle. set( ( * ctx) . clone( ) ) ;
41
53
epoch. set( * epoch + 1 ) ;
42
54
} )
43
55
) ;
@@ -72,11 +84,6 @@ fn app_main() -> HtmlResult {
72
84
let dq = selected. as_ref ( ) . and_then ( |name| ctx. get ( name) ) ;
73
85
// web_sys::console::log_1(&JsValue::from_str(&format!("{dq:?}")));
74
86
75
- let cdf = match & * cdf {
76
- Ok ( cdf) => cdf_to_svg ( cdf) ,
77
- Err ( e) => html ! { <p>{ "no CDF result: " } { e } </p> } ,
78
- } ;
79
-
80
87
let add_on_change = on_change. reform ( cloned ! ( selected; move |x: ( String , Option <DeltaQ >) | {
81
88
selected. set( Some ( x. 0 . clone( ) ) ) ;
82
89
x
@@ -96,7 +103,6 @@ fn app_main() -> HtmlResult {
96
103
<DeltaQComponent delta_q={ dq. clone( ) } { on_change} />
97
104
</ContextProvider <DeltaQContext >>
98
105
</div>
99
- { cdf }
100
106
}
101
107
</div>
102
108
} )
@@ -198,6 +204,7 @@ fn app() -> Html {
198
204
html ! {
199
205
<div>
200
206
<h1>{ "DeltaQ Editor" } </h1>
207
+ <div id="output" style="width: 50%; height: 30%; border: 1px solid black;" />
201
208
<Suspense fallback={ waiting} >
202
209
<OneshotProvider <CalcCdf > path="worker.js" >
203
210
<AppMain />
0 commit comments