diff --git a/src/mavlink/message_broker.rs b/src/mavlink/message_broker.rs index 56f6060ccbc6bcbddf595fb06c3e9278b5b53497..94c0c0e6673e851db0ff3b2ac637ceac889e6cfc 100644 --- a/src/mavlink/message_broker.rs +++ b/src/mavlink/message_broker.rs @@ -92,7 +92,7 @@ impl MessageBroker { /// validity based on `is_valid` method of the view. pub fn refresh_view<V: MessageView>(&mut self, view: &mut V) -> MavlinkResult<()> { self.process_incoming_msgs(); - if !view.is_valid() || !self.update_queues.contains_key(view.widget_id()) { + if !view.is_valid() || !self.is_view_subscribed(view.widget_id()) { self.init_view(view)?; } else { self.update_view(view)?; @@ -149,12 +149,20 @@ impl MessageBroker { self.task = Some(handle); } + pub fn unsubscribe_all_views(&mut self) { + self.update_queues.clear(); + } + /// Clears all the messages stored in the broker. Useful in message replay /// scenarios. pub fn clear(&mut self) { self.messages.clear(); } + fn is_view_subscribed(&self, widget_id: &egui::Id) -> bool { + self.update_queues.contains_key(widget_id) + } + /// Init a view in case of cache invalidation or first time initialization. fn init_view<V: MessageView>(&mut self, view: &mut V) -> MavlinkResult<()> { trace!("initializing view: {:?}", view.widget_id()); diff --git a/src/ui/persistency/layout_manager.rs b/src/ui/persistency/layout_manager.rs index 173fea11360bf4f0049957d210992ec38417c5b2..33ed67147d8fec951205c11d556e96192db4506c 100644 --- a/src/ui/persistency/layout_manager.rs +++ b/src/ui/persistency/layout_manager.rs @@ -7,7 +7,7 @@ use std::{ use tracing::{info, trace, warn}; -use crate::error::ErrInstrument; +use crate::{error::ErrInstrument, MSG_MANAGER}; use super::super::composable_view::ComposableViewState; @@ -103,6 +103,7 @@ impl LayoutManager { .ok_or(anyhow::anyhow!("Layout not found"))?; *state = layout.clone(); self.current_layout = Some(path.as_ref().into()); + MSG_MANAGER.get().unwrap().lock().unsubscribe_all_views(); Ok(()) }