in src/main.rs [532:596]
fn render_table(f: &mut Frame, app: &mut App, area: Rect) {
let selected_style = Style::default().add_modifier(Modifier::REVERSED);
let normal_style = Style::default().bg(Color::Blue);
let columns: Vec<Cell<'_>> = app
.header_columns
.iter()
.enumerate()
.map(|(i, col)| {
Cell::new(&**col).style(
if app.selected_column.is_some_and(|selected| selected == i) {
selected_style
} else {
normal_style
},
)
})
.collect();
let header = Row::new(columns)
.style(normal_style)
.height(1)
.bottom_margin(1);
let items = app.items.lock().unwrap();
let rows: Vec<Row> = items.iter().map(|item| item.into()).collect();
let content_height: u16 = TABLE_HEADER_HEIGHT
.add(TABLE_HEADER_MARGIN)
.add((rows.len() as u16).mul(TABLE_ROW_HEIGHT.add(TABLE_ROW_MARGIN)))
.add(TABLE_FOOTER_HEIGHT);
if content_height > area.height {
// content exceeds screen size; display scrollbar
app.vertical_scroll_state = app.vertical_scroll_state.content_length(rows.len());
} else {
// content fits on screen; hide scrollbar
app.vertical_scroll_state = app.vertical_scroll_state.content_length(0);
}
let widths = [
Constraint::Percentage(5),
Constraint::Percentage(17),
Constraint::Percentage(17),
Constraint::Percentage(17),
Constraint::Percentage(17),
Constraint::Percentage(17),
Constraint::Percentage(10),
];
let t = Table::new(rows, widths)
.header(header)
.block(
Block::default()
.borders(Borders::ALL)
.title(" eBPF programs "),
)
.row_highlight_style(selected_style)
.highlight_symbol(">> ");
f.render_stateful_widget(t, area, &mut app.table_state);
f.render_stateful_widget(
Scrollbar::new(ScrollbarOrientation::VerticalRight).thumb_symbol("░"),
area,
&mut app.vertical_scroll_state,
);
}