tray-item 0.10.0

Super simple API to make tray icons/menus on Windows, Mac & Linux
use {
    crate::{IconSource, TIError},
    gtk::prelude::*,
    libappindicator::{AppIndicator, AppIndicatorStatus},
};

pub struct TrayItemLinux {
    tray: AppIndicator,
    menu: gtk::Menu,
}

impl TrayItemLinux {
    pub fn new(title: &str, icon: IconSource) -> Result<Self, TIError> {
        let mut t = Self {
            tray: AppIndicator::new(title, icon.as_str()),
            menu: gtk::Menu::new(),
        };

        t.set_icon(icon)?;

        Ok(t)
    }

    pub fn set_icon(&mut self, icon: IconSource) -> Result<(), TIError> {
        self.tray.set_icon(icon.as_str());
        self.tray.set_status(AppIndicatorStatus::Active);

        Ok(())
    }

    pub fn add_label(&mut self, label: &str) -> Result<(), TIError> {
        let item = gtk::MenuItem::with_label(label);
        item.set_sensitive(false);
        self.menu.append(&item);
        self.menu.show_all();
        self.tray.set_menu(&mut self.menu);

        Ok(())
    }

    pub fn add_menu_item<F>(&mut self, label: &str, cb: F) -> Result<(), TIError>
    where
        F: Fn() + Send + 'static,
    {
        let item = gtk::MenuItem::with_label(label);
        item.connect_activate(move |_| {
            cb();
        });
        self.menu.append(&item);
        self.menu.show_all();
        self.tray.set_menu(&mut self.menu);

        Ok(())
    }

    pub fn add_separator(&mut self) -> Result<(), TIError> {
        let item = gtk::SeparatorMenuItem::new();
        self.menu.append(&item);
        self.menu.show_all();
        self.tray.set_menu(&mut self.menu);

        Ok(())
    }
}