use crate::backend::{PlatformTray, PlatformTrayOps};
use crate::config::TrayConfig;
use crate::error::TrayResult;
use crate::event::TrayEvent;
use crate::icon::TrayIcon;
use crate::menu::Menu;
use tokio::sync::broadcast;
pub struct SystemTray {
inner: PlatformTray,
event_tx: broadcast::Sender<TrayEvent>,
}
impl SystemTray {
pub fn new(config: TrayConfig) -> TrayResult<Self> {
let (event_tx, _) = broadcast::channel(config.event_channel_capacity);
let inner = PlatformTray::new(&config, event_tx.clone())?;
Ok(Self { inner, event_tx })
}
pub fn set_icon(&self, icon: &TrayIcon) -> TrayResult<()> {
self.inner.set_icon(icon)
}
pub fn set_tooltip(&self, tooltip: &str) -> TrayResult<()> {
self.inner.set_tooltip(tooltip)
}
pub fn set_menu(&self, menu: Menu) -> TrayResult<()> {
self.inner.set_menu(&menu)
}
pub fn subscribe(&self) -> broadcast::Receiver<TrayEvent> {
self.event_tx.subscribe()
}
pub fn destroy(self) -> TrayResult<()> {
self.inner.destroy()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_tray_config() {
let config = TrayConfig::builder()
.tooltip("Test")
.event_channel_capacity(32)
.build();
assert_eq!(config.tooltip, "Test");
assert_eq!(config.event_channel_capacity, 32);
}
}