handle.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. use super::tray::Tray;
  2. use crate::log_err;
  3. use anyhow::{bail, Result};
  4. use once_cell::sync::OnceCell;
  5. use parking_lot::Mutex;
  6. use std::sync::Arc;
  7. use tauri::{AppHandle, Manager, Window};
  8. #[derive(Debug, Default, Clone)]
  9. pub struct Handle {
  10. pub app_handle: Arc<Mutex<Option<AppHandle>>>,
  11. }
  12. impl Handle {
  13. pub fn global() -> &'static Handle {
  14. static HANDLE: OnceCell<Handle> = OnceCell::new();
  15. HANDLE.get_or_init(|| Handle {
  16. app_handle: Arc::new(Mutex::new(None)),
  17. })
  18. }
  19. pub fn init(&self, app_handle: AppHandle) {
  20. *self.app_handle.lock() = Some(app_handle);
  21. }
  22. pub fn get_window(&self) -> Option<Window> {
  23. self.app_handle
  24. .lock()
  25. .as_ref()
  26. .map_or(None, |a| a.get_window("main"))
  27. }
  28. pub fn refresh_clash() {
  29. if let Some(window) = Self::global().get_window() {
  30. log_err!(window.emit("verge://refresh-clash-config", "yes"));
  31. }
  32. }
  33. pub fn refresh_verge() {
  34. if let Some(window) = Self::global().get_window() {
  35. log_err!(window.emit("verge://refresh-verge-config", "yes"));
  36. }
  37. }
  38. #[allow(unused)]
  39. pub fn refresh_profiles() {
  40. if let Some(window) = Self::global().get_window() {
  41. log_err!(window.emit("verge://refresh-profiles-config", "yes"));
  42. }
  43. }
  44. pub fn notice_message<S: Into<String>, M: Into<String>>(status: S, msg: M) {
  45. if let Some(window) = Self::global().get_window() {
  46. log_err!(window.emit("verge://notice-message", (status.into(), msg.into())));
  47. }
  48. }
  49. pub fn update_systray() -> Result<()> {
  50. let app_handle = Self::global().app_handle.lock();
  51. if app_handle.is_none() {
  52. bail!("update_systray unhandled error");
  53. }
  54. Tray::update_systray(app_handle.as_ref().unwrap())?;
  55. Ok(())
  56. }
  57. /// update the system tray state
  58. pub fn update_systray_part() -> Result<()> {
  59. let app_handle = Self::global().app_handle.lock();
  60. if app_handle.is_none() {
  61. bail!("update_systray unhandled error");
  62. }
  63. Tray::update_part(app_handle.as_ref().unwrap())?;
  64. Ok(())
  65. }
  66. }