From ce6c8b70f436248ec62312da9b429fcec7e2f96d Mon Sep 17 00:00:00 2001 From: xiaji Date: Wed, 10 Jun 2026 12:27:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(scan):=20=E9=98=B6=E6=AE=B51=20=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E6=98=BE=E7=A4=BA=E5=BD=93=E5=89=8D=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E7=9A=84=E7=9B=AE=E5=BD=95=E4=B8=8E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - walker: ProgressFn 签名增加 Option<&Path> 文件参数;每个文件命中时回调 - runner: on_progress 把当前文件写入 current_file 共享槽 - home: 阶段1 卡片新增 📄 当前文件:xxx 实时显示 --- src/scan/runner.rs | 6 +++++- src/scan/walker.rs | 13 ++++++++++++- src/ui/home.rs | 12 ++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/scan/runner.rs b/src/scan/runner.rs index 58a1cd8..ed77846 100644 --- a/src/scan/runner.rs +++ b/src/scan/runner.rs @@ -73,10 +73,14 @@ pub async fn run( let scan_scanned_cb = Arc::clone(&scan_scanned); let scan_found_cb = Arc::clone(&scan_found); let scan_dir_cb = Arc::clone(&scan_current_dir); - let mut on_progress = |_scanned: usize, found: usize, dir: &std::path::Path| { + let cur_file_cb = Arc::clone(¤t_file); + let mut on_progress = |_scanned: usize, found: usize, dir: &std::path::Path, file: Option<&std::path::Path>| { scan_scanned_cb.fetch_add(1, std::sync::atomic::Ordering::Relaxed); scan_found_cb.store(found, std::sync::atomic::Ordering::Relaxed); if let Ok(mut g) = scan_dir_cb.lock() { *g = dir.display().to_string(); } + if let Some(f) = file { + if let Ok(mut g) = cur_file_cb.lock() { *g = Some(f.display().to_string()); } + } }; let candidates = walker::walk(&cfg.scan, &cancel, |s| push_log(s.to_string()), &mut on_progress); let scan_ms = scan_started.elapsed().as_millis(); diff --git a/src/scan/walker.rs b/src/scan/walker.rs index 961b3dc..eaf1562 100644 --- a/src/scan/walker.rs +++ b/src/scan/walker.rs @@ -11,7 +11,8 @@ use crate::scan::filter; /// - scanned_so_far: 已扫描的文件总数(仅候选类型) /// - found_so_far: 当前累计已收纳的候选数 /// - current_dir: 当前正在扫描的目录路径 -pub type ProgressFn<'a> = &'a mut dyn FnMut(usize, usize, &Path); +/// - current_file: 当前正在评估的文件路径(若是目录则为 None) +pub type ProgressFn<'a> = &'a mut dyn FnMut(usize, usize, &Path, Option<&Path>); /// 遍历全盘,输出满足条件的文件路径 pub fn walk( @@ -58,6 +59,7 @@ pub fn walk( scanned.load(Ordering::Relaxed), found.load(Ordering::Relaxed), p, + None, ); } } @@ -65,6 +67,15 @@ pub fn walk( } scanned.fetch_add(1, Ordering::Relaxed); + // 先把当前文件(及所在目录)回调给 UI,便于实时显示 + let parent = p.parent().unwrap_or(p); + progress( + scanned.load(Ordering::Relaxed), + found.load(Ordering::Relaxed), + parent, + Some(p), + ); + if filter::is_whitelisted(p, &s.whitelist) { continue; } if !s.include_hidden && filter::is_hidden(p) { continue; } if !s.include_system && filter::is_system(p) { continue; } diff --git a/src/ui/home.rs b/src/ui/home.rs index 5615922..599a5ea 100644 --- a/src/ui/home.rs +++ b/src/ui/home.rs @@ -94,6 +94,18 @@ pub fn draw(ui: &mut egui::Ui, app: &mut App) { }); } } + // 当前文件(仅在扫描阶段显示当前正在评估的文件) + if is_scanning { + if let Ok(cur) = app.current_file.lock() { + if let Some(f) = cur.as_ref() { + ui.add_space(2.0); + ui.horizontal(|ui| { + ui.label("📄 当前文件:"); + ui.label(egui::RichText::new(shorten_path(f, 100)).monospace().color(material::PRIMARY_DARK)); + }); + } + } + } }); ui.add_space(6.0);