Skip to content

Commit bbdae1d

Browse files
committed
Make signature_help more like hover, fix overflow and lack of scrolling in signature_help
1 parent ebf96bd commit bbdae1d

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

helix-term/src/ui/lsp/signature_help.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ impl Component for SignatureHelp {
9494
}
9595

9696
fn render(&mut self, area: Rect, surface: &mut Buffer, cx: &mut Context) {
97-
let margin = Margin::horizontal(1);
97+
let margin = Margin::all(1);
98+
let area = area.inner(margin);
9899

99100
let signature = self
100101
.signatures
@@ -127,13 +128,15 @@ impl Component for SignatureHelp {
127128
let signature_index = self.signature_index();
128129
let text = Text::from(signature_index);
129130
let paragraph = Paragraph::new(&text).alignment(Alignment::Right);
130-
paragraph.render(area.clip_top(1).with_height(1).clip_right(1), surface);
131+
paragraph.render(area.with_height(1).clip_right(1), surface);
131132
}
132133

133134
let (_, sig_text_height) = crate::ui::text::required_size(&sig_text, area.width);
134-
let sig_text_area = area.clip_top(1).with_height(sig_text_height);
135-
let sig_text_area = sig_text_area.inner(margin).intersection(surface.area);
136-
let sig_text_para = Paragraph::new(&sig_text).wrap(Wrap { trim: false });
135+
let sig_text_area = area.with_height(sig_text_height.min(area.height));
136+
let sig_text_area = sig_text_area.intersection(surface.area);
137+
let sig_text_para = Paragraph::new(&sig_text)
138+
.wrap(Wrap { trim: false })
139+
.scroll((cx.scroll.unwrap_or_default() as u16, 0));
137140
sig_text_para.render(sig_text_area, surface);
138141

139142
if signature.signature_doc.is_none() {
@@ -159,7 +162,7 @@ impl Component for SignatureHelp {
159162
let sig_doc_para = Paragraph::new(&sig_doc)
160163
.wrap(Wrap { trim: false })
161164
.scroll((cx.scroll.unwrap_or_default() as u16, 0));
162-
sig_doc_para.render(sig_doc_area.inner(margin), surface);
165+
sig_doc_para.render(sig_doc_area, surface);
163166
}
164167

165168
fn required_size(&mut self, viewport: (u16, u16)) -> Option<(u16, u16)> {
@@ -196,6 +199,8 @@ impl Component for SignatureHelp {
196199
}
197200
None => (sig_width, sig_height),
198201
};
202+
let sig_text_para = Paragraph::new(&signature_text).wrap(Wrap { trim: false });
203+
let height = height.max(sig_text_para.line_count(max_text_width));
199204

200205
let sig_index_width = if self.signatures.len() > 1 {
201206
self.signature_index().len() + 1

helix-tui/src/widgets/paragraph.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,36 @@ impl<'a> Paragraph<'a> {
127127
self.alignment = alignment;
128128
self
129129
}
130+
131+
pub fn line_count(self, text_width: u16) -> u16 {
132+
let style = self.style;
133+
let mut styled = self.text.lines.iter().flat_map(|spans| {
134+
spans
135+
.0
136+
.iter()
137+
.flat_map(|span| span.styled_graphemes(style))
138+
// Required given the way composers work but might be refactored out if we change
139+
// composers to operate on lines instead of a stream of graphemes.
140+
.chain(iter::once(StyledGrapheme {
141+
symbol: "\n",
142+
style: self.style,
143+
}))
144+
});
145+
let mut line_composer: Box<dyn LineComposer> = if let Some(Wrap { trim }) = self.wrap {
146+
Box::new(WordWrapper::new(&mut styled, text_width, trim))
147+
} else {
148+
let mut line_composer = Box::new(LineTruncator::new(&mut styled, text_width));
149+
if self.alignment == Alignment::Left {
150+
line_composer.set_horizontal_offset(self.scroll.1);
151+
}
152+
line_composer
153+
};
154+
let mut y = 0;
155+
while let Some((_, _)) = line_composer.next_line() {
156+
y += 1;
157+
}
158+
return y;
159+
}
130160
}
131161

132162
impl Widget for Paragraph<'_> {

0 commit comments

Comments
 (0)