adguardian/widgets/
filters.rs1use tui::{
4 text::{Span, Spans},
5 widgets::{Block, Borders, List, ListItem},
6 style::{Color, Style, Modifier},
7};
8
9use crate::fetch::fetch_filters::Filter;
10
11fn truncate(text: &str, width: usize) -> String {
12 if text.chars().count() <= width {
13 text.to_string()
14 } else {
15 text.chars().take(width - 3).collect::<String>() + "..."
16 }
17}
18
19pub fn make_filters_list(filters: &[Filter], width: u16) -> List {
20 let items: Vec<ListItem> = filters
21 .iter()
22 .map(|filter| {
23 let (status_text, color) = if filter.enabled {
24 ("✔", Color::Green)
25 } else {
26 ("✘", Color::Red)
27 };
28 let status = Span::styled(status_text, Style::default().fg(color));
29 let rule_count = Span::styled(format!(" ({})", filter.rules_count), Style::default().fg(Color::Magenta).add_modifier(Modifier::BOLD));
30 let name = Span::raw(format!(" {}", truncate(&filter.name, width as usize / 4 - 12)));
31 let content = Spans::from(vec![status, name, rule_count]);
32 ListItem::new(content)
33 })
34 .collect();
35
36 List::new(items)
37 .block(
38 Block::default()
39 .borders(Borders::ALL)
40 .title(Span::styled(
41 "Filters",
42 Style::default().add_modifier(Modifier::BOLD),
43 )),
44 )
45}