This commit is contained in:
sxyazi 2023-08-29 11:47:20 +08:00
parent 46e7c4d102
commit b1f03ba841
No known key found for this signature in database
3 changed files with 19 additions and 17 deletions

View file

@ -66,7 +66,7 @@ impl<'a> Widget for Folder<'a> {
let is_selected = self.folder.files.is_selected(f.path()); let is_selected = self.folder.files.is_selected(f.path());
if (!self.is_selection && is_selected) if (!self.is_selection && is_selected)
|| (self.is_selection && mode.pending(i, is_selected)) || (self.is_selection && mode.pending(self.folder.offset() + i, is_selected))
{ {
buf.set_style( buf.set_style(
Rect { x: area.x.saturating_sub(1), y: i as u16 + 1, width: 1, height: 1 }, Rect { x: area.x.saturating_sub(1), y: i as u16 + 1, width: 1, height: 1 },

View file

@ -79,11 +79,7 @@ impl Files {
true true
} }
pub fn select_many(&mut self, path: Option<&Path>, state: Option<bool>) -> bool { pub fn select_all(&mut self, state: Option<bool>) -> bool {
if let Some(path) = path {
return self.select(path, state);
}
match state { match state {
Some(true) => { Some(true) => {
self.selected = self.iter().map(|f| f.path_owned()).collect(); self.selected = self.iter().map(|f| f.path_owned()).collect();
@ -176,19 +172,27 @@ impl Files {
// --- Selected // --- Selected
pub fn selected(&self, pending: &BTreeSet<usize>, unset: bool) -> Vec<&File> { pub fn selected(&self, pending: &BTreeSet<usize>, unset: bool) -> Vec<&File> {
if self.selected.is_empty() && (unset || pending.is_empty()) { if self.selected.is_empty() && (unset || pending.is_empty()) {
return Default::default(); return Vec::new();
} }
let mut items = let selected: BTreeSet<_> = self.selected.iter().collect();
Vec::with_capacity(self.selected.len() + if !unset { pending.len() } else { 0 }); let pending: BTreeSet<_> =
pending.iter().filter_map(|&i| self.items.get(i)).map(|f| &f.path).collect();
for (i, item) in self.iter().enumerate() { let selected: BTreeSet<_> = if unset {
let b = self.selected.contains(&item.path); selected.difference(&pending).cloned().collect()
if !unset && (b || pending.contains(&i)) { } else {
items.push(item); selected.union(&pending).cloned().collect()
} else if unset && b && !pending.contains(&i) { };
let mut items = Vec::with_capacity(selected.len());
for item in &self.items {
if selected.contains(&item.path) {
items.push(item); items.push(item);
} }
if items.len() == selected.len() {
break;
}
} }
items items
} }

View file

@ -191,9 +191,7 @@ impl Tab {
false false
} }
pub fn select_all(&mut self, state: Option<bool>) -> bool { pub fn select_all(&mut self, state: Option<bool>) -> bool { self.current.files.select_all(state) }
self.current.files.select_many(None, state)
}
pub fn visual_mode(&mut self, unset: bool) -> bool { pub fn visual_mode(&mut self, unset: bool) -> bool {
let idx = self.current.cursor(); let idx = self.current.cursor();