From bcdbc45931509a9d929dd335f2917af8860cb5fe Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Sat, 24 Jan 2026 21:10:44 +0100 Subject: [PATCH] feat: make notifications disappear after 5 seconds from last action --- rog-control-center/src/ui/mod.rs | 46 +++++++++++++++++++++---- rog-control-center/ui/main_window.slint | 7 ++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/rog-control-center/src/ui/mod.rs b/rog-control-center/src/ui/mod.rs index 81a45e82..417c25ed 100644 --- a/rog-control-center/src/ui/mod.rs +++ b/rog-control-center/src/ui/mod.rs @@ -3,7 +3,11 @@ pub mod setup_aura; pub mod setup_fans; pub mod setup_system; +use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Mutex}; +use std::time::Duration; + +static TOAST_SEQ: AtomicU64 = AtomicU64::new(0); use config_traits::StdConfig; use log::warn; @@ -70,15 +74,45 @@ pub fn show_toast( handle: Weak, result: zbus::Result<()>, ) { + // bump sequence so that any previously spawned timers won't clear newer toasts + let seq = TOAST_SEQ.fetch_add(1, Ordering::SeqCst) + 1; match result { Ok(_) => { - slint::invoke_from_event_loop(move || handle.unwrap().invoke_show_toast(success)).ok() + let delayed_handle = handle.clone(); + let delayed_text = success.clone(); + slint::invoke_from_event_loop(move || handle.unwrap().invoke_show_toast(success)).ok(); + tokio::spawn(async move { + tokio::time::sleep(Duration::from_secs(5)).await; + if TOAST_SEQ.load(Ordering::SeqCst) == seq { + slint::invoke_from_event_loop(move || { + delayed_handle + .unwrap() + .invoke_clear_toast_if_matches(delayed_text) + }) + .ok(); + } + }); + } + Err(e) => { + let delayed_handle = handle.clone(); + let delayed_text = fail.clone(); + slint::invoke_from_event_loop(move || { + log::warn!("{fail}: {e}"); + handle.unwrap().invoke_show_toast(fail) + }) + .ok(); + tokio::spawn(async move { + tokio::time::sleep(Duration::from_secs(5)).await; + if TOAST_SEQ.load(Ordering::SeqCst) == seq { + slint::invoke_from_event_loop(move || { + delayed_handle + .unwrap() + .invoke_clear_toast_if_matches(delayed_text) + }) + .ok(); + } + }); } - Err(e) => slint::invoke_from_event_loop(move || { - log::warn!("{fail}: {e}"); - handle.unwrap().invoke_show_toast(fail) - }) - .ok(), }; } diff --git a/rog-control-center/ui/main_window.slint b/rog-control-center/ui/main_window.slint index 93fb9272..7549d495 100644 --- a/rog-control-center/ui/main_window.slint +++ b/rog-control-center/ui/main_window.slint @@ -43,6 +43,13 @@ export component MainWindow inherits Window { toast = text != ""; toast_text = text; } + callback clear_toast_if_matches(string); + clear_toast_if_matches(text) => { + if (toast && toast_text == text) { + toast = false; + toast_text = ""; + } + } callback exit-app(); callback show_notification(bool); show_notification(yes) => {