A photo manager for VRChat.
1use tauri::{
2 menu::{MenuBuilder, MenuItemBuilder},
3 tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
4 AppHandle, Emitter, Manager, State,
5};
6
7use crate::frontend_calls::config::Config;
8
9#[derive(serde::Serialize, Clone)]
10struct EmptyEvent {}
11
12pub fn setup_traymenu(handle: &AppHandle) {
13 // Setup the tray icon and menu buttons
14 let quit = MenuItemBuilder::new("Quit")
15 .id("quit")
16 .build(handle)
17 .unwrap();
18
19 let hide = MenuItemBuilder::new("Hide / Show")
20 .id("hide")
21 .build(handle)
22 .unwrap();
23
24 let tray_menu = MenuBuilder::new(handle)
25 .items(&[&quit, &hide])
26 .build()
27 .unwrap();
28
29 TrayIconBuilder::with_id("main")
30 .icon(tauri::image::Image::from_bytes(include_bytes!("../../icons/32x32.png")).unwrap())
31 .menu(&tray_menu)
32 .title("VRChat Photo Manager")
33 .tooltip("VRChat Photo Manager")
34 .on_menu_event(move |app: &AppHandle, event| match event.id().as_ref() {
35 "quit" => {
36 let config: State<Config> = app.state();
37 config.save();
38
39 std::process::exit(0);
40 }
41 "hide" => {
42 let window = app.get_webview_window("main").unwrap();
43
44 if window.is_visible().unwrap() {
45 window.hide().unwrap();
46
47 window.emit("hide-window", EmptyEvent {}).unwrap();
48 } else {
49 window.show().unwrap();
50 window.set_focus().unwrap();
51
52 window.emit("show-window", EmptyEvent {}).unwrap();
53 }
54 }
55 _ => {}
56 })
57 .on_tray_icon_event(|tray, event| {
58 if let TrayIconEvent::Click {
59 button: MouseButton::Left,
60 button_state: MouseButtonState::Up,
61 ..
62 } = event
63 {
64 let window = tray.app_handle().get_webview_window("main").unwrap();
65
66 window.show().unwrap();
67 window.set_focus().unwrap();
68
69 window.emit("show-window", EmptyEvent {}).unwrap();
70 }
71 })
72 .build(handle)
73 .unwrap();
74}