From 0d676820c6cbf80f5598d02014575ded1ddf99fb Mon Sep 17 00:00:00 2001 From: doryan Date: Mon, 29 Jul 2024 01:15:22 +0400 Subject: [PATCH] feat(main): add any asynchronous timer that closes infobar automaticaly after 5 second --- src/view/components/info_bar.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/view/components/info_bar.rs b/src/view/components/info_bar.rs index 56f2d2b..20d9162 100644 --- a/src/view/components/info_bar.rs +++ b/src/view/components/info_bar.rs @@ -1,6 +1,6 @@ use gtk4 as gtk; -use std::sync::LazyLock; +use std::{cell::RefCell, collections::VecDeque, sync::LazyLock}; use gtk::{ builders::{BoxBuilder, ButtonBuilder, LabelBuilder}, @@ -13,6 +13,11 @@ use crate::{ model::{builder_traits::Product, models::EventHandler}, }; +use tokio::{ + task::{spawn, JoinHandle}, + time::{sleep, Duration}, +}; + #[derive(Clone)] pub struct InfoBar { instance: Revealer, @@ -24,6 +29,8 @@ pub struct InfoBarBuilder { button: ButtonBuilder, } +static mut TIMERS_QUEUE: VecDeque> = VecDeque::new(); + // // Singleton pattern implementation // @@ -55,6 +62,23 @@ impl InfoBar { pub fn set_reveal_child(&self, is_reveal: bool) { let _ = &INFO_BAR_INSTANCE.instance.set_reveal_child(is_reveal); } + + pub fn show_infobar(&self, duration_secs: u64) { + INFO_BAR_INSTANCE.set_reveal_child(true); + + let callback = spawn(async move { + sleep(Duration::from_secs(duration_secs)).await; + INFO_BAR_INSTANCE.set_reveal_child(false); + }); + + unsafe { + if !TIMERS_QUEUE.is_empty() { + TIMERS_QUEUE.pop_back().unwrap().abort(); + } + + TIMERS_QUEUE.push_back(callback); + } + } } //