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>,
sorter: FilesSorter,
filter: Option<String>,
show_hidden: bool,
}
@ -34,6 +35,7 @@ impl Default for Files {
selected: Default::default(),
sorter: Default::default(),
filter: Default::default(),
show_hidden: MANAGER.show_hidden,
}
}
@ -289,6 +291,9 @@ impl Files {
return;
}
if !todo.is_empty() {
go!(self.hidden);
b |= !removed.is_empty();
if !hidden.is_empty() {
self.hidden.extend(hidden.into_values());
}
@ -296,6 +301,7 @@ impl Files {
self.revision += 1;
self.items.extend(items.into_values());
}
b
}
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
pub fn set_show_hidden(&mut self, state: bool) {
if self.show_hidden == state {

View file

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

View file

@ -38,7 +38,7 @@ impl Tab {
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 {
match (self.current.files.position(hovered_url), self.current.files.first()) {