use std::borrow::Cow;
pub struct TrayIcon<'a, Message> {
pub name: Cow<'a, str>,
pub tooltip: Option<Cow<'a, str>>,
pub icon: Option<&'a [u8]>,
pub menu: Option<TrayMenu<'a, Message>>,
}
impl<'a, Message> TrayIcon<'a, Message> {
#[must_use]
pub fn new(name: impl Into<Cow<'a, str>>) -> Self {
Self {
name: name.into(),
tooltip: None,
icon: None,
menu: None,
}
}
#[must_use]
pub fn tooltip(mut self, tooltip: impl Into<Cow<'a, str>>) -> Self {
self.tooltip = Some(tooltip.into());
self
}
#[must_use]
pub fn icon(mut self, icon: &'a [u8]) -> Self {
self.icon = Some(icon);
self
}
#[must_use]
pub fn menu(mut self, menu: TrayMenu<'a, Message>) -> Self {
self.menu = Some(menu);
self
}
}
pub struct TrayMenu<'a, Message> {
pub items: Vec<TrayMenuItem<'a, Message>>,
}
impl<'a, Message> TrayMenu<'a, Message> {
#[must_use]
pub fn new() -> Self {
Self { items: Vec::new() }
}
#[must_use]
pub fn item(mut self, label: impl Into<Cow<'a, str>>, message: Message) -> Self {
self.items.push(TrayMenuItem::Item {
label: label.into(),
message,
enabled: true,
});
self
}
#[must_use]
pub fn item_disabled(mut self, label: impl Into<Cow<'a, str>>, message: Message) -> Self {
self.items.push(TrayMenuItem::Item {
label: label.into(),
message,
enabled: false,
});
self
}
#[must_use]
pub fn separator(mut self) -> Self {
self.items.push(TrayMenuItem::Separator);
self
}
#[must_use]
pub fn submenu(mut self, label: impl Into<Cow<'a, str>>, submenu: TrayMenu<'a, Message>) -> Self {
self.items.push(TrayMenuItem::Submenu {
label: label.into(),
menu: submenu,
});
self
}
}
impl<'a, Message> Default for TrayMenu<'a, Message> {
fn default() -> Self {
Self::new()
}
}
pub enum TrayMenuItem<'a, Message> {
Item {
label: Cow<'a, str>,
message: Message,
enabled: bool,
},
Separator,
Submenu {
label: Cow<'a, str>,
menu: TrayMenu<'a, Message>,
},
}