diff --git a/local/recipes/tui/tlc/source/src/filemanager/panel.rs b/local/recipes/tui/tlc/source/src/filemanager/panel.rs index f321063c40..91ef06f6f7 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/panel.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/panel.rs @@ -424,8 +424,14 @@ impl Panel { } } - /// Mark entries matching `pattern` (Unix glob). + /// Mark entries matching `pattern` (Unix glob). An empty pattern + /// marks every regular entry (skipping `..`), matching MC's + /// "Select group" behavior with an empty expression. pub fn mark_pattern(&mut self, pattern: &str) { + if pattern.is_empty() { + self.reverse_marks(); + return; + } for e in &self.entries { if glob_match(pattern, &e.name) { self.marked.insert(e.name.clone()); @@ -433,8 +439,14 @@ impl Panel { } } - /// Unmark entries matching `pattern` (Unix glob). + /// Unmark entries matching `pattern` (Unix glob). An empty + /// pattern clears every mark (matching MC's "Unselect group" + /// with an empty expression). pub fn unmark_pattern(&mut self, pattern: &str) { + if pattern.is_empty() { + self.marked.clear(); + return; + } let to_remove: Vec = self .entries .iter() @@ -1238,6 +1250,40 @@ mod tests { let _ = fs::remove_dir_all(&dir); } + #[test] + fn mark_pattern_empty_inverts_marks() { + let dir = std::env::temp_dir().join("tlc-panel-mark-empty-test"); + let _ = fs::remove_dir_all(&dir); + fs::create_dir_all(&dir).unwrap(); + fs::write(dir.join("a.txt"), b"x").unwrap(); + fs::write(dir.join("b.txt"), b"x").unwrap(); + let mut p = Panel::new(&dir, &empty_cfg()).unwrap(); + // Empty pattern inverts: from 0 marks → all entries marked + // (skipping '..'). + p.mark_pattern(""); + assert_eq!(p.marked_count(), 2); + // Apply again: 2 marks → 0 marks. + p.mark_pattern(""); + assert_eq!(p.marked_count(), 0); + let _ = fs::remove_dir_all(&dir); + } + + #[test] + fn unmark_pattern_empty_clears_all_marks() { + let dir = std::env::temp_dir().join("tlc-panel-unmark-empty-test"); + let _ = fs::remove_dir_all(&dir); + fs::create_dir_all(&dir).unwrap(); + fs::write(dir.join("a.txt"), b"x").unwrap(); + fs::write(dir.join("b.txt"), b"x").unwrap(); + let mut p = Panel::new(&dir, &empty_cfg()).unwrap(); + p.mark_pattern("*.txt"); + assert_eq!(p.marked_count(), 2); + // Empty pattern clears every mark. + p.unmark_pattern(""); + assert_eq!(p.marked_count(), 0); + let _ = fs::remove_dir_all(&dir); + } + #[test] fn test_is_archive_extension_tar() { assert_eq!(is_archive_extension("foo.tar"), Some("tar"));