use liveplot::{
channel_plot, run_liveplot, EventController, EventFilter, EventKind, LivePlotConfig, PlotPoint,
};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
fn main() -> eframe::Result<()> {
let event_ctrl = EventController::new();
let rx = event_ctrl.subscribe(EventFilter::only(
EventKind::CLICK | EventKind::DOUBLE_CLICK,
));
std::thread::spawn(move || {
while let Ok(evt) = rx.recv() {
println!("[event] kind={}", evt.kinds);
if let Some(click) = &evt.click {
if let Some(pp) = &click.plot_pos {
println!(" plot position: ({:.4}, {:.4})", pp.x, pp.y);
}
if let Some(sp) = &click.screen_pos {
println!(" screen position: ({:.1}, {:.1})", sp.x, sp.y);
}
}
}
println!("[event] channel closed");
});
let (sink, data_rx) = channel_plot();
let trace = sink.create_trace("sine", Some("Sine Wave"));
std::thread::spawn(move || {
let dt = Duration::from_millis(1);
loop {
let t_s = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs_f64())
.unwrap_or(0.0);
let val = (2.0 * std::f64::consts::PI * 2.0 * t_s).sin();
let _ = sink.send_point(&trace, PlotPoint { x: t_s, y: val });
std::thread::sleep(dt);
}
});
let mut cfg = LivePlotConfig::default();
cfg.controllers.event = Some(event_ctrl);
run_liveplot(data_rx, cfg)
}