fast-down-gui 0.1.45

超级快的下载器图形化界面
Documentation
use crate::{core::App, os::wakeup_window};
use color_eyre::eyre::Context;
use tray_icon::{
    MouseButton, TrayIcon, TrayIconBuilder, TrayIconEvent,
    menu::{Menu, MenuEvent, MenuItem, PredefinedMenuItem},
};

pub fn setup_tray(app: App) -> color_eyre::Result<TrayIcon> {
    let icon = {
        #[cfg(target_os = "macos")]
        let bytes = include_bytes!("../../assets/tray-icon-mac.png");
        #[cfg(not(target_os = "macos"))]
        let bytes = include_bytes!("../../assets/icon.png");
        let image =
            image::load_from_memory_with_format(bytes, image::ImageFormat::Png)?.into_rgba8();
        let (width, height) = image.dimensions();
        tray_icon::Icon::from_rgba(image.into_raw(), width, height)
    }
    .context("无法加载托盘图片")?;
    let tray_menu = Menu::new();
    let show_item = MenuItem::new("显示主界面", true, None);
    let pause_all_item = MenuItem::new("全部暂停", true, None);
    let quit_item = MenuItem::new("退出", true, None);
    tray_menu
        .append_items(&[
            &show_item,
            &PredefinedMenuItem::separator(),
            &pause_all_item,
            &PredefinedMenuItem::separator(),
            &quit_item,
        ])
        .context("无法创建托盘")?;
    let tray_icon = TrayIconBuilder::new()
        .with_tooltip("fast-down")
        .with_icon(icon)
        .with_menu(Box::new(tray_menu))
        .with_menu_on_left_click(false)
        .build()?;
    TrayIconEvent::set_event_handler(Some({
        let ui = app.ui.clone();
        move |event| match event {
            TrayIconEvent::Click {
                button: MouseButton::Left,
                ..
            }
            | TrayIconEvent::DoubleClick {
                button: MouseButton::Left,
                ..
            } => {
                let _ = ui.upgrade_in_event_loop(|ui| {
                    wakeup_window(&ui);
                });
            }
            _ => {}
        }
    }));
    MenuEvent::set_event_handler(Some({
        let app = app.clone();
        let show_item_id = show_item.into_id();
        let pause_all_item_id = pause_all_item.into_id();
        let quit_item_id = quit_item.into_id();
        move |event: MenuEvent| {
            let id = event.id;
            if id == show_item_id {
                let _ = app.ui.upgrade_in_event_loop(|ui| {
                    wakeup_window(&ui);
                });
            } else if id == pause_all_item_id {
                app.task_set.cancel_all();
            } else if id == quit_item_id {
                app.exit();
            }
        }
    }));
    Ok(tray_icon)
}