diff --git a/crates/television/television.rs b/crates/television/television.rs index 70fa8b9..de23431 100644 --- a/crates/television/television.rs +++ b/crates/television/television.rs @@ -47,6 +47,7 @@ pub struct Television { /// are rendered correctly even when resizing the terminal while still /// benefiting from a cache mechanism. pub meta_paragraph_cache: HashMap<(String, u16, u16), Paragraph<'static>>, + pub icon_color_cache: HashMap, pub(crate) spinner: Spinner, pub(crate) spinner_state: SpinnerState, } @@ -81,6 +82,7 @@ impl Television { preview_pane_height: 0, current_preview_total_lines: 0, meta_paragraph_cache: HashMap::new(), + icon_color_cache: HashMap::new(), spinner, spinner_state: SpinnerState::from(&spinner), } diff --git a/crates/television/ui/remote_control.rs b/crates/television/ui/remote_control.rs index 9908e92..0679e70 100644 --- a/crates/television/ui/remote_control.rs +++ b/crates/television/ui/remote_control.rs @@ -65,6 +65,7 @@ impl Television { .result_name_fg(mode_color(self.mode)), ), self.config.ui.use_nerd_font_icons, + &mut self.icon_color_cache, ); f.render_stateful_widget( diff --git a/crates/television/ui/results.rs b/crates/television/ui/results.rs index 113808d..5714867 100644 --- a/crates/television/ui/results.rs +++ b/crates/television/ui/results.rs @@ -8,6 +8,7 @@ use ratatui::widgets::{ Block, BorderType, Borders, List, ListDirection, Padding, }; use ratatui::Frame; +use std::collections::HashMap; use std::str::FromStr; use television_channels::channels::OnAir; use television_channels::entry::Entry; @@ -69,6 +70,7 @@ pub fn build_results_list<'a, 'b>( list_direction: ListDirection, results_list_colors: Option, use_icons: bool, + icon_color_cache: &mut HashMap, ) -> List<'a> where 'b: 'a, @@ -79,10 +81,21 @@ where // optional icon if let Some(icon) = entry.icon.as_ref() { if use_icons { - spans.push(Span::styled( - icon.to_string(), - Style::default().fg(Color::from_str(icon.color).unwrap()), - )); + if let Some(icon_color) = icon_color_cache.get(icon.color) { + spans.push(Span::styled( + icon.to_string(), + Style::default().fg(*icon_color), + )); + } else { + let icon_color = Color::from_str(icon.color).unwrap(); + icon_color_cache + .insert(icon.color.to_string(), icon_color); + spans.push(Span::styled( + icon.to_string(), + Style::default().fg(icon_color), + )); + } + spans.push(Span::raw(" ")); } } @@ -203,6 +216,7 @@ impl Television { }, None, self.config.ui.use_nerd_font_icons, + &mut self.icon_color_cache, ); f.render_stateful_widget(