use eframe::egui;
use crate::data::data::LivePlotData;
use super::LivePlotPanel;
impl LivePlotPanel {
pub fn update(&mut self, ui: &mut egui::Ui) {
ui.push_id(self.panel_id, |ui| {
self.last_plot_size = ui.max_rect().size();
self.update_data();
self.liveplot_panel
.set_event_controller(self.event_ctrl.clone());
self.liveplot_panel
.set_total_widget_size(self.last_plot_size);
if let Some(ctrl) = &self.event_ctrl {
let cur_size = [self.last_plot_size.x, self.last_plot_size.y];
let size_changed = {
let inner = ctrl.inner.lock().unwrap();
inner.last_size.map_or(true, |prev| {
(prev[0] - cur_size[0]).abs() > 0.5 || (prev[1] - cur_size[1]).abs() > 0.5
})
};
if size_changed {
{
let mut inner = ctrl.inner.lock().unwrap();
inner.last_size = Some(cur_size);
}
let mut evt = crate::events::PlotEvent::new(crate::events::EventKind::RESIZE);
evt.resize = Some(crate::events::ResizeMeta {
width: cur_size[0],
height: cur_size[1],
});
ctrl.emit_filtered(evt);
}
}
if let Some(ctrl) = &self.event_ctrl {
let keys: Vec<(String, crate::events::KeyModifiers)> = ui.ctx().input(|i| {
i.events
.iter()
.filter_map(|e| match e {
egui::Event::Key {
key,
pressed: true,
modifiers,
..
} => Some((
format!("{:?}", key),
crate::events::KeyModifiers {
ctrl: modifiers.ctrl,
alt: modifiers.alt,
shift: modifiers.shift,
command: modifiers.command,
},
)),
_ => None,
})
.collect()
});
for (key, mods) in keys {
let mut evt =
crate::events::PlotEvent::new(crate::events::EventKind::KEY_PRESSED);
evt.key_press = Some(crate::events::KeyPressMeta {
key,
modifiers: mods,
});
ctrl.emit_filtered(evt);
}
}
if !self.compact {
self.render_menu(ui);
self.render_panels(ui);
}
let central_panel = egui::CentralPanel::default();
let central_panel = if self.compact {
central_panel.frame(egui::Frame::NONE)
} else {
central_panel
};
central_panel.show_inside(ui, |ui| {
use std::cell::RefCell;
let left = RefCell::new(std::mem::take(&mut self.left_side_panels));
let right = RefCell::new(std::mem::take(&mut self.right_side_panels));
let bottom = RefCell::new(std::mem::take(&mut self.bottom_panels));
let detached = RefCell::new(std::mem::take(&mut self.detached_panels));
let empty = RefCell::new(std::mem::take(&mut self.empty_panels));
let mut draw_overlays =
|plot_ui: &mut egui_plot::PlotUi,
scope: &crate::data::scope::ScopeData,
traces: &crate::data::traces::TracesCollection| {
for p in right
.borrow_mut()
.iter_mut()
.chain(left.borrow_mut().iter_mut())
.chain(bottom.borrow_mut().iter_mut())
.chain(detached.borrow_mut().iter_mut())
.chain(empty.borrow_mut().iter_mut())
{
p.draw(plot_ui, scope, traces);
}
if let Some(cb) = &mut self.overlays {
cb(plot_ui, scope, traces);
}
};
self.liveplot_panel
.render_panel(ui, &mut draw_overlays, &mut self.traces_data);
self.left_side_panels = left.into_inner();
self.right_side_panels = right.into_inner();
self.bottom_panels = bottom.into_inner();
self.detached_panels = detached.into_inner();
self.empty_panels = empty.into_inner();
self.traces_data.hover_trace = None;
});
});
}
pub fn update_embedded(&mut self, ui: &mut egui::Ui) {
self.update(ui);
self.apply_controllers_embedded(ui.ctx());
}
pub fn fit_all_bounds(&mut self) {
for scope in self.liveplot_panel.get_data_mut() {
scope.fit_bounds(&self.traces_data);
}
}
pub(crate) fn update_data(&mut self) {
let new_traces = self.traces_data.update();
if !new_traces.is_empty() {
if let Some(ctrl) = &self.event_ctrl {
let mut evt = crate::events::PlotEvent::new(crate::events::EventKind::DATA_UPDATED);
evt.data_update = Some(crate::events::DataUpdateMeta {
traces: new_traces.clone(),
new_point_count: 0,
});
ctrl.emit_filtered(evt);
}
}
self.apply_threshold_controller_requests();
self.liveplot_panel.update_data(&self.traces_data);
let data = &mut LivePlotData {
scope_data: self.liveplot_panel.get_data_mut(),
traces: &mut self.traces_data,
pending_requests: &mut self.pending_requests,
event_ctrl: self.event_ctrl.clone(),
};
if let Some(scope) = data.primary_scope_mut() {
for name in new_traces {
if !scope.trace_order.iter().any(|n| n == &name) {
scope.trace_order.push(name);
}
}
}
for p in &mut self.left_side_panels {
p.update_data(data);
}
for p in &mut self.right_side_panels {
p.update_data(data);
}
for p in &mut self.bottom_panels {
p.update_data(data);
}
for p in &mut self.detached_panels {
p.update_data(data);
}
for p in &mut self.empty_panels {
p.update_data(data);
}
self.publish_threshold_events();
}
}