fix: duplicate checked tray menu when profile name are same (#2660)

This commit is contained in:
Tunglies 2025-02-08 09:36:04 +08:00 committed by GitHub
parent db593fb188
commit 63bd0c87b2
4 changed files with 39 additions and 67 deletions

View File

@ -88,9 +88,8 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult {
/// 根据profile name修改profiles /// 根据profile name修改profiles
#[tauri::command] #[tauri::command]
pub async fn patch_profiles_config_by_profile_name(profile_name: String) -> CmdResult { pub async fn patch_profiles_config_by_profile_index(profile_index: String) -> CmdResult {
let profile_id = Config::profiles().data().get_profile_uid(&profile_name); let profiles = IProfiles{current: Some(profile_index), items: None};
let profiles = IProfiles{current: profile_id, items: None};
patch_profiles_config(profiles).await patch_profiles_config(profiles).await
} }

View File

@ -465,48 +465,21 @@ impl IProfiles {
} }
} }
/// 获取current指向的profile名称
pub fn current_profile_name(&self) -> Option<String> {
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指向的 /// 判断profile是否是current指向的
pub fn is_current_profile(&self, profile_name: &str) -> bool { pub fn is_current_profile_index(&self, index: String) -> bool {
match self.current_profile_name() { self.current == Some(index)
Some(current_profile_name) => current_profile_name == profile_name,
None => false,
}
} }
/// 根据profile名称获取uid /// 获取所有的profiles(uid名称)
pub fn get_profile_uid(&self, profile_name: &str) -> Option<String> { pub fn all_profile_uid_and_name(&self) -> Option<Vec<(String, String)>> {
match self.items.as_ref() { match self.items.as_ref() {
Some(items) => { Some(items) => Some(items.iter().filter_map(|e| {
for item in items.iter() { if let (Some(uid), Some(name)) = (e.uid.clone(), e.name.clone()) {
if item.name.as_ref() == Some(&profile_name.to_string()) { Some((uid, name))
return item.uid.clone(); } else {
} None
} }
None }).collect()),
}
None => None,
}
}
/// 获取所有的profiles称
pub fn all_profile_names(&self) -> Option<Vec<String>> {
log::info!(target: "app", "{:?}", self.get_items());
match self.items.as_ref() {
Some(items) => Some(items.iter().filter_map(|e| e.name.clone()).collect()),
None => None, None => None,
} }
} }

View File

@ -124,9 +124,9 @@ impl Tray {
.unwrap_or("rule") .unwrap_or("rule")
.to_owned() .to_owned()
}; };
let profile_names = Config::profiles() let profile_uid_and_name = Config::profiles()
.data() .data()
.all_profile_names() .all_profile_uid_and_name()
.unwrap_or(Vec::new()); .unwrap_or(Vec::new());
let tray = app_handle.tray_by_id("main").unwrap(); let tray = app_handle.tray_by_id("main").unwrap();
@ -135,7 +135,7 @@ impl Tray {
Some(mode.as_str()), Some(mode.as_str()),
*system_proxy, *system_proxy,
*tun_mode, *tun_mode,
profile_names, profile_uid_and_name,
)?)); )?));
Ok(()) Ok(())
} }
@ -368,7 +368,7 @@ fn create_tray_menu(
mode: Option<&str>, mode: Option<&str>,
system_proxy_enabled: bool, system_proxy_enabled: bool,
tun_mode_enabled: bool, tun_mode_enabled: bool,
profile_names: Vec<String>, profile_uid_and_name: Vec<(String, String)>,
) -> Result<tauri::menu::Menu<Wry>> { ) -> Result<tauri::menu::Menu<Wry>> {
let mode = mode.unwrap_or(""); let mode = mode.unwrap_or("");
let version = VERSION.get().unwrap(); let version = VERSION.get().unwrap();
@ -388,6 +388,25 @@ fn create_tray_menu(
.collect::<std::collections::HashMap<String, String>>() .collect::<std::collections::HashMap<String, String>>()
}) })
.unwrap_or_default(); .unwrap_or_default();
let profile_menu_items: Vec<CheckMenuItem<Wry>> = 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<Wry>> = profile_menu_items
.iter()
.map(|item| item as &dyn IsMenuItem<Wry>)
.collect();
let open_window = &MenuItem::with_id( let open_window = &MenuItem::with_id(
app_handle, app_handle,
@ -428,25 +447,6 @@ fn create_tray_menu(
) )
.unwrap(); .unwrap();
let profile_menu_items: Vec<CheckMenuItem<Wry>> = 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<Wry>> = profile_menu_items
.iter()
.map(|item| item as &dyn IsMenuItem<Wry>)
.collect();
let profiles = &Submenu::with_id_and_items( let profiles = &Submenu::with_id_and_items(
app_handle, app_handle,
"profiles", "profiles",
@ -599,8 +599,8 @@ fn on_menu_event(_: &AppHandle, event: MenuEvent) {
feat::quit(Some(0)); feat::quit(Some(0));
}, },
id if id.starts_with("profiles_") => { id if id.starts_with("profiles_") => {
let profile_name = &id["profiles_".len()..]; let profile_index = &id["profiles_".len()..];
feat::toggle_proxy_profile(profile_name.into()); feat::toggle_proxy_profile(profile_index.into());
} }
_ => {} _ => {}
} }

View File

@ -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 { 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(_) => { Ok(_) => {
let _ = tray::Tray::global().update_menu(); let _ = tray::Tray::global().update_menu();
handle::Handle::refresh_verge(); handle::Handle::refresh_verge();