summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2024-02-29 14:44:57 +0100
committerqkzk <qu3nt1n@gmail.com>2024-02-29 14:44:57 +0100
commitd58dfb584b7b1fa328eb003eaf9b2d7eddf9e949 (patch)
treeefee71b98851ade9f5139c3ef0ed14ad5bc4e7aa
parentc8b4bbc83628f43f0d703584a2589f4634c8f3f9 (diff)
dynamic filtering while typing
-rw-r--r--development.md3
-rw-r--r--src/app/status.rs26
-rw-r--r--src/event/event_dispatch.rs1
-rw-r--r--src/modes/edit/leave_mode.rs14
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(())
}