mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
Simplify the code further
This commit is contained in:
parent
4b63196731
commit
4407d5e2e2
5 changed files with 49 additions and 50 deletions
|
|
@ -40,7 +40,7 @@ impl Tab {
|
||||||
let state = self.mode.is_select();
|
let state = self.mode.is_select();
|
||||||
for f in indices.iter().filter_map(|i| self.current.files.get(*i)) {
|
for f in indices.iter().filter_map(|i| self.current.files.get(*i)) {
|
||||||
if state {
|
if state {
|
||||||
self.selected.insert(f.url());
|
self.selected.add(&f.url);
|
||||||
} else {
|
} else {
|
||||||
self.selected.remove(&f.url);
|
self.selected.remove(&f.url);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,9 @@ impl<'a> Tab {
|
||||||
};
|
};
|
||||||
|
|
||||||
render!(match opt.state {
|
render!(match opt.state {
|
||||||
Some(true) => self.selected.insert(url.into_owned()),
|
Some(true) => self.selected.add(&url),
|
||||||
Some(false) => self.selected.remove(&url),
|
Some(false) => self.selected.remove(&url),
|
||||||
None => self.selected.remove(&url) || self.selected.insert(url.into_owned()),
|
None => self.selected.remove(&url) || self.selected.add(&url),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ impl Tab {
|
||||||
match opt.into().state {
|
match opt.into().state {
|
||||||
Some(true) => {
|
Some(true) => {
|
||||||
for f in self.current.files.iter() {
|
for f in self.current.files.iter() {
|
||||||
b |= self.selected.insert(f.url());
|
b |= self.selected.add(&f.url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(false) => {
|
Some(false) => {
|
||||||
|
|
@ -37,7 +37,7 @@ impl Tab {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
for f in self.current.files.iter() {
|
for f in self.current.files.iter() {
|
||||||
b |= self.selected.remove(&f.url) || self.selected.insert(f.url());
|
b |= self.selected.remove(&f.url) || self.selected.add(&f.url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::{BTreeSet, HashMap};
|
use std::{collections::{BTreeSet, HashMap}, ops::Deref};
|
||||||
|
|
||||||
use yazi_shared::fs::Url;
|
use yazi_shared::fs::Url;
|
||||||
|
|
||||||
|
|
@ -8,12 +8,16 @@ pub struct Selected {
|
||||||
parents: HashMap<Url, usize>,
|
parents: HashMap<Url, usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Deref for Selected {
|
||||||
|
type Target = BTreeSet<Url>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target { &self.inner }
|
||||||
|
}
|
||||||
|
|
||||||
impl Selected {
|
impl Selected {
|
||||||
pub fn get_inner(&self) -> BTreeSet<Url> { self.inner.clone() }
|
pub fn add(&mut self, url: &Url) -> bool { self.add_many(&[url]) }
|
||||||
|
|
||||||
pub fn insert(&mut self, url: Url) -> bool { self.insert_many(&[&url]) }
|
pub fn add_many(&mut self, urls: &[&Url]) -> bool {
|
||||||
|
|
||||||
pub fn insert_many(&mut self, urls: &[&Url]) -> bool {
|
|
||||||
if urls.is_empty() {
|
if urls.is_empty() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -36,7 +40,7 @@ impl Selected {
|
||||||
*self.parents.entry(u).or_insert(0) += urls.len();
|
*self.parents.entry(u).or_insert(0) += urls.len();
|
||||||
}
|
}
|
||||||
|
|
||||||
self.inner.extend(urls.iter().cloned().cloned());
|
self.inner.extend(urls.iter().map(|&u| u.clone()));
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,27 +51,22 @@ impl Selected {
|
||||||
|
|
||||||
let mut parent = url.parent_url();
|
let mut parent = url.parent_url();
|
||||||
while let Some(u) = parent {
|
while let Some(u) = parent {
|
||||||
parent = u.parent_url();
|
let n = self.parents.get_mut(&u).unwrap();
|
||||||
|
if *n == 1 {
|
||||||
let counter = self.parents.entry(u.clone()).or_insert(0);
|
|
||||||
*counter -= 1;
|
|
||||||
if *counter == 0 {
|
|
||||||
self.parents.remove(&u);
|
self.parents.remove(&u);
|
||||||
|
} else {
|
||||||
|
*n -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parent = u.parent_url();
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_empty(&self) -> bool { self.inner.is_empty() }
|
|
||||||
|
|
||||||
pub fn clear(&mut self) {
|
pub fn clear(&mut self) {
|
||||||
self.parents.clear();
|
|
||||||
self.inner.clear();
|
self.inner.clear();
|
||||||
|
self.parents.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iter(&self) -> std::collections::btree_set::Iter<Url> { self.inner.iter() }
|
|
||||||
|
|
||||||
pub fn contains(&self, url: &Url) -> bool { self.inner.contains(url) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
@ -78,8 +77,8 @@ mod tests {
|
||||||
fn test_insert_non_conflicting() {
|
fn test_insert_non_conflicting() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert(Url::from("/a/b")));
|
assert!(s.add(&Url::from("/a/b")));
|
||||||
assert!(s.insert(Url::from("/c/d")));
|
assert!(s.add(&Url::from("/c/d")));
|
||||||
assert_eq!(s.inner.len(), 2);
|
assert_eq!(s.inner.len(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,25 +86,27 @@ mod tests {
|
||||||
fn test_insert_conflicting_parent() {
|
fn test_insert_conflicting_parent() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert(Url::from("/a")));
|
assert!(s.add(&Url::from("/a")));
|
||||||
assert!(!s.insert(Url::from("/a/b")));
|
assert!(!s.add(&Url::from("/a/b")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_insert_conflicting_child() {
|
fn test_insert_conflicting_child() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert(Url::from("/a/b/c")));
|
assert!(s.add(&Url::from("/a/b/c")));
|
||||||
assert!(!s.insert(Url::from("/a/b")));
|
assert!(!s.add(&Url::from("/a/b")));
|
||||||
assert!(s.insert(Url::from("/a/b/d")));
|
assert!(s.add(&Url::from("/a/b/d")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove() {
|
fn test_remove() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert(Url::from("/a/b")));
|
assert!(s.add(&Url::from("/a/b")));
|
||||||
|
assert!(!s.remove(&Url::from("/a/c")));
|
||||||
assert!(s.remove(&Url::from("/a/b")));
|
assert!(s.remove(&Url::from("/a/b")));
|
||||||
|
assert!(!s.remove(&Url::from("/a/b")));
|
||||||
assert!(s.inner.is_empty());
|
assert!(s.inner.is_empty());
|
||||||
assert!(s.parents.is_empty());
|
assert!(s.parents.is_empty());
|
||||||
}
|
}
|
||||||
|
|
@ -114,7 +115,7 @@ mod tests {
|
||||||
fn insert_many_success() {
|
fn insert_many_success() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert_many(&[
|
assert!(s.add_many(&[
|
||||||
&Url::from("/parent/child1"),
|
&Url::from("/parent/child1"),
|
||||||
&Url::from("/parent/child2"),
|
&Url::from("/parent/child2"),
|
||||||
&Url::from("/parent/child3")
|
&Url::from("/parent/child3")
|
||||||
|
|
@ -125,63 +126,61 @@ mod tests {
|
||||||
fn insert_many_with_existing_parent_fails() {
|
fn insert_many_with_existing_parent_fails() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/parent"));
|
s.add(&Url::from("/parent"));
|
||||||
assert!(!s.insert_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2"),]));
|
assert!(!s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2"),]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_with_existing_child_fails() {
|
fn insert_many_with_existing_child_fails() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/parent/child1"));
|
s.add(&Url::from("/parent/child1"));
|
||||||
assert!(s.insert_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2")]));
|
assert!(s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2")]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_empty_urls_list() {
|
fn insert_many_empty_urls_list() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert_many(&[]));
|
assert!(s.add_many(&[]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_with_parent_as_child_of_another_url() {
|
fn insert_many_with_parent_as_child_of_another_url() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/parent/child"));
|
s.add(&Url::from("/parent/child"));
|
||||||
assert!(
|
assert!(!s.add_many(&[&Url::from("/parent/child/child1"), &Url::from("/parent/child/child2")]));
|
||||||
!s.insert_many(&[&Url::from("/parent/child/child1"), &Url::from("/parent/child/child2")])
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_with_direct_parent_fails() {
|
fn insert_many_with_direct_parent_fails() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/a"));
|
s.add(&Url::from("/a"));
|
||||||
assert!(!s.insert_many(&[&Url::from("/a/b")]));
|
assert!(!s.add_many(&[&Url::from("/a/b")]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_with_nested_child_fails() {
|
fn insert_many_with_nested_child_fails() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/a/b"));
|
s.add(&Url::from("/a/b"));
|
||||||
assert!(!s.insert_many(&[&Url::from("/a")]));
|
assert!(!s.add_many(&[&Url::from("/a")]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_sibling_directories_success() {
|
fn insert_many_sibling_directories_success() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
assert!(s.insert_many(&[&Url::from("/a/b"), &Url::from("/a/c")]));
|
assert!(s.add_many(&[&Url::from("/a/b"), &Url::from("/a/c")]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_many_with_grandchild_fails() {
|
fn insert_many_with_grandchild_fails() {
|
||||||
let mut s = Selected::default();
|
let mut s = Selected::default();
|
||||||
|
|
||||||
s.insert(Url::from("/a/b"));
|
s.add(&Url::from("/a/b"));
|
||||||
assert!(!s.insert_many(&[&Url::from("/a/b/c")]));
|
assert!(!s.add_many(&[&Url::from("/a/b/c")]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -191,7 +190,7 @@ mod tests {
|
||||||
let child1 = Url::from("/parent/child1");
|
let child1 = Url::from("/parent/child1");
|
||||||
let child2 = Url::from("/parent/child2");
|
let child2 = Url::from("/parent/child2");
|
||||||
let child3 = Url::from("/parent/child3");
|
let child3 = Url::from("/parent/child3");
|
||||||
assert!(s.insert_many(&[&child1, &child2, &child3]));
|
assert!(s.add_many(&[&child1, &child2, &child3]));
|
||||||
|
|
||||||
assert!(s.remove(&child1));
|
assert!(s.remove(&child1));
|
||||||
assert_eq!(s.inner.len(), 2);
|
assert_eq!(s.inner.len(), 2);
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ impl Tab {
|
||||||
me.parent.as_ref().map(|f| Folder::make(None, f, me)).transpose()
|
me.parent.as_ref().map(|f| Folder::make(None, f, me)).transpose()
|
||||||
});
|
});
|
||||||
|
|
||||||
reg.add_field_method_get("selected", |_, me| Selected::make(&me.selected.get_inner()));
|
reg.add_field_method_get("selected", |_, me| Selected::make(&me.selected));
|
||||||
|
|
||||||
reg.add_field_method_get("preview", |_, me| Preview::make(me));
|
reg.add_field_method_get("preview", |_, me| Preview::make(me));
|
||||||
})?;
|
})?;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue