Skip to content

Commit

Permalink
Add single width left margin for completion popup (helix-editor#2728)
Browse files Browse the repository at this point in the history
* Add single width left margin for completion popup

* Clear with ui.menu style before rendering menu

When rendering a completion popup, the popup component will clear
the area with ui.popup and then the menu component would draw over
it using a table component. We remove the left edge of the area
before passing it to the table component (so that it will be left
as padding), and the table component uses ui.menu as the style.
If ui.menu and ui.popup are different the left edge of the popup
will look different from the rest of the popup. We avoid this by
clearing the whole area with ui.menu in Menu::render
  • Loading branch information
sudormrfbin authored Jun 26, 2022
1 parent ba85779 commit 16ccc7e
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion helix-term/src/ui/menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ pub struct Menu<T: Item> {
}

impl<T: Item> Menu<T> {
const LEFT_PADDING: usize = 1;

// TODO: it's like a slimmed down picker, share code? (picker = menu + prompt with different
// rendering)
pub fn new(
Expand Down Expand Up @@ -150,6 +152,7 @@ impl<T: Item> Menu<T> {
len += 1; // +1: reserve some space for scrollbar
}

len += Self::LEFT_PADDING;
let width = len.min(viewport.0 as usize);

self.widths = max_lens
Expand Down Expand Up @@ -271,6 +274,7 @@ impl<T: Item + 'static> Component for Menu<T> {
.try_get("ui.menu")
.unwrap_or_else(|| theme.get("ui.text"));
let selected = theme.get("ui.menu.selected");
surface.clear_with(area, style);

let scroll = self.scroll;

Expand Down Expand Up @@ -306,14 +310,20 @@ impl<T: Item + 'static> Component for Menu<T> {
use tui::widgets::TableState;

table.render_table(
area,
area.clip_left(Self::LEFT_PADDING as u16),
surface,
&mut TableState {
offset: scroll,
selected: self.cursor,
},
);

if let Some(cursor) = self.cursor {
let offset_from_top = cursor - scroll;
let cell = &mut surface[(area.x, area.y + offset_from_top as u16)];
cell.set_style(selected);
}

let fits = len <= win_height;

for (i, _) in (scroll..(scroll + win_height).min(len)).enumerate() {
Expand Down

0 comments on commit 16ccc7e

Please sign in to comment.