From 765e196d159bd78e5e19d2229ec3a6a56e578621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E7=94=9F=E6=9D=82=E7=89=A9=E6=88=BF?= <88823709+TC999@users.noreply.github.com> Date: Sat, 8 Feb 2025 10:59:20 +0800 Subject: [PATCH] =?UTF-8?q?yaml=20=E7=BC=96=E8=BE=91=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++- src/yaml_loader.rs | 21 ++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/ui.rs b/src/ui.rs index 2343e2d..9eb3afa 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -28,6 +28,8 @@ pub struct AppDataCleaner { folder_descriptions: Option, yaml_error_logged: bool, // 新增字段,用于标记是否已经记录过错误 status: Option, // 添加 status 字段 + editing_folder: Option<(String, String)>, // 当前编辑的文件夹和描述 + show_edit_window: bool, // 控制编辑窗口的显示 } impl Default for AppDataCleaner { @@ -75,6 +77,10 @@ impl AppDataCleaner { ctx.set_fonts(fonts); } + + fn edit_description(&mut self, folder: &str, description: String) { + self.editing_folder = Some((folder.to_string(), description)); + self.show_edit_window = true; } impl eframe::App for AppDataCleaner { @@ -183,6 +189,13 @@ impl eframe::App for AppDataCleaner { ui.label("无描述"); } + // 编辑按钮 + if ui.button("编辑描述").clicked() { + // 打开编辑窗口 + // 传递当前文件夹名称和描述 + self.edit_description(folder, description.unwrap_or("".to_string())); + } + if !self.ignored_folders.contains(folder) { if ui.button("彻底删除").clicked() { self.confirm_delete = Some((folder.clone(), false)); @@ -205,6 +218,21 @@ impl eframe::App for AppDataCleaner { response1 | response2 | response3 // 返回合并的 Response }); } + // 显示编辑窗口 + if self.show_edit_window { + egui::Window::new("编辑描述") + .open(&mut self.show_edit_window) + .show(ctx, |ui| { + if let Some((ref folder, ref mut description)) = self.editing_folder { + ui.label(format!("文件夹: {}", folder)); + ui.text_edit_singleline(description); + if ui.button("保存").clicked() { + self.save_description(folder, description); + self.show_edit_window = false; + } + } + }); + } if ui.button("打开").clicked() { if let Some(base_path) = utils::get_appdata_dir(&self.selected_appdata_folder) @@ -221,6 +249,38 @@ impl eframe::App for AppDataCleaner { }); }); + fn save_description(&mut self, folder: &str, description: &str) { + // 加载现有描述文件 + let mut folder_descriptions = self + .folder_descriptions + .clone() + .unwrap_or_else(|| FolderDescriptions::default()); + + // 更新描述 + match self.selected_appdata_folder.as_str() { + "Roaming" => { + folder_descriptions.Roaming.insert(folder.to_string(), description.to_string()); + } + "Local" => { + folder_descriptions.Local.insert(folder.to_string(), description.to_string()); + } + "LocalLow" => { + folder_descriptions.LocalLow.insert(folder.to_string(), description.to_string()); + } + _ => {} + } + + // 保存到 YAML 文件 + if let Err(e) = crate::yaml_loader::save_folder_descriptions("folders_description.yaml", &folder_descriptions) { + logger::log_error(&format!("保存 YAML 文件失败: {}", e)); + } else { + logger::log_info("描述已保存"); + } + + // 更新内存中的描述文件 + self.folder_descriptions = Some(folder_descriptions); + } + // 关于窗口 if self.show_about_window { about::show_about_window(ctx, &mut self.show_about_window); @@ -229,4 +289,4 @@ impl eframe::App for AppDataCleaner { // 显示移动窗口 self.move_module.show_move_window(ctx); } -} \ No newline at end of file +} diff --git a/src/yaml_loader.rs b/src/yaml_loader.rs index b297077..182702b 100644 --- a/src/yaml_loader.rs +++ b/src/yaml_loader.rs @@ -1,6 +1,8 @@ use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fs; +use std::fs::File; +use std::io::Write; use std::path::Path; #[derive(Debug, Serialize, Deserialize)] @@ -36,7 +38,10 @@ impl FolderDescriptions { } // 新增函数,用于加载文件夹描述 -pub fn load_folder_descriptions(file_path: &str, yaml_error_logged: &mut bool) -> Option { +pub fn load_folder_descriptions( + file_path: &str, + yaml_error_logged: &mut bool, +) -> Option { match FolderDescriptions::load_from_yaml(file_path) { Ok(descriptions) => Some(descriptions), Err(e) => { @@ -48,4 +53,16 @@ pub fn load_folder_descriptions(file_path: &str, yaml_error_logged: &mut bool) - None } } -} \ No newline at end of file +} + +pub fn save_folder_descriptions( + file_path: &str, + descriptions: &FolderDescriptions, +) -> Result<(), String> { + let yaml_string = + serde_yaml::to_string(descriptions).map_err(|e| format!("序列化 YAML 失败: {}", e))?; + let mut file = File::create(file_path).map_err(|e| format!("创建 YAML 文件失败: {}", e))?; + file.write_all(yaml_string.as_bytes()) + .map_err(|e| format!("写入 YAML 文件失败: {}", e))?; + Ok(()) +}