diff options
author | qkzk <qu3nt1n@gmail.com> | 2024-02-29 14:44:57 +0100 |
---|---|---|
committer | qkzk <qu3nt1n@gmail.com> | 2024-02-29 14:44:57 +0100 |
commit | d58dfb584b7b1fa328eb003eaf9b2d7eddf9e949 (patch) | |
tree | efee71b98851ade9f5139c3ef0ed14ad5bc4e7aa | |
parent | c8b4bbc83628f43f0d703584a2589f4634c8f3f9 (diff) |
dynamic filtering while typing
-rw-r--r-- | development.md | 3 | ||||
-rw-r--r-- | src/app/status.rs | 26 | ||||
-rw-r--r-- | src/event/event_dispatch.rs | 1 | ||||
-rw-r--r-- | src/modes/edit/leave_mode.rs | 14 |
4 files changed, 30 insertions, 14 deletions
diff --git a/development.md b/development.md index 3886781..aa60af4 100644 --- a/development.md +++ b/development.md @@ -871,6 +871,7 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally. While editing filenames in bulk, the application isn't bloked anymore. - improve neovim filepicking. While ran from a neovim terminal emulator, use the flag `--neovim`. Every _text_ file will be opened directly in current neovim session. Watchout, if you try to open text & non text files at the same time, it will run a new terminal with your text editor instead. Don't mix file kinds. +- Dynamic filtering while typing a filter #### Changelog @@ -938,6 +939,8 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally. - [x] FIX: Right pane search & filter click don't match on correct position. - [ ] FIX: while filter + search, matching and going forward is buggy - [ ] is it a problem ? +- [x] dynamic filtering while typing +- [ ] simple command "research" to redo a search while keeping the same search pattern ## TODO diff --git a/src/app/status.rs b/src/app/status.rs index e81332b..b6b92b5 100644 --- a/src/app/status.rs +++ b/src/app/status.rs @@ -30,7 +30,6 @@ use crate::io::{ reset_sudo_faillock, }; use crate::io::{Extension, Kind}; -use crate::modes::InputSimple; use crate::modes::IsoDevice; use crate::modes::Menu; use crate::modes::MountCommands; @@ -52,6 +51,7 @@ use crate::modes::{BlockDeviceAction, Navigate}; use crate::modes::{Content, FileInfo}; use crate::modes::{ContentWindow, CopyMove}; use crate::modes::{Display, Go}; +use crate::modes::{FilterKind, InputSimple}; use crate::{log_info, log_line}; pub enum Window { @@ -1244,6 +1244,30 @@ impl Status { Ok(full_width) } } + + /// Set a new filter. + /// Doesn't reset the input. + pub fn set_filter(&mut self) -> Result<()> { + let filter = FilterKind::from_input(&self.menu.input.string()); + self.current_tab_mut().settings.set_filter(filter); + // ugly hack to please borrow checker :( + self.tabs[self.index].directory.reset_files( + &self.tabs[self.index].settings, + &self.tabs[self.index].users, + )?; + if let Display::Tree = self.current_tab().display_mode { + self.current_tab_mut().make_tree(None)?; + } + let len = self.current_tab().directory.content.len(); + self.current_tab_mut().window.reset(len); + Ok(()) + } + + /// input the typed char and update the filterkind. + pub fn input_filter(&mut self, c: char) -> Result<()> { + self.menu.input_insert(c)?; + self.set_filter() + } } fn parse_keyname(keyname: &str) -> Option<String> { diff --git a/src/event/event_dispatch.rs b/src/event/event_dispatch.rs index d162b7c..29aac42 100644 --- a/src/event/event_dispatch.rs +++ b/src/event/event_dispatch.rs @@ -79,6 +79,7 @@ impl EventDispatcher { match tab.edit_mode { Edit::InputSimple(InputSimple::Sort) => status.sort(c), Edit::InputSimple(InputSimple::RegexMatch) => status.input_regex(c), + Edit::InputSimple(InputSimple::Filter) => status.input_filter(c), Edit::InputSimple(_) => status.menu.input_insert(c), Edit::InputCompleted(input_completed) => { status.menu.input.insert(c); diff --git a/src/modes/edit/leave_mode.rs b/src/modes/edit/leave_mode.rs index f6c4556..ffaec3a 100644 --- a/src/modes/edit/leave_mode.rs +++ b/src/modes/edit/leave_mode.rs @@ -18,7 +18,6 @@ use crate::modes::CLApplications; use crate::modes::Content; use crate::modes::Display; use crate::modes::Edit; -use crate::modes::FilterKind; use crate::modes::InputCompleted; use crate::modes::InputSimple; use crate::modes::Leave; @@ -384,19 +383,8 @@ impl LeaveMode { /// Apply a filter to the displayed files. /// See `crate::filter` for more details. pub fn filter(status: &mut Status) -> Result<()> { - let filter = FilterKind::from_input(&status.menu.input.string()); - status.current_tab_mut().settings.set_filter(filter); + status.set_filter()?; status.menu.input.reset(); - // ugly hack to please borrow checker :( - status.tabs[status.index].directory.reset_files( - &status.tabs[status.index].settings, - &status.tabs[status.index].users, - )?; - if let Display::Tree = status.current_tab().display_mode { - status.current_tab_mut().make_tree(None)?; - } - let len = status.current_tab().directory.content.len(); - status.current_tab_mut().window.reset(len); Ok(()) } |