Skip to main content

libsurfer/
overview.rs

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            // Remove first and last tick
74            ticks.pop();
75            ticks.remove(0);
76            // Draw ticks
77            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}