67 lines
2.1 KiB
Rust
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(())
|
|
}
|