adguardian/widgets/
filters.rs

1// filters.rs
2
3use 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}