From 425315d7525759545fa9d164434056b435891ad4 Mon Sep 17 00:00:00 2001 From: Gokul Soumya Date: Mon, 6 Feb 2023 04:54:03 +0530 Subject: [PATCH] Fix completion doc popup area calculation logic Earlier the doc popup would draw over the compeltion popup itself and sometimes over the cursor too. --- helix-term/src/ui/completion.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index 3d354bdad..ac434894a 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