From 63bd0c87b2c9f84deaab0afe5747394ccae48b96 Mon Sep 17 00:00:00 2001 From: Tunglies Date: Sat, 8 Feb 2025 09:36:04 +0800 Subject: [PATCH] fix: duplicate checked tray menu when profile name are same (#2660) --- src-tauri/src/cmds.rs | 5 ++-- src-tauri/src/config/profiles.rs | 47 +++++++----------------------- src-tauri/src/core/tray/mod.rs | 50 ++++++++++++++++---------------- src-tauri/src/feat.rs | 4 +-- 4 files changed, 39 insertions(+), 67 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index d9b6ce2c..56efc403 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -88,9 +88,8 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult { /// 根据profile name修改profiles #[tauri::command] -pub async fn patch_profiles_config_by_profile_name(profile_name: String) -> CmdResult { - let profile_id = Config::profiles().data().get_profile_uid(&profile_name); - let profiles = IProfiles{current: profile_id, items: None}; +pub async fn patch_profiles_config_by_profile_index(profile_index: String) -> CmdResult { + let profiles = IProfiles{current: Some(profile_index), items: None}; patch_profiles_config(profiles).await } diff --git a/src-tauri/src/config/profiles.rs b/src-tauri/src/config/profiles.rs index 97a13ef7..e7a2c897 100644 --- a/src-tauri/src/config/profiles.rs +++ b/src-tauri/src/config/profiles.rs @@ -465,48 +465,21 @@ impl IProfiles { } } - /// 获取current指向的profile名称 - pub fn current_profile_name(&self) -> Option { - match (self.current.as_ref(), self.items.as_ref()) { - (Some(current), Some(items)) => { - if let Some(item) = items.iter().find(|e| e.uid.as_ref() == Some(current)) { - return item.name.clone(); - } - None - } - _ => None, - } - } - /// 判断profile是否是current指向的 - pub fn is_current_profile(&self, profile_name: &str) -> bool { - match self.current_profile_name() { - Some(current_profile_name) => current_profile_name == profile_name, - None => false, - } + pub fn is_current_profile_index(&self, index: String) -> bool { + self.current == Some(index) } - /// 根据profile名称获取uid - pub fn get_profile_uid(&self, profile_name: &str) -> Option { + /// 获取所有的profiles(uid,名称) + pub fn all_profile_uid_and_name(&self) -> Option> { match self.items.as_ref() { - Some(items) => { - for item in items.iter() { - if item.name.as_ref() == Some(&profile_name.to_string()) { - return item.uid.clone(); - } + Some(items) => Some(items.iter().filter_map(|e| { + if let (Some(uid), Some(name)) = (e.uid.clone(), e.name.clone()) { + Some((uid, name)) + } else { + None } - None - } - None => None, - } - } - - - /// 获取所有的profiles称 - pub fn all_profile_names(&self) -> Option> { - log::info!(target: "app", "{:?}", self.get_items()); - match self.items.as_ref() { - Some(items) => Some(items.iter().filter_map(|e| e.name.clone()).collect()), + }).collect()), None => None, } } diff --git a/src-tauri/src/core/tray/mod.rs b/src-tauri/src/core/tray/mod.rs index 7910bf3e..b6851f52 100644 --- a/src-tauri/src/core/tray/mod.rs +++ b/src-tauri/src/core/tray/mod.rs @@ -124,9 +124,9 @@ impl Tray { .unwrap_or("rule") .to_owned() }; - let profile_names = Config::profiles() + let profile_uid_and_name = Config::profiles() .data() - .all_profile_names() + .all_profile_uid_and_name() .unwrap_or(Vec::new()); let tray = app_handle.tray_by_id("main").unwrap(); @@ -135,7 +135,7 @@ impl Tray { Some(mode.as_str()), *system_proxy, *tun_mode, - profile_names, + profile_uid_and_name, )?)); Ok(()) } @@ -368,7 +368,7 @@ fn create_tray_menu( mode: Option<&str>, system_proxy_enabled: bool, tun_mode_enabled: bool, - profile_names: Vec, + profile_uid_and_name: Vec<(String, String)>, ) -> Result> { let mode = mode.unwrap_or(""); let version = VERSION.get().unwrap(); @@ -388,6 +388,25 @@ fn create_tray_menu( .collect::>() }) .unwrap_or_default(); + + let profile_menu_items: Vec> = profile_uid_and_name + .iter() + .map(|(profile_uid, profile_name)| { + let is_current_profile = Config::profiles().data().is_current_profile_index(profile_uid.to_string()); + CheckMenuItem::with_id( + app_handle, + &format!("profiles_{}", profile_uid), + t(&profile_name), + true, + is_current_profile, + None::<&str>, + ) + .unwrap() + }).collect(); + let profile_menu_items: Vec<&dyn IsMenuItem> = profile_menu_items + .iter() + .map(|item| item as &dyn IsMenuItem) + .collect(); let open_window = &MenuItem::with_id( app_handle, @@ -428,25 +447,6 @@ fn create_tray_menu( ) .unwrap(); - let profile_menu_items: Vec> = profile_names - .iter() - .map(|item| { - let is_current_profile = Config::profiles().data().is_current_profile(item); - CheckMenuItem::with_id( - app_handle, - &format!("profiles_{}", item), - t(&item), - true, - is_current_profile, - None::<&str>, - ) - .unwrap() - }).collect(); - let profile_menu_items: Vec<&dyn IsMenuItem> = profile_menu_items - .iter() - .map(|item| item as &dyn IsMenuItem) - .collect(); - let profiles = &Submenu::with_id_and_items( app_handle, "profiles", @@ -599,8 +599,8 @@ fn on_menu_event(_: &AppHandle, event: MenuEvent) { feat::quit(Some(0)); }, id if id.starts_with("profiles_") => { - let profile_name = &id["profiles_".len()..]; - feat::toggle_proxy_profile(profile_name.into()); + let profile_index = &id["profiles_".len()..]; + feat::toggle_proxy_profile(profile_index.into()); } _ => {} } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0e14a9a9..41d5aeec 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -105,9 +105,9 @@ pub fn toggle_system_proxy() { } // 切换代理文件 -pub fn toggle_proxy_profile(profile_name: String) { +pub fn toggle_proxy_profile(profile_index: String) { tauri::async_runtime::spawn(async move { - match cmds::patch_profiles_config_by_profile_name(profile_name).await { + match cmds::patch_profiles_config_by_profile_index(profile_index).await { Ok(_) => { let _ = tray::Tray::global().update_menu(); handle::Handle::refresh_verge();