Skip to content

Commit

Permalink
[desktop] tauri remove some global variables.
Browse files Browse the repository at this point in the history
  • Loading branch information
vlabo committed Aug 5, 2024
1 parent 9aad026 commit 075b5f4
Showing 1 changed file with 42 additions and 50 deletions.
92 changes: 42 additions & 50 deletions desktop/tauri/src-tauri/src/traymenu.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
use std::sync::atomic::AtomicBool;
use std::sync::Mutex;
use std::{collections::HashMap, sync::atomic::Ordering};

use log::{debug, error};
use tauri::menu::{Menu, MenuItemKind};
use tauri::tray::{MouseButton, MouseButtonState};
use tauri::Runtime;
use tauri::{
image::Image,
menu::{MenuBuilder, MenuItem, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
menu::{MenuBuilder, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
tray::{TrayIcon, TrayIconBuilder},
Wry,
};
Expand All @@ -32,9 +33,9 @@ pub type AppIcon = TrayIcon<Wry>;

static SPN_STATE: AtomicBool = AtomicBool::new(false);

static SPN_STATUS: Mutex<Option<MenuItem<Wry>>> = Mutex::new(None);
static SPN_BUTTON: Mutex<Option<MenuItem<Wry>>> = Mutex::new(None);
static GLOBAL_STATUS: Mutex<Option<MenuItem<Wry>>> = Mutex::new(None);
static SPN_STATUS_KEY: &str = "spn_status";
static SPN_BUTTON_KEY: &str = "spn_toggle";
static GLOBAL_STATUS_KEY: &str = "global_status";

const PM_TRAY_ICON_ID: &str = "pm_icon";

Expand Down Expand Up @@ -101,28 +102,16 @@ pub fn setup_tray_menu(
.enabled(false)
.build(app)
.unwrap();
{
let mut button_ref = GLOBAL_STATUS.lock()?;
*button_ref = Some(global_status.clone());
}

// Setup SPN status
let spn_status = MenuItemBuilder::with_id("spn_status", "SPN: Disabled")
let spn_status = MenuItemBuilder::with_id(SPN_STATUS_KEY, "SPN: Disabled")
.enabled(false)
.build(app)
.unwrap();
{
let mut button_ref = SPN_STATUS.lock()?;
*button_ref = Some(spn_status.clone());
}
// Setup SPN button
let spn = MenuItemBuilder::with_id("spn_toggle", "Enable SPN")
let spn_button = MenuItemBuilder::with_id(SPN_BUTTON_KEY, "Enable SPN")
.build(app)
.unwrap();
{
let mut button_ref = SPN_BUTTON.lock()?;
*button_ref = Some(spn.clone());
}

let force_show_window = MenuItemBuilder::with_id("force-show", "Force Show UI").build(app)?;
let reload_btn = MenuItemBuilder::with_id("reload", "Reload User Interface").build(app)?;
Expand All @@ -137,7 +126,7 @@ pub fn setup_tray_menu(
&global_status,
&PredefinedMenuItem::separator(app)?,
&spn_status,
&spn,
&spn_button,
&PredefinedMenuItem::separator(app)?,
&exit_ui_btn,
&shutdown_btn,
Expand Down Expand Up @@ -218,7 +207,12 @@ pub fn setup_tray_menu(
Ok(icon)
}

pub fn update_icon(icon: AppIcon, subsystems: HashMap<String, Subsystem>, spn_status: String) {
pub fn update_icon<R: Runtime>(
icon: AppIcon,
menu: Option<Menu<R>>,
subsystems: HashMap<String, Subsystem>,
spn_status: String,
) {
// iterate over the subsystems and check if there's a module failure
let failure = subsystems.values().map(|s| &s.module_status).fold(
(subsystem::FAILURE_NONE, "".to_string()),
Expand All @@ -232,14 +226,13 @@ pub fn update_icon(icon: AppIcon, subsystems: HashMap<String, Subsystem>, spn_st
},
);

#[allow(clippy::collapsible_else_if)]
if failure.0 == subsystem::FAILURE_NONE {
if let Some(global_status) = &mut *(GLOBAL_STATUS.lock().unwrap()) {
_ = global_status.set_text("Status: Secured");
}
} else {
if let Some(global_status) = &mut *(GLOBAL_STATUS.lock().unwrap()) {
_ = global_status.set_text(format!("Status: {}", failure.1));
if let Some(menu) = menu {
if let Some(MenuItemKind::MenuItem(global_status)) = menu.get(GLOBAL_STATUS_KEY) {
if failure.0 == subsystem::FAILURE_NONE {
_ = global_status.set_text("Status: Secured");
} else {
_ = global_status.set_text(format!("Status: {}", failure.1));
}
}
}

Expand Down Expand Up @@ -353,7 +346,7 @@ pub async fn tray_handler(cli: PortAPI, app: tauri::AppHandle) {
Ok(n) => {
subsystems.insert(n.id.clone(), n);

update_icon(icon.clone(), subsystems.clone(), spn_status.clone());
update_icon(icon.clone(), app.menu(), subsystems.clone(), spn_status.clone());
},
Err(err) => match err {
ParseError::Json(err) => {
Expand Down Expand Up @@ -385,7 +378,7 @@ pub async fn tray_handler(cli: PortAPI, app: tauri::AppHandle) {
debug!("SPN status update: {}", value.status);
spn_status = value.status.clone();

update_icon(icon.clone(), subsystems.clone(), spn_status.clone());
update_icon(icon.clone(), app.menu(), subsystems.clone(), spn_status.clone());
},
Err(err) => match err {
ParseError::Json(err) => {
Expand Down Expand Up @@ -414,7 +407,9 @@ pub async fn tray_handler(cli: PortAPI, app: tauri::AppHandle) {
if let Some((_, payload)) = res {
match payload.parse::<BooleanValue>() {
Ok(value) => {
update_spn_ui_state(value.value.unwrap_or(false));
if let Some(menu) = app.menu() {
update_spn_ui_state(menu, value.value.unwrap_or(false));
}
},
Err(err) => match err {
ParseError::Json(err) => {
Expand Down Expand Up @@ -444,26 +439,23 @@ pub async fn tray_handler(cli: PortAPI, app: tauri::AppHandle) {
}
}
}

update_spn_ui_state(false);
if let Some(menu) = app.menu() {
update_spn_ui_state(menu, false);
}
_ = icon.set_icon(Some(Image::from_bytes(get_red_icon()).unwrap()));
}

fn update_spn_ui_state(enabled: bool) {
let mut spn_status = SPN_STATUS.lock().unwrap();
let Some(spn_status_ref) = &mut *spn_status else {
return;
};
let mut spn_btn = SPN_BUTTON.lock().unwrap();
let Some(spn_btn_ref) = &mut *spn_btn else {
return;
};
if enabled {
_ = spn_status_ref.set_text("SPN: Connected");
_ = spn_btn_ref.set_text("Disable SPN");
} else {
_ = spn_status_ref.set_text("SPN: Disabled");
_ = spn_btn_ref.set_text("Enable SPN");
fn update_spn_ui_state<R: Runtime>(menu: Menu<R>, enabled: bool) {
if let (Some(MenuItemKind::MenuItem(spn_status)), Some(MenuItemKind::MenuItem(spn_btn))) =
(menu.get(SPN_STATUS_KEY), menu.get(SPN_BUTTON_KEY))
{
if enabled {
_ = spn_status.set_text("SPN: Connected");
_ = spn_btn.set_text("Disable SPN");
} else {
_ = spn_status.set_text("SPN: Disabled");
_ = spn_btn.set_text("Enable SPN");
}
SPN_STATE.store(enabled, Ordering::Release);
}
SPN_STATE.store(enabled, Ordering::SeqCst);
}

0 comments on commit 075b5f4

Please sign in to comment.