fix: Allow multi-line prompt documentation

pull/1618/head
Blaž Hrastnik 2 years ago
parent a449156702
commit 2af04325d8
No known key found for this signature in database
GPG Key ID: 1238B9C4AD889640

@ -247,19 +247,8 @@ impl Component for Markdown {
// TODO: account for tab width
let max_text_width = (viewport.0 - padding).min(120);
let mut text_width = 0;
let mut height = padding;
for content in contents {
height += 1;
let content_width = content.width() as u16;
if content_width > max_text_width {
text_width = max_text_width;
height += content_width / max_text_width;
} else if content_width > text_width {
text_width = content_width;
}
}
let (width, height) = crate::ui::text::required_size(&contents, max_text_width);
Some((text_width + padding, height))
Some((width + padding * 2, height))
}
}

@ -389,12 +389,18 @@ impl Prompt {
if let Some(doc) = (self.doc_fn)(&self.line) {
let mut text = ui::Text::new(doc.to_string());
let max_width = BASE_WIDTH * 3;
let padding = 1;
let viewport = area;
let (_width, height) = ui::text::required_size(&text.contents, max_width);
let area = viewport.intersection(Rect::new(
completion_area.x,
completion_area.y.saturating_sub(3),
BASE_WIDTH * 3,
3,
completion_area.y.saturating_sub(height + padding * 2),
max_width,
height + padding * 2,
));
let background = theme.get("ui.help");
@ -402,8 +408,8 @@ impl Prompt {
text.render(
area.inner(&Margin {
vertical: 1,
horizontal: 1,
vertical: padding,
horizontal: padding,
}),
surface,
cx,

@ -4,7 +4,7 @@ use tui::buffer::Buffer as Surface;
use helix_view::graphics::Rect;
pub struct Text {
contents: tui::text::Text<'static>,
pub(crate) contents: tui::text::Text<'static>,
size: (u16, u16),
viewport: (u16, u16),
}
@ -49,3 +49,19 @@ impl Component for Text {
Some(self.size)
}
}
pub fn required_size(text: &tui::text::Text, max_text_width: u16) -> (u16, u16) {
let mut text_width = 0;
let mut height = 0;
for content in &text.lines {
height += 1;
let content_width = content.width() as u16;
if content_width > max_text_width {
text_width = max_text_width;
height += content_width / max_text_width;
} else if content_width > text_width {
text_width = content_width;
}
}
(text_width, height)
}

Loading…
Cancel
Save