From 8c17518e55709b68328dc4fbc3a271fbb0f4321c 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: Wed, 11 Dec 2024 01:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 ++ folders_description.yaml | 23 +++++++++++++++++++++++ src/main.rs | 13 +++++++------ src/ui.rs | 22 ++++++++++++++++++++++ src/yaml_loader.rs | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 folders_description.yaml create mode 100644 src/yaml_loader.rs diff --git a/Cargo.toml b/Cargo.toml index 74b080e..729a628 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,5 @@ log = "0.4" simplelog = "0.12" sha2 = "0.10" native-dialog = "0.7.0" +serde = { version = "1.0", features = ["derive"] } +serde_yaml = "0.9.34+deprecated" diff --git a/folders_description.yaml b/folders_description.yaml new file mode 100644 index 0000000..fa41640 --- /dev/null +++ b/folders_description.yaml @@ -0,0 +1,23 @@ +Roaming: + # 示例:文件夹名: "描述" + Code: "VSCode" + pip: "pip 网络配置文件" + Mozilla: "Firefox" + #firefox: "Mozilla Firefox 浏览器配置文件" + clash_win: "Clash for Windows 配置文件" + VMWare: "VMWare 配置文件" + Motrix: "Motrix 配置文件" + zen: "Zen 网络配置" +Local: + BCUT: "必剪数据" + Temp: "系统临时文件" + myapp: "自定义应用配置文件" + Packages: "UWP 程序数据" + Chromium: "Chromium 用户数据" + Google: "Google 系软件数据" + pip: "pip 下载目录" + Programs: "Python 解释器安装目录" + Obsidian: "Obsidian 安装位置" + zen: "Zen 浏览器用户数据" + rustdesk: "RustDesk 用户数据" +LocalLow: \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4b90140..5f55cc1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,14 @@ -mod about; // 关于界面 +mod about; // 关于界面 mod confirmation; // 确认删除模块 -mod delete; // 引入删除模块 -mod scanner; // 引入扫盘模块 -mod ui; // 引入 ui 模块 -mod utils; // 文件夹大小计算模块 -mod logger; // 引入日志模块 +mod delete; // 引入删除模块 mod ignore; // 引入忽略模块 +mod logger; // 引入日志模块 mod move_module; mod open; +mod scanner; // 引入扫盘模块 +mod ui; // 引入 ui 模块 +mod utils; // 文件夹大小计算模块 +mod yaml_loader; use ui::AppDataCleaner; diff --git a/src/ui.rs b/src/ui.rs index 8b7fc3d..4cdfa5d 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -7,6 +7,7 @@ use crate::move_module; // 导入移动模块 use crate::open; use crate::scanner; use crate::utils; +use crate::yaml_loader::FolderDescriptions; use eframe::egui::{self, Grid, ScrollArea}; use std::collections::HashSet; use std::sync::mpsc::{Receiver, Sender}; @@ -24,6 +25,7 @@ pub struct AppDataCleaner { previous_logging_state: bool, // 记录上一次日志启用状态 ignored_folders: HashSet, // 忽略文件夹集合 move_module: move_module::MoveModule, // 移动模块实例 + folder_descriptions: Option, } impl Default for AppDataCleaner { @@ -42,6 +44,7 @@ impl Default for AppDataCleaner { previous_logging_state: false, // 初始时假定日志系统未启用 ignored_folders: ignore::load_ignored_folders(), move_module: Default::default(), + folder_descriptions: None, } } } @@ -73,6 +76,14 @@ impl eframe::App for AppDataCleaner { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { self.setup_custom_fonts(ctx); + // 加载描述文件 + if self.folder_descriptions.is_none() { + match FolderDescriptions::load_from_yaml("folders_description.yaml") { + Ok(descriptions) => self.folder_descriptions = Some(descriptions), + Err(e) => eprintln!("加载 YAML 文件失败: {}", e), + } + } + if self.is_logging_enabled != self.previous_logging_state { logger::init_logger(self.is_logging_enabled); // 初始化日志系统 if self.is_logging_enabled { @@ -157,6 +168,7 @@ impl eframe::App for AppDataCleaner { Grid::new("folders_table").striped(true).show(ui, |ui| { ui.label("文件夹"); ui.label("大小"); + ui.label("描述"); ui.label("操作"); ui.end_row(); @@ -173,6 +185,16 @@ impl eframe::App for AppDataCleaner { } ui.label(utils::format_size(*size)); + // 读取描述信息并显示 + let description = self.folder_descriptions.as_ref().and_then(|desc| { + desc.get_description(folder, &self.selected_appdata_folder) + }); + if let Some(desc) = description { + ui.label(desc); + } else { + ui.label("无描述"); + } + if !self.ignored_folders.contains(folder) { if ui.button("彻底删除").clicked() { self.confirm_delete = Some((folder.clone(), false)); diff --git a/src/yaml_loader.rs b/src/yaml_loader.rs new file mode 100644 index 0000000..6edc5a4 --- /dev/null +++ b/src/yaml_loader.rs @@ -0,0 +1,36 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fs; +use std::path::Path; + +#[derive(Debug, Serialize, Deserialize)] +pub struct FolderDescriptions { + pub Roaming: HashMap, + pub Local: HashMap, + pub LocalLow: HashMap, +} + +impl FolderDescriptions { + pub fn load_from_yaml(file_path: &str) -> Result { + let path = Path::new(file_path); + if !path.exists() { + return Err("YAML 文件未找到".to_string()); + } + + let content = fs::read_to_string(path).map_err(|e| format!("读取 YAML 文件失败: {}", e))?; + + let descriptions: FolderDescriptions = + serde_yaml::from_str(&content).map_err(|e| format!("解析 YAML 文件失败: {}", e))?; + + Ok(descriptions) + } + + pub fn get_description(&self, folder_name: &str, folder_type: &str) -> Option { + match folder_type { + "Roaming" => self.Roaming.get(folder_name).cloned(), + "Local" => self.Local.get(folder_name).cloned(), + "LocalLow" => self.LocalLow.get(folder_name).cloned(), + _ => None, + } + } +}