Skip to main content

adguardian/widgets/
filters.rs

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