mirror of
https://github.com/GyulyVGC/sniffnet.git
synced 2025-12-23 22:29:01 -05:00
make preview_charts a Vec instead of an HashMap
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user