fix: Allow multi-line prompt documentation

pull/1618/head
Blaž Hrastnik 3 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 // TODO: account for tab width
let max_text_width = (viewport.0 - padding).min(120); let max_text_width = (viewport.0 - padding).min(120);
let mut text_width = 0; let (width, height) = crate::ui::text::required_size(&contents, max_text_width);
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;
}
}
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) { if let Some(doc) = (self.doc_fn)(&self.line) {
let mut text = ui::Text::new(doc.to_string()); let mut text = ui::Text::new(doc.to_string());
let max_width = BASE_WIDTH * 3;
let padding = 1;
let viewport = area; let viewport = area;
let (_width, height) = ui::text::required_size(&text.contents, max_width);
let area = viewport.intersection(Rect::new( let area = viewport.intersection(Rect::new(
completion_area.x, completion_area.x,
completion_area.y.saturating_sub(3), completion_area.y.saturating_sub(height + padding * 2),
BASE_WIDTH * 3, max_width,
3, height + padding * 2,
)); ));
let background = theme.get("ui.help"); let background = theme.get("ui.help");
@ -402,8 +408,8 @@ impl Prompt {
text.render( text.render(
area.inner(&Margin { area.inner(&Margin {
vertical: 1, vertical: padding,
horizontal: 1, horizontal: padding,
}), }),
surface, surface,
cx, cx,

@ -4,7 +4,7 @@ use tui::buffer::Buffer as Surface;
use helix_view::graphics::Rect; use helix_view::graphics::Rect;
pub struct Text { pub struct Text {
contents: tui::text::Text<'static>, pub(crate) contents: tui::text::Text<'static>,
size: (u16, u16), size: (u16, u16),
viewport: (u16, u16), viewport: (u16, u16),
} }
@ -49,3 +49,19 @@ impl Component for Text {
Some(self.size) 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