From 30a14521399c821eb97e9bfe6c61a11b4a012c58 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: Tue, 10 Dec 2024 12:51:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/ui.rs b/src/ui.rs index 8b7fc3d..fb3662a 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -24,6 +24,7 @@ pub struct AppDataCleaner { previous_logging_state: bool, // 记录上一次日志启用状态 ignored_folders: HashSet, // 忽略文件夹集合 move_module: move_module::MoveModule, // 移动模块实例 + expanded_folders: HashSet, // 用于记录哪些文件夹是展开状态 } impl Default for AppDataCleaner { @@ -42,6 +43,7 @@ impl Default for AppDataCleaner { previous_logging_state: false, // 初始时假定日志系统未启用 ignored_folders: ignore::load_ignored_folders(), move_module: Default::default(), + expanded_folders: HashSet::new(), } } } @@ -67,6 +69,69 @@ impl AppDataCleaner { ctx.set_fonts(fonts); } + fn render_folder(&mut self, ui: &mut egui::Ui, folder: &str, size: u64, depth: usize) { + let indent = " ".repeat(depth); // 缩进 + let base_path = utils::get_appdata_dir(&self.selected_appdata_folder); + + ui.horizontal(|ui| { + if let Some(base_path) = &base_path { + let full_path = base_path.join(folder); + if full_path.is_dir() { + let triangle = if self.expanded_folders.contains(folder) { + "▼" + } else { + "▶" + }; + + if ui.button(triangle).clicked() { + if self.expanded_folders.contains(folder) { + self.expanded_folders.remove(folder); + } else { + self.expanded_folders.insert(folder.to_string()); + } + } + } else { + ui.label(" "); + } + } + + ui.label(format!("{indent}{folder}")); + ui.label(utils::format_size(size)); + + // 操作按钮 + if ui.button("彻底删除").clicked() { + self.confirm_delete = Some((folder.to_string(), false)); + } + if ui.button("忽略").clicked() { + self.ignored_folders.insert(folder.to_string()); + ignore::save_ignored_folders(&self.ignored_folders); + logger::log_info(&format!("文件夹 '{}' 已被忽略", folder)); + } + if ui.button("打开").clicked() { + if let Some(base_path) = utils::get_appdata_dir(&self.selected_appdata_folder) { + let full_path = base_path.join(folder); + if let Err(err) = open::open_folder(&full_path) { + logger::log_error(&format!("无法打开文件夹: {}", err)); + } + } + } + }); + + // 递归显示子文件夹 + if self.expanded_folders.contains(folder) { + if let Some(base_path) = &base_path { + let full_path = base_path.join(folder); + if let Ok(entries) = full_path.read_dir() { + for entry in entries.filter_map(Result::ok) { + if entry.path().is_dir() { + let child_folder = entry.file_name().to_string_lossy().to_string(); + self.render_folder(ui, &child_folder, 0, depth + 1); + } + } + } + } + } + } } impl eframe::App for AppDataCleaner {