From b52f66e4cd48bc670b1b98a4a713e280b63d9432 Mon Sep 17 00:00:00 2001 From: Piotr Wach Date: Sun, 7 Jan 2024 20:15:55 +0000 Subject: first working version --- src/interactive/app/app_state.rs | 2 ++ src/interactive/app/eventloop.rs | 31 +++++++++++++++++++++++++------ src/interactive/app/terminal_app.rs | 16 +--------------- 3 files changed, 28 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/interactive/app/app_state.rs b/src/interactive/app/app_state.rs index 74989fe..4578438 100644 --- a/src/interactive/app/app_state.rs +++ b/src/interactive/app/app_state.rs @@ -46,6 +46,7 @@ pub struct TraversalState { pub previous_depth: usize, pub inodes: InodeFilter, pub throttle: Option, + pub received_event: bool, } impl TraversalState { @@ -58,6 +59,7 @@ impl TraversalState { previous_depth: 0, inodes: InodeFilter::default(), throttle: Some(Throttle::new(Duration::from_millis(250), None)), + received_event: false, } } } diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs index 70df427..0291813 100644 --- a/src/interactive/app/eventloop.rs +++ b/src/interactive/app/eventloop.rs @@ -116,7 +116,18 @@ impl AppState { let Ok(event) = event else { continue; }; - self.process_traversal_event(traversal, walk_options, event); + if self.process_traversal_event(traversal, walk_options, event) { + self.update_state(traversal); + let result = self.process_event( + window, + traversal, + display, + terminal, + Event::Key(refresh_key()))?; + if let Some(processing_result) = result { + return Ok(processing_result); + } + } } } } @@ -142,7 +153,7 @@ impl AppState { t: &'a mut Traversal, walk_options: &'a WalkOptions, event: TraversalEvent, - ) { + ) -> bool { match event { TraversalEvent::Entry(entry, root_path, device_id) => { t.entries_traversed += 1; @@ -277,7 +288,7 @@ impl AppState { if let Some(throttle) = &self.traversal_state.throttle { if throttle.can_update() { - self.update_state(t); + return true; } } } @@ -317,13 +328,16 @@ impl AppState { t.total_bytes = Some(root_size); t.elapsed = Some(t.start.elapsed()); - self.update_state(t); + self.is_scanning = false; + + return true; } } + return false; } fn update_state<'a>(&mut self, traversal: &'a Traversal) { - let mut received_events = false; + let received_events = self.traversal_state.received_event; if !received_events { self.navigation_mut().view_root = traversal.root_index; } @@ -354,7 +368,12 @@ impl AppState { use FocussedPane::*; let key = match event { - Event::Key(key) if key.kind != KeyEventKind::Release => key, + Event::Key(key) if key.kind != KeyEventKind::Release => { + if key.code != KeyCode::Char('\r') { + self.traversal_state.received_event = true; + } + key + }, Event::Resize(_, _) => refresh_key(), _ => return Ok(None), }; diff --git a/src/interactive/app/terminal_app.rs b/src/interactive/app/terminal_app.rs index ce1d5c6..f3e3369 100644 --- a/src/interactive/app/terminal_app.rs +++ b/src/interactive/app/terminal_app.rs @@ -89,6 +89,7 @@ impl TerminalApp { pub fn scan<'a>(&mut self, input: Vec) -> Result> { self.state.traversal_state = TraversalState::new(self.traversal.root_index); + self.state.is_scanning = true; let (entry_tx, entry_rx) = crossbeam::channel::bounded(100); std::thread::Builder::new() @@ -131,21 +132,6 @@ impl TerminalApp { } })?; - // let mut received_events = false; - // let traversal = - // Traversal::from_walk(options, input_paths, |traversal, event| { - - // })?; - - // let traversal = match traversal { - // Some(t) => t, - // None => return Ok(None), - // }; - - // state.is_scanning = false; - // if !received_events { - // } - Ok(entry_rx) } -- cgit v1.2.3