1use crate::message::Message;
2use crate::view::{DrawConfig, DrawingContext};
3use crate::{SystemState, wave_data::WaveData};
4use egui::{Context, Frame, PointerButton, Sense, TopBottomPanel, Ui};
5use emath::{Align2, Pos2, Rect, RectTransform};
6use epaint::CornerRadiusF32;
7
8impl SystemState {
9 pub fn add_overview_panel(&self, ctx: &Context, waves: &WaveData, msgs: &mut Vec<Message>) {
10 TopBottomPanel::bottom("overview")
11 .frame(Frame {
12 fill: self.user.config.theme.primary_ui_color.background,
13 ..Default::default()
14 })
15 .show(ctx, |ui| {
16 self.draw_overview(ui, waves, msgs);
17 });
18 }
19
20 fn draw_overview(&self, ui: &mut Ui, waves: &WaveData, msgs: &mut Vec<Message>) {
21 let (response, mut painter) = ui.allocate_painter(ui.available_size(), Sense::drag());
22 let frame_size = response.rect.size();
23 let frame_width = frame_size.x;
24 let frame_height = frame_size.y;
25 let half_frame_height = frame_height * 0.5;
26 let cfg = DrawConfig::new(
27 frame_height,
28 self.user.config.layout.waveforms_line_height,
29 self.user.config.layout.waveforms_text_size,
30 );
31 let container_rect = Rect::from_min_size(Pos2::ZERO, frame_size);
32 let to_screen = RectTransform::from_to(container_rect, response.rect);
33
34 let mut ctx = DrawingContext {
35 painter: &mut painter,
36 cfg: &cfg,
37 to_screen: &|x, y| to_screen.transform_pos(Pos2::new(x, y)),
38 theme: &self.user.config.theme,
39 };
40
41 let num_timestamps = waves.safe_num_timestamps();
42 let viewport_all = waves.viewport_all();
43 let fill_color = self
44 .user
45 .config
46 .theme
47 .canvas_colors
48 .foreground
49 .gamma_multiply(0.3);
50 for vidx in 0..waves.viewports.len() {
51 let minx = viewport_all.pixel_from_absolute_time(
52 waves.viewports[vidx].curr_left.absolute(&num_timestamps),
53 frame_width,
54 &num_timestamps,
55 );
56 let maxx = viewport_all.pixel_from_absolute_time(
57 waves.viewports[vidx].curr_right.absolute(&num_timestamps),
58 frame_width,
59 &num_timestamps,
60 );
61 let min = (ctx.to_screen)(minx, 0.);
62 let max = (ctx.to_screen)(maxx, container_rect.max.y);
63 ctx.painter
64 .rect_filled(Rect { min, max }, CornerRadiusF32::ZERO, fill_color);
65 }
66
67 waves.draw_cursor(&self.user.config.theme, &mut ctx, frame_size, &viewport_all);
68
69 let mut ticks =
70 self.get_ticks_for_viewport(waves, &viewport_all, frame_width, ctx.cfg.text_size);
71
72 if ticks.len() >= 2 {
73 ticks.pop();
75 ticks.remove(0);
76 waves.draw_ticks(
78 self.user.config.theme.foreground,
79 &ticks,
80 &ctx,
81 half_frame_height,
82 Align2::CENTER_CENTER,
83 );
84 }
85
86 waves.draw_markers(&self.user.config.theme, &mut ctx, frame_size, &viewport_all);
87
88 waves.draw_marker_number_boxes(
89 &mut ctx,
90 frame_size,
91 &self.user.config.theme,
92 &viewport_all,
93 );
94 response.dragged_by(PointerButton::Primary).then(|| {
95 let pointer_pos_global = ui.input(|i| i.pointer.interact_pos());
96 let pos = pointer_pos_global.map(|p| to_screen.inverse().transform_pos(p));
97 if let Some(pos) = pos {
98 let timestamp = viewport_all.as_time_bigint(pos.x, frame_width, &num_timestamps);
99 msgs.push(Message::GoToTime(Some(timestamp), 0));
100 }
101 });
102 }
103}