Fix escape order and bits

This commit is contained in:
sxyazi 2023-12-24 23:23:31 +08:00
parent 3acadaec1a
commit f9da1ee080
No known key found for this signature in database
3 changed files with 58 additions and 20 deletions

View file

@ -18,6 +18,7 @@ pub struct Files {
selected: BTreeSet<Url>, selected: BTreeSet<Url>,
sorter: FilesSorter, sorter: FilesSorter,
filter: Option<String>,
show_hidden: bool, show_hidden: bool,
} }
@ -34,6 +35,7 @@ impl Default for Files {
selected: Default::default(), selected: Default::default(),
sorter: Default::default(), sorter: Default::default(),
filter: Default::default(),
show_hidden: MANAGER.show_hidden, show_hidden: MANAGER.show_hidden,
} }
} }
@ -289,6 +291,9 @@ impl Files {
return; return;
} }
if !todo.is_empty() {
go!(self.hidden);
b |= !removed.is_empty();
if !hidden.is_empty() { if !hidden.is_empty() {
self.hidden.extend(hidden.into_values()); self.hidden.extend(hidden.into_values());
} }
@ -296,6 +301,7 @@ impl Files {
self.revision += 1; self.revision += 1;
self.items.extend(items.into_values()); self.items.extend(items.into_values());
} }
b
} }
pub fn catchup_revision(&mut self) -> bool { pub fn catchup_revision(&mut self) -> bool {
@ -374,6 +380,44 @@ impl Files {
} }
} }
// --- Filter
pub fn set_filter(&mut self, keyword: &str) -> bool {
if keyword == self.filter.as_deref().unwrap_or_default() {
return false;
}
let old_hidden: Vec<File>;
(self.hidden, old_hidden) =
self.hidden.iter().cloned().partition(|f| !self.show_hidden && f.is_hidden());
if keyword.is_empty() {
self.filter = None;
self.items.extend(old_hidden);
self.sorter.sort(&mut self.items, &self.sizes);
return true;
}
self.filter = Some(keyword.to_owned());
if !old_hidden.is_empty() {
self.items.extend(old_hidden);
self.sorter.sort(&mut self.items, &self.sizes);
}
let hidden: Vec<File>;
(hidden, self.items) = self.items.iter().cloned().partition(|f| {
let Some(filename) = f.url.file_name().and_then(|o| o.to_str()) else {
return true;
};
!filename.to_lowercase().contains(&keyword.to_lowercase())
});
self.hidden.extend(hidden);
true
}
// --- Show hidden // --- Show hidden
pub fn set_show_hidden(&mut self, state: bool) { pub fn set_show_hidden(&mut self, state: bool) {
if self.show_hidden == state { if self.show_hidden == state {

View file

@ -5,11 +5,11 @@ use crate::tab::{Mode, Tab};
bitflags! { bitflags! {
pub struct Opt: u8 { pub struct Opt: u8 {
const FIND = 0b0001; const FIND = 0b00001;
const VISUAL = 0b0010; const VISUAL = 0b00010;
const SELECT = 0b0100; const SELECT = 0b00100;
const SEARCH = 0b1000; const FILTER = 0b01000;
const FILTER = 0b1001; const SEARCH = 0b10000;
} }
} }
@ -20,8 +20,8 @@ impl From<&Exec> for Opt {
b"find" => acc | Self::FIND, b"find" => acc | Self::FIND,
b"visual" => acc | Self::VISUAL, b"visual" => acc | Self::VISUAL,
b"select" => acc | Self::SELECT, b"select" => acc | Self::SELECT,
b"search" => acc | Self::SEARCH,
b"filter" => acc | Self::FILTER, b"filter" => acc | Self::FILTER,
b"search" => acc | Self::SEARCH,
_ => acc, _ => acc,
}) })
} }
@ -45,16 +45,10 @@ impl Tab {
fn escape_select(&mut self) -> bool { self.select_all(Some(false)) } fn escape_select(&mut self) -> bool { self.select_all(Some(false)) }
#[inline] #[inline]
fn escape_search(&mut self) -> bool { self.search_stop() } fn escape_filter(&mut self) -> bool { self.current.files.set_filter("") }
#[inline] #[inline]
fn escape_filter(&mut self) -> bool { fn escape_search(&mut self) -> bool { self.search_stop() }
if self.current.files.filter_keyword.is_some() {
self.current.files.set_filter_keyword("");
return true;
}
false
}
pub fn escape(&mut self, opt: impl Into<Opt>) -> bool { pub fn escape(&mut self, opt: impl Into<Opt>) -> bool {
let opt = opt.into() as Opt; let opt = opt.into() as Opt;
@ -62,8 +56,8 @@ impl Tab {
return self.escape_find() return self.escape_find()
|| self.escape_visual() || self.escape_visual()
|| self.escape_select() || self.escape_select()
|| self.escape_search() || self.escape_filter()
|| self.escape_filter(); || self.escape_search();
} }
let mut b = false; let mut b = false;
@ -76,12 +70,12 @@ impl Tab {
if opt.contains(Opt::SELECT) { if opt.contains(Opt::SELECT) {
b |= self.escape_select(); b |= self.escape_select();
} }
if opt.contains(Opt::SEARCH) {
b |= self.escape_search();
}
if opt.contains(Opt::FILTER) { if opt.contains(Opt::FILTER) {
b |= self.escape_filter(); b |= self.escape_filter();
} }
if opt.contains(Opt::SEARCH) {
b |= self.escape_search();
}
b b
} }
} }

View file

@ -38,7 +38,7 @@ impl Tab {
let hovered = &self.current.hovered().map(|f| f.url()); let hovered = &self.current.hovered().map(|f| f.url());
self.current.files.set_filter_keyword(query); self.current.files.set_filter(query);
if let Some(hovered_url) = hovered { if let Some(hovered_url) = hovered {
match (self.current.files.position(hovered_url), self.current.files.first()) { match (self.current.files.position(hovered_url), self.current.files.first()) {