mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-25 19:03:30 +04:00
Add single width left margin for completion popup (#2728)
* 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
This commit is contained in:
parent
ba85779902
commit
16ccc7ead8
@ -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(
|
||||
@ -150,6 +152,7 @@ fn recalculate_size(&mut self, viewport: (u16, u16)) {
|
||||
len += 1; // +1: reserve some space for scrollbar
|
||||
}
|
||||
|
||||
len += Self::LEFT_PADDING;
|
||||
let width = len.min(viewport.0 as usize);
|
||||
|
||||
self.widths = max_lens
|
||||
@ -271,6 +274,7 @@ fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) {
|
||||
.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;
|
||||
|
||||
@ -306,7 +310,7 @@ const fn div_ceil(a: usize, b: usize) -> usize {
|
||||
use tui::widgets::TableState;
|
||||
|
||||
table.render_table(
|
||||
area,
|
||||
area.clip_left(Self::LEFT_PADDING as u16),
|
||||
surface,
|
||||
&mut TableState {
|
||||
offset: scroll,
|
||||
@ -314,6 +318,12 @@ const fn div_ceil(a: usize, b: usize) -> usize {
|
||||
},
|
||||
);
|
||||
|
||||
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() {
|
||||
|
Loading…
Reference in New Issue
Block a user