Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle selection items overflowing several times #190

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/prompts/fuzzy_select.rs
Expand Up @@ -143,11 +143,11 @@ impl FuzzySelect<'_> {
let mut render = TermThemeRenderer::new(term, self.theme);
let mut sel = self.default;

let mut size_vec = Vec::new();
for items in self.items.iter().as_slice() {
let size = &items.len();
size_vec.push(*size);
}
let size_vec: Vec<_> = self.items.iter()
.flat_map(|i| i.split('\n'))
// Formatting each item adds two more characters.
.map(|item| item.len() + 2)
.collect();

// Fuzzy matcher
let matcher = fuzzy_matcher::skim::SkimMatcherV2::default();
Expand Down
14 changes: 4 additions & 10 deletions src/prompts/multi_select.rs
Expand Up @@ -208,17 +208,11 @@ impl MultiSelect<'_> {
let mut render = TermThemeRenderer::new(term, self.theme);
let mut sel = 0;

let mut size_vec = Vec::new();

for items in self
.items
.iter()
let size_vec: Vec<_> = self.items.iter()
.flat_map(|i| i.split('\n'))
.collect::<Vec<_>>()
{
let size = &items.len();
size_vec.push(*size);
}
// Formatting each item adds two more characters.
.map(|item| item.len() + 2)
.collect();

let mut checked: Vec<bool> = self.defaults.clone();

Expand Down
14 changes: 4 additions & 10 deletions src/prompts/select.rs
Expand Up @@ -247,17 +247,11 @@ impl Select<'_> {
let mut render = TermThemeRenderer::new(term, self.theme);
let mut sel = self.default;

let mut size_vec = Vec::new();

for items in self
.items
.iter()
let size_vec: Vec<_> = self.items.iter()
.flat_map(|i| i.split('\n'))
.collect::<Vec<_>>()
{
let size = &items.len();
size_vec.push(*size);
}
// Formatting each item adds two more characters.
.map(|item| item.len() + 2)
.collect();

term.hide_cursor()?;

Expand Down
11 changes: 5 additions & 6 deletions src/prompts/sort.rs
Expand Up @@ -181,12 +181,11 @@ impl Sort<'_> {
let mut render = TermThemeRenderer::new(term, self.theme);
let mut sel = 0;

let mut size_vec = Vec::new();

for items in self.items.iter().as_slice() {
let size = &items.len();
size_vec.push(*size);
}
let size_vec: Vec<_> = self.items.iter()
.flat_map(|i| i.split('\n'))
// Formatting each item adds two more characters.
.map(|item| item.len() + 2)
.collect();

let mut order: Vec<_> = (0..self.items.len()).collect();
let mut checked: bool = false;
Expand Down
13 changes: 9 additions & 4 deletions src/theme.rs
Expand Up @@ -846,13 +846,18 @@ impl<'a> TermThemeRenderer<'a> {
Ok(())
}

/// Clear all output after the last user prompt; leave the prompt behind.
///
/// `size_vec` contains the lengths of all lines of output after the prompt.
pub fn clear_preserve_prompt(&mut self, size_vec: &[usize]) -> io::Result<()> {
// Printing a selectable item (which should only take up one line)
// can yield several lines in the terminal: if the item is longer than the terminal.
// Take this into account, to fully clear all input after the prompt.
let mut new_height = self.height;
//Check each item size, increment on finding an overflow
// Check each item size, increment if it overflows the terminal width.
for size in size_vec {
if *size > self.term.size().1 as usize {
new_height += 1;
}
let term_width = self.term.size().1 as usize;
new_height += *size / term_width;
}

self.term.clear_last_lines(new_height)?;
Expand Down