egui_tracing/ui/components/
table_header.rs

1use egui::{vec2, Response, Sense, Ui};
2
3use super::common::{set_common_props, CommonProps};
4use super::ChildFn;
5
6pub static PADDING_LEFT: f32 = 4.0;
7
8pub struct TableHeader<T> {
9    common_props: Option<CommonProps>,
10    children: Option<T>,
11}
12
13impl<T> Default for TableHeader<T> {
14    fn default() -> Self {
15        Self {
16            common_props: None,
17            children: None,
18        }
19    }
20}
21
22impl<T> TableHeader<T>
23where
24    T: ChildFn,
25{
26    pub fn common_props(mut self, v: CommonProps) -> Self {
27        self.common_props = Some(v);
28        self
29    }
30
31    pub fn children(mut self, v: T) -> Self {
32        self.children = Some(v);
33        self
34    }
35
36    pub fn show(self, ui: &mut Ui) -> Response {
37        ui.horizontal(|ui| {
38            set_common_props(ui, &self.common_props);
39            let available_space = ui.available_size_before_wrap();
40            let size = vec2(PADDING_LEFT, available_space.y);
41            let (rect, response) = ui.allocate_at_least(size, Sense::hover());
42            if ui.is_rect_visible(response.rect) {
43                let stroke = ui.visuals().widgets.noninteractive.bg_stroke;
44                let painter = ui.painter();
45                painter.vline(rect.left(), rect.top()..=rect.bottom(), stroke);
46            }
47
48            (self.children.unwrap())(ui)
49        })
50        .response
51    }
52}