From f73b838db1a60d381e933f8231100f9d04ec1f2b Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 23 Jan 2024 13:30:49 +0100 Subject: [PATCH] Experimental branch that adds invisble cursor key reads --- Cargo.toml | 5 ++++- src/prompts/confirm.rs | 8 ++------ src/prompts/fuzzy_select.rs | 6 +----- src/prompts/multi_select.rs | 6 +----- src/prompts/select.rs | 5 +---- src/prompts/sort.rs | 10 +--------- 6 files changed, 10 insertions(+), 30 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 058b15d..2ea78e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,13 +25,16 @@ password = ["zeroize"] completion = [] [dependencies] -console = "0.15.0" +console = "0.15.8" tempfile = { version = "3", optional = true } zeroize = { version = "1.1.1", optional = true } fuzzy-matcher = { version = "0.3.7", optional = true } shell-words = "1.1.0" thiserror = "1.0.40" +[patch.crates-io] +console = { path = "../console" } + [[example]] name = "password" required-features = ["password"] diff --git a/src/prompts/confirm.rs b/src/prompts/confirm.rs index 8ff126f..ffe2521 100644 --- a/src/prompts/confirm.rs +++ b/src/prompts/confirm.rs @@ -164,8 +164,6 @@ impl Confirm<'_> { }; render.confirm_prompt(&self.prompt, default_if_show)?; - - term.hide_cursor()?; term.flush()?; let rv; @@ -176,7 +174,7 @@ impl Confirm<'_> { let mut value = default_if_show; loop { - let input = term.read_key()?; + let input = term.read_key_no_cursor()?; match input { Key::Char('y') | Key::Char('Y') => { @@ -211,7 +209,7 @@ impl Confirm<'_> { // Default behavior: matches continuously on every keystroke, // and does not wait for user to hit the Enter key. loop { - let input = term.read_key()?; + let input = term.read_key_no_cursor()?; let value = match input { Key::Char('y') | Key::Char('Y') => Some(true), Key::Char('n') | Key::Char('N') => Some(false), @@ -231,8 +229,6 @@ impl Confirm<'_> { if self.report { render.confirm_prompt_selection(&self.prompt, rv)?; } - term.show_cursor()?; - term.flush()?; Ok(rv) } diff --git a/src/prompts/fuzzy_select.rs b/src/prompts/fuzzy_select.rs index 9f06798..d1fb590 100644 --- a/src/prompts/fuzzy_select.rs +++ b/src/prompts/fuzzy_select.rs @@ -223,8 +223,6 @@ impl FuzzySelect<'_> { // Variable used to determine if we need to scroll through the list. let mut starting_row = 0; - term.hide_cursor()?; - let mut vim_mode = false; loop { @@ -265,7 +263,7 @@ impl FuzzySelect<'_> { } term.flush()?; - match (term.read_key()?, sel, vim_mode) { + match (term.read_key_no_cursor()?, sel, vim_mode) { (Key::Escape, _, false) if self.enable_vim_mode => { vim_mode = true; } @@ -274,7 +272,6 @@ impl FuzzySelect<'_> { render.clear()?; term.flush()?; } - term.show_cursor()?; return Ok(None); } (Key::Char('i' | 'a'), _, true) => { @@ -339,7 +336,6 @@ impl FuzzySelect<'_> { let sel_string_pos_in_items = self.items.iter().position(|item| item.eq(sel_string)); - term.show_cursor()?; return Ok(sel_string_pos_in_items); } (Key::Backspace, _, _) if cursor > 0 => { diff --git a/src/prompts/multi_select.rs b/src/prompts/multi_select.rs index 42b301d..b5cc5c4 100644 --- a/src/prompts/multi_select.rs +++ b/src/prompts/multi_select.rs @@ -230,8 +230,6 @@ impl MultiSelect<'_> { let mut checked: Vec = self.defaults.clone(); - term.hide_cursor()?; - loop { if let Some(ref prompt) = self.prompt { paging @@ -250,7 +248,7 @@ impl MultiSelect<'_> { term.flush()?; - match term.read_key()? { + match term.read_key_no_cursor()? { Key::ArrowDown | Key::Tab | Key::Char('j') => { if sel == !0 { sel = 0; @@ -294,7 +292,6 @@ impl MultiSelect<'_> { term.clear_last_lines(paging.capacity)?; } - term.show_cursor()?; term.flush()?; return Ok(None); @@ -323,7 +320,6 @@ impl MultiSelect<'_> { } } - term.show_cursor()?; term.flush()?; return Ok(Some( diff --git a/src/prompts/select.rs b/src/prompts/select.rs index 872975d..6906e78 100644 --- a/src/prompts/select.rs +++ b/src/prompts/select.rs @@ -218,7 +218,6 @@ impl Select<'_> { size_vec.push(*size); } - term.hide_cursor()?; paging.update_page(sel); loop { @@ -238,7 +237,7 @@ impl Select<'_> { term.flush()?; - match term.read_key()? { + match term.read_key_no_cursor()? { Key::ArrowDown | Key::Tab | Key::Char('j') => { if sel == !0 { sel = 0; @@ -254,7 +253,6 @@ impl Select<'_> { term.clear_last_lines(paging.capacity)?; } - term.show_cursor()?; term.flush()?; return Ok(None); @@ -290,7 +288,6 @@ impl Select<'_> { } } - term.show_cursor()?; term.flush()?; return Ok(Some(sel)); diff --git a/src/prompts/sort.rs b/src/prompts/sort.rs index 4b1b0c8..83c52bb 100644 --- a/src/prompts/sort.rs +++ b/src/prompts/sort.rs @@ -198,8 +198,6 @@ impl Sort<'_> { let mut order: Vec<_> = (0..self.items.len()).collect(); let mut checked: bool = false; - term.hide_cursor()?; - loop { if let Some(ref prompt) = self.prompt { paging.render_prompt(|paging_info| render.sort_prompt(prompt, paging_info))?; @@ -216,7 +214,7 @@ impl Sort<'_> { term.flush()?; - match term.read_key()? { + match term.read_key_no_cursor()? { Key::ArrowDown | Key::Tab | Key::Char('j') => { let old_sel = sel; @@ -299,9 +297,6 @@ impl Sort<'_> { term.clear_last_lines(paging.capacity)?; } - term.show_cursor()?; - term.flush()?; - return Ok(None); } } @@ -321,9 +316,6 @@ impl Sort<'_> { } } - term.show_cursor()?; - term.flush()?; - return Ok(Some(order)); } _ => {}