This commit is contained in:
sxyazi 2024-03-02 08:06:32 +08:00
parent f9e6e87756
commit 6e548f469f
No known key found for this signature in database
3 changed files with 32 additions and 30 deletions

View file

@ -1,8 +1,8 @@
use std::borrow::Cow; use std::borrow::Cow;
use yazi_shared::{event::Cmd, fs::Url, render}; use yazi_shared::{event::Cmd, fs::Url, render, render_and};
use crate::tab::Tab; use crate::{notify::Notify, tab::Tab};
pub struct Opt<'a> { pub struct Opt<'a> {
url: Option<Cow<'a, Url>>, url: Option<Cow<'a, Url>>,
@ -30,10 +30,17 @@ impl<'a> Tab {
return; return;
}; };
render!(match opt.state { let b = match opt.state {
Some(true) => self.selected.add(&url), Some(true) => render_and!(self.selected.add(&url)),
Some(false) => self.selected.remove(&url), Some(false) => render_and!(self.selected.remove(&url)) | true,
None => self.selected.remove(&url) || self.selected.add(&url), None => render_and!(self.selected.remove(&url) || self.selected.add(&url)),
}); };
if !b {
Notify::_push_warn(
"Select one",
"This file cannot be selected, due to path nesting conflict.",
);
}
} }
} }

View file

@ -1,6 +1,6 @@
use yazi_shared::{event::Cmd, render}; use yazi_shared::{event::Cmd, render};
use crate::tab::Tab; use crate::{notify::Notify, tab::Tab};
pub struct Opt { pub struct Opt {
state: Option<bool>, state: Option<bool>,
@ -23,27 +23,22 @@ impl From<Option<bool>> for Opt {
impl Tab { impl Tab {
pub fn select_all(&mut self, opt: impl Into<Opt>) { pub fn select_all(&mut self, opt: impl Into<Opt>) {
let mut b = false; let iter = self.current.files.iter().map(|f| &f.url);
match opt.into().state { let (removal, addition): (Vec<_>, Vec<_>) = match opt.into().state {
Some(true) => { Some(true) => (vec![], iter.collect()),
for f in self.current.files.iter() { Some(false) => (iter.collect(), vec![]),
// FIXME None => iter.partition(|&u| self.selected.contains(u)),
b |= self.selected.add(&f.url); };
}
} render!(self.selected.remove_many(&removal) > 0);
Some(false) => { let added = self.selected.add_many(&addition);
for f in self.current.files.iter() {
// FIXME render!(added > 0);
b |= self.selected.remove(&f.url); if added != addition.len() {
} Notify::_push_warn(
} "Select all",
None => { "Some files cannot be selected, due to path nesting conflict.",
for f in self.current.files.iter() { );
// FIXME
b |= self.selected.remove(&f.url) || self.selected.add(&f.url);
} }
} }
} }
render!(b);
}
}

View file

@ -53,7 +53,7 @@ impl Selected {
/// ///
/// let url1 = Url::from("/a/b/c"); /// let url1 = Url::from("/a/b/c");
/// let url2 = Url::from("/a/b/d"); /// let url2 = Url::from("/a/b/d");
/// assert!(s.add_many(&[&url1, &url2])); /// assert_eq!(2, s.add_many(&[&url1, &url2]));
/// ``` /// ```
pub fn add_many(&mut self, urls: &[&Url]) -> usize { pub fn add_many(&mut self, urls: &[&Url]) -> usize {
// If it has appeared as a parent // If it has appeared as a parent