diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 210fca4..d74b87d 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -1,5 +1,7 @@ use std::borrow::Cow; use std::cmp::min; +use std::collections::HashMap; +use std::sync::OnceLock; use crate::i18n::t; use crate::ui::dashboard::{ @@ -17,6 +19,8 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; +static STATUS_CHARS: OnceLock>> = OnceLock::new(); + pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; let max_scroll = state.get_total_lenght().saturating_sub(available_height); @@ -31,7 +35,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb let mut lines_skipped = 0; let half = state.get_total_lenght().saturating_div(2); - for (i, group) in state.groups.iter().enumerate() { + for (_i, group) in state.groups.iter().enumerate() { let group_height = group.monitors.len() + BORDER_LINES_VIEW; if lines_skipped + group_height <= scroll_pos { @@ -146,12 +150,15 @@ fn render_monitor_table( frame.render_widget(table, area); } -pub fn get_status_char(status: &MonitorStatus) -> char { - match status { - MonitorStatus::Up => '■', - MonitorStatus::Down => '■', - MonitorStatus::Unknown => '■', - } +fn get_status_char(status: &MonitorStatus) -> Cow<'static, str> { + let map = STATUS_CHARS.get_or_init(|| { + let mut m = HashMap::new(); + m.insert(MonitorStatus::Up, Cow::Borrowed("■")); + m.insert(MonitorStatus::Down, Cow::Borrowed("■")); + m.insert(MonitorStatus::Unknown, Cow::Borrowed("■")); + m + }); + map.get(status).cloned().unwrap_or(Cow::Borrowed("?")) } pub fn get_status_color(status: &MonitorStatus) -> Color { @@ -162,11 +169,14 @@ pub fn get_status_color(status: &MonitorStatus) -> Color { } } -pub fn get_status_emoji(status: &MonitorStatus) -> &str { +pub fn get_status_emoji(status: &MonitorStatus) -> Cow<'static, str> { + static UP_ICON: &str ="✅"; + static DOWN_ICON: &str ="❌"; + static UNKNOWN_ICON: &str = "❓"; match status { - MonitorStatus::Up => "✅", - MonitorStatus::Down => "❌", - MonitorStatus::Unknown => "❓", + MonitorStatus::Up => Cow::Borrowed(UP_ICON), + MonitorStatus::Down => Cow::Borrowed(DOWN_ICON), + MonitorStatus::Unknown => Cow::Borrowed(UNKNOWN_ICON), } } diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index a8e3943..6613dc0 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -6,7 +6,7 @@ use rayon::prelude::*; use std::borrow::Cow; pub const BORDER_LINES_VIEW: usize = 3; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum MonitorStatus { Up, Down,