in src/main.rs [598:661]
fn render_footer(f: &mut Frame, app: &mut App, area: Rect) {
let info_text = match app.mode {
Mode::Table => TABLE_FOOTER,
Mode::Graph => GRAPHS_FOOTER,
Mode::Filter => FILTER_FOOTER,
Mode::Sort => SORT_INFO_FOOTER,
};
let info_footer = Paragraph::new(Line::from(info_text)).centered().block(
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Double),
);
// Only single footer in table and graph mode
if let Mode::Table | Mode::Graph = app.mode {
f.render_widget(info_footer, area);
return;
}
// Two footers in filter and sort mode
let split_area = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(75), Constraint::Percentage(25)].as_ref())
.split(area);
// Right footer
f.render_widget(info_footer, split_area[1]);
// Left footer
match app.mode {
Mode::Filter => {
let filter_input = app.filter_input.lock().unwrap();
let filter_footer = Paragraph::new(filter_input.value()).block(
Block::default()
.padding(Padding::horizontal(1))
.borders(Borders::ALL)
.border_type(BorderType::Double)
.title(" Filter Name/Type "),
);
f.render_widget(filter_footer, split_area[0]);
// Displays cursor when inputting
f.set_cursor_position((
split_area[0].x + filter_input.visual_cursor() as u16 + 2,
split_area[0].y + 1,
));
drop(filter_input);
}
Mode::Sort => {
let sort_footer = Paragraph::new(Line::from(SORT_CONTROLS_FOOTER))
.centered()
.block(
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Double)
.title(" Sort Column "),
);
f.render_widget(sort_footer, split_area[0]);
}
_ => {}
}
}