From f9da1ee08037c8e9fc0232abfe4bced4f64b655d Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sun, 24 Dec 2023 23:23:31 +0800 Subject: [PATCH] Fix `escape` order and bits --- yazi-core/src/folder/files.rs | 44 ++++++++++++++++++++++++++++ yazi-core/src/tab/commands/escape.rs | 32 ++++++++------------ yazi-core/src/tab/commands/filter.rs | 2 +- 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/yazi-core/src/folder/files.rs b/yazi-core/src/folder/files.rs index 90ad88c2..602bf3e3 100644 --- a/yazi-core/src/folder/files.rs +++ b/yazi-core/src/folder/files.rs @@ -18,6 +18,7 @@ pub struct Files { selected: BTreeSet, sorter: FilesSorter, + filter: Option, 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; + (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; + (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 { diff --git a/yazi-core/src/tab/commands/escape.rs b/yazi-core/src/tab/commands/escape.rs index db748f33..455017fd 100644 --- a/yazi-core/src/tab/commands/escape.rs +++ b/yazi-core/src/tab/commands/escape.rs @@ -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) -> 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 } } diff --git a/yazi-core/src/tab/commands/filter.rs b/yazi-core/src/tab/commands/filter.rs index 9da2c1ee..541e2940 100644 --- a/yazi-core/src/tab/commands/filter.rs +++ b/yazi-core/src/tab/commands/filter.rs @@ -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()) {