use tauri::{ menu::{MenuBuilder, MenuItemBuilder}, tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, AppHandle, Emitter, Manager, State, }; use crate::frontend_calls::config::Config; #[derive(serde::Serialize, Clone)] struct EmptyEvent {} pub fn setup_traymenu(handle: &AppHandle) { // Setup the tray icon and menu buttons let quit = MenuItemBuilder::new("Quit") .id("quit") .build(handle) .unwrap(); let hide = MenuItemBuilder::new("Hide / Show") .id("hide") .build(handle) .unwrap(); let tray_menu = MenuBuilder::new(handle) .items(&[&quit, &hide]) .build() .unwrap(); TrayIconBuilder::with_id("main") .icon(tauri::image::Image::from_bytes(include_bytes!("../../icons/32x32.png")).unwrap()) .menu(&tray_menu) .title("VRChat Photo Manager") .tooltip("VRChat Photo Manager") .on_menu_event(move |app: &AppHandle, event| match event.id().as_ref() { "quit" => { let config: State = app.state(); config.save(); std::process::exit(0); } "hide" => { let window = app.get_webview_window("main").unwrap(); if window.is_visible().unwrap() { window.hide().unwrap(); window.emit("hide-window", EmptyEvent {}).unwrap(); } else { window.show().unwrap(); window.set_focus().unwrap(); window.emit("show-window", EmptyEvent {}).unwrap(); } } _ => {} }) .on_tray_icon_event(|tray, event| { if let TrayIconEvent::Click { button: MouseButton::Left, button_state: MouseButtonState::Up, .. } = event { let window = tray.app_handle().get_webview_window("main").unwrap(); window.show().unwrap(); window.set_focus().unwrap(); window.emit("show-window", EmptyEvent {}).unwrap(); } }) .build(handle) .unwrap(); }