summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sebastian.thiel@icloud.com>2021-02-15 15:50:00 +0800
committerSebastian Thiel <sebastian.thiel@icloud.com>2021-02-15 15:52:04 +0800
commit6d7b3cd062214f2cc66886d49d1a60406204abf3 (patch)
tree62b27f369453188b7bcda077185ac0fdd6fb3c6a
parent6ca9e6ca52a4d4d32036df2914ee773ab313397b (diff)
Keep selecting the first element during iteration unless…
…the user provided input already. Related to #77
-rw-r--r--src/interactive/app/eventloop.rs15
-rw-r--r--src/main.rs4
2 files changed, 15 insertions, 4 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index ed7c2ac..d18ff44 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -236,10 +236,14 @@ impl TerminalApp {
};
let mut state = None::<AppState>;
+ let mut received_events = false;
let traversal = Traversal::from_walk(options, input, |traversal| {
let s = match state.as_mut() {
Some(s) => {
s.entries = sorted_entries(&traversal.tree, s.root, s.sorting);
+ if !received_events {
+ s.selected = s.entries.get(0).map(|b| b.index);
+ }
s
}
None => {
@@ -260,12 +264,15 @@ impl TerminalApp {
}
};
s.reset_message(); // force "scanning" to appear
+ let events = fetch_buffered_key_events();
+ received_events |= !events.is_empty();
+
let should_exit = match s.process_events(
&mut window,
traversal,
&mut display,
terminal,
- fetch_buffered_key_events().into_iter(),
+ events.into_iter(),
)? {
ProcessingResult::ExitRequested(_) => true,
ProcessingResult::Finished(_) => false,
@@ -294,7 +301,11 @@ impl TerminalApp {
});
s.is_scanning = false;
s.entries = sorted_entries(&traversal.tree, s.root, s.sorting);
- s.selected = s.selected.or_else(|| s.entries.get(0).map(|b| b.index));
+ s.selected = if received_events {
+ s.selected.or_else(|| s.entries.get(0).map(|b| b.index))
+ } else {
+ s.entries.get(0).map(|b| b.index)
+ };
s
},
display,
diff --git a/src/main.rs b/src/main.rs
index d299e1a..ce2e728 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,5 @@
#![forbid(unsafe_code)]
-use anyhow::{anyhow, Result};
+use anyhow::Result;
use clap::Clap;
use dua::{ByteFormat, TraversalSorting};
use std::{fs, io, io::Write, path::PathBuf, process};
@@ -24,7 +24,7 @@ fn main() -> Result<()> {
#[cfg(any(feature = "tui-unix", feature = "tui-crossplatform"))]
Some(Interactive { input }) => {
use crate::interactive::{Interaction, TerminalApp};
- use anyhow::Context;
+ use anyhow::{anyhow, Context};
use crosstermion::terminal::{tui::new_terminal, AlternateRawScreen};
let no_tty_msg = "Interactive mode requires a connected terminal";