make preview_charts a Vec instead of an HashMap

This commit is contained in:
GyulyVGC
2025-12-18 11:39:01 +01:00
parent 71d0cb4b77
commit ca42d83ef5
4 changed files with 46 additions and 22 deletions

View File

@@ -44,13 +44,18 @@ pub fn update_charts_data(&mut self, packets: u128) {
let packets_entry = packets as f32; let packets_entry = packets as f32;
let packets_point = (tot_seconds, packets_entry); let packets_point = (tot_seconds, packets_entry);
// update sent bytes traffic data // update traffic data
self.packets.update_series(packets_point, true, false); self.packets.update_series(packets_point, true, false);
self.max_packets = self.packets.get_max(); self.max_packets = self.packets.get_max();
} }
pub fn view(&self) -> Element<'_, Message, StyleType> { pub fn view(&self) -> Element<'_, Message, StyleType> {
Column::new().height(40).push(ChartWidget::new(self)).into() if self.max_packets > 0.0 {
Column::new().height(40).push(ChartWidget::new(self))
} else {
Column::new()
}
.into()
} }
pub fn change_style(&mut self, style: StyleType) { pub fn change_style(&mut self, style: StyleType) {

View File

@@ -178,7 +178,7 @@ fn get_col_adapter(
) -> Column<'_, Message, StyleType> { ) -> Column<'_, Message, StyleType> {
let mut dev_str_list = vec![]; let mut dev_str_list = vec![];
// TODO: do not iterate here // TODO: do not iterate here
for (_, (my_dev, _)) in &sniffer.preview_charts { for (my_dev, _) in &sniffer.preview_charts {
let mut title = String::new(); let mut title = String::new();
#[allow(unused_mut)] #[allow(unused_mut)]
let mut subtitle: Option<&String> = None; let mut subtitle: Option<&String> = None;
@@ -233,7 +233,10 @@ fn get_col_adapter(
} else { } else {
Some(Text::new(addrs).font(font)) Some(Text::new(addrs).font(font))
}; };
let my_device_chart = sniffer.preview_charts.get(name); let my_device_chart = sniffer
.preview_charts
.iter()
.find(|(dev, _)| dev.get_name().eq(name));
scroll_adapters.push( scroll_adapters.push(
Button::new( Button::new(
Column::new() Column::new()

View File

@@ -102,8 +102,7 @@ pub struct Sniffer {
/// Traffic chart displayed in the Overview page /// Traffic chart displayed in the Overview page
pub traffic_chart: TrafficChart, pub traffic_chart: TrafficChart,
/// Traffic preview charts displayed in the initial page /// Traffic preview charts displayed in the initial page
// TODO: make this a Vec<(MyDevice, PreviewChart)> to keep the order of the devices consistent pub preview_charts: Vec<(MyDevice, PreviewChart)>,
pub preview_charts: HashMap<String, (MyDevice, PreviewChart)>,
/// Currently displayed modal; None if no modal is displayed /// Currently displayed modal; None if no modal is displayed
pub modal: Option<MyModal>, pub modal: Option<MyModal>,
/// Currently displayed settings page; None if settings is closed /// Currently displayed settings page; None if settings is closed
@@ -158,7 +157,7 @@ pub fn new(conf: Conf) -> Self {
pcap_error: None, pcap_error: None,
dots_pulse: (".".to_string(), 0), dots_pulse: (".".to_string(), 0),
traffic_chart: TrafficChart::new(style, language, data_repr), traffic_chart: TrafficChart::new(style, language, data_repr),
preview_charts: HashMap::new(), preview_charts: Vec::new(),
modal: None, modal: None,
settings_page: None, settings_page: None,
running_page: None, running_page: None,
@@ -634,20 +633,34 @@ pub fn update(&mut self, message: Message) -> Task<Message> {
} }
} }
Message::TrafficPreview(msg) => { Message::TrafficPreview(msg) => {
// TODO: remove or hide inactive devices self.preview_charts.retain(|(my_dev, _)| {
msg.data
.iter()
.any(|(d, _)| d.get_name().eq(my_dev.get_name()))
});
for (dev, packets) in msg.data { for (dev, packets) in msg.data {
self.preview_charts let Some((my_dev, chart)) = self
.entry(dev.get_name().clone()) .preview_charts
.and_modify(|(my_dev, chart)| { .iter_mut()
*my_dev = dev.clone(); .find(|(my_dev, _)| my_dev.get_name().eq(dev.get_name()))
chart.update_charts_data(packets); else {
}) let mut chart = PreviewChart::new(self.conf.settings.style);
.or_insert({ chart.update_charts_data(packets);
let mut chart = PreviewChart::new(self.conf.settings.style); self.preview_charts.push((dev, chart));
chart.update_charts_data(packets); continue;
(dev, chart) };
}); *my_dev = dev.clone();
chart.update_charts_data(packets);
} }
self.preview_charts.sort_by(|(_, c1), (_, c2)| {
if c1.max_packets > 0.0 && c2.max_packets == 0.0 {
std::cmp::Ordering::Less
} else if c1.max_packets == 0.0 && c2.max_packets > 0.0 {
std::cmp::Ordering::Greater
} else {
std::cmp::Ordering::Equal
}
});
} }
} }
Task::none() Task::none()
@@ -891,7 +904,9 @@ fn reset(&mut self) {
// increment capture id to ignore pending messages from previous captures // increment capture id to ignore pending messages from previous captures
self.current_capture_rx = (self.current_capture_rx.0 + 1, None); self.current_capture_rx = (self.current_capture_rx.0 + 1, None);
self.info_traffic = InfoTraffic::default(); self.info_traffic = InfoTraffic::default();
self.preview_charts = HashMap::new(); self.preview_charts
.iter_mut()
.for_each(|(_, chart)| *chart = PreviewChart::new(style));
self.addresses_resolved = HashMap::new(); self.addresses_resolved = HashMap::new();
self.favorite_hosts = HashSet::new(); self.favorite_hosts = HashSet::new();
self.logged_notifications = (VecDeque::new(), 0); self.logged_notifications = (VecDeque::new(), 0);
@@ -910,7 +925,7 @@ fn reset(&mut self) {
} }
fn set_device(&mut self, name: &str) { fn set_device(&mut self, name: &str) {
for (_, (my_dev, _)) in &self.preview_charts { for (my_dev, _) in &self.preview_charts {
if my_dev.get_name().eq(&name) { if my_dev.get_name().eq(&name) {
self.conf.device.device_name = name.to_string(); self.conf.device.device_name = name.to_string();
self.capture_source = CaptureSource::Device(my_dev.clone()); self.capture_source = CaptureSource::Device(my_dev.clone());
@@ -1177,7 +1192,7 @@ pub fn is_capture_source_consistent(&self) -> bool {
fn change_charts_style(&mut self) { fn change_charts_style(&mut self) {
let style = self.conf.settings.style; let style = self.conf.settings.style;
self.traffic_chart.change_style(style); self.traffic_chart.change_style(style);
for (_, chart) in self.preview_charts.values_mut() { for (_, chart) in &mut self.preview_charts {
chart.change_style(style); chart.change_style(style);
} }
} }

View File

@@ -75,6 +75,7 @@ fn handle_devices_and_previews(
continue; continue;
} }
data.insert(dev_name.clone(), 0); data.insert(dev_name.clone(), 0);
traffic_preview.data.push((my_dev.clone(), 0));
let mut freeze_rx = freeze_tx.subscribe(); let mut freeze_rx = freeze_tx.subscribe();
let pcap_tx = pcap_tx.clone(); let pcap_tx = pcap_tx.clone();
let capture_source = CaptureSource::Device(my_dev); let capture_source = CaptureSource::Device(my_dev);