From d541dd3ece2521021b89c548843f232b853a5389 Mon Sep 17 00:00:00 2001 From: Federico Lolli <federico.lolli@skywarder.eu> Date: Tue, 17 Dec 2024 17:07:38 +0100 Subject: [PATCH] [Persistence] Plot now repopulated correctly when loading again a layout --- src/mavlink/message_broker.rs | 10 +++++++++- src/ui/persistency/layout_manager.rs | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/mavlink/message_broker.rs b/src/mavlink/message_broker.rs index 56f6060..94c0c0e 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 173fea1..33ed671 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(()) } -- GitLab