diff options
author | Gokul Soumya | 2023-02-05 23:24:03 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2023-02-11 07:05:23 +0000 |
commit | 425315d7525759545fa9d164434056b435891ad4 (patch) | |
tree | 0680f4a76fb13de8f9c0f4e2e7a60689aab534fc /helix-term/src | |
parent | 1562b5ce67fbe4239de3b45d21f5853a4c123b99 (diff) |
Fix completion doc popup area calculation logic
Earlier the doc popup would draw over the compeltion popup
itself and sometimes over the cursor too.
Diffstat (limited to 'helix-term/src')
-rw-r--r-- | helix-term/src/ui/completion.rs | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index 3d354bda..ac434894 100644 --- a/helix-term/src/ui/completion.rs +++ b/helix-term/src/ui/completion.rs @@ -453,19 +453,25 @@ impl Component for Completion { } Rect::new(x, y, doc_width, doc_height) } else { - let half = area.height / 2; - let doc_height = 15.min(half); - // we want to make sure the cursor is visible (not hidden behind the documentation) - let y = if cursor_pos + area.y - >= (cx.editor.tree.area().height - doc_height - 2/* statusline + commandline */) - { - 0 + // Documentation should not cover the cursor or the completion popup + // Completion popup could be above or below the current line + let avail_height_above = cursor_pos.min(popup_area.top()).saturating_sub(1); + let avail_height_below = area + .height + .saturating_sub(cursor_pos.max(popup_area.bottom()) + 1 /* padding */); + let (y, avail_height) = if avail_height_below >= avail_height_above { + ( + area.height.saturating_sub(avail_height_below), + avail_height_below, + ) } else { - // -2 to subtract command line + statusline. a bit of a hack, because of splits. - area.height.saturating_sub(doc_height).saturating_sub(2) + (0, avail_height_above) }; + if avail_height <= 1 { + return; + } - Rect::new(0, y, area.width, doc_height) + Rect::new(0, y, area.width, avail_height.min(15)) }; // clear area |