fischer-agentkit/src-tauri/src/tray.rs

67 lines
2.1 KiB
Rust

use tauri::{
Manager,
menu::{MenuBuilder, MenuItemBuilder},
tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
};
pub fn create_tray(app: &tauri::App) -> Result<(), Box<dyn std::error::Error>> {
let show = MenuItemBuilder::with_id("show", "显示主窗口").build(app)?;
let quit = MenuItemBuilder::with_id("quit", "退出").build(app)?;
let menu = MenuBuilder::new(app)
.item(&show)
.separator()
.item(&quit)
.build()?;
let mut tray_builder = TrayIconBuilder::new()
.menu(&menu)
.tooltip("Fischer AgentKit");
if let Some(icon) = app.default_window_icon() {
tray_builder = tray_builder.icon(icon.clone());
}
let _tray = tray_builder
.on_menu_event(|app, event| match event.id().as_ref() {
"show" => {
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.set_focus();
}
}
"quit" => {
// Stop backend before exiting
let state = app.state::<crate::BackendState>();
// Cancel listener task
if let Some(token) = state.cancel_token.lock().unwrap().take() {
token.cancel();
}
// Kill the child process
if let Some(child) = state.child.lock().unwrap().take() {
let _ = child.kill();
}
*state.port.lock().unwrap() = None;
app.exit(0);
}
_ => {}
})
.on_tray_icon_event(|tray, event| {
if let TrayIconEvent::Click {
button: MouseButton::Left,
button_state: MouseButtonState::Up,
..
} = event
{
let app = tray.app_handle();
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.set_focus();
}
}
})
.build(app)?;
Ok(())
}