Skip to content

Commit

Permalink
Truncate paths in the file picker (helix-editor#6410)
Browse files Browse the repository at this point in the history
  • Loading branch information
mWalrus authored and pascalkuthe committed Mar 30, 2023
1 parent b559129 commit c1f0733
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 12 deletions.
1 change: 1 addition & 0 deletions helix-term/src/ui/menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,7 @@ impl<T: Item + 'static> Component for Menu<T> {
offset: scroll,
selected: self.cursor,
},
false,
);

if let Some(cursor) = self.cursor {
Expand Down
1 change: 1 addition & 0 deletions helix-term/src/ui/picker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,7 @@ impl<T: Item + 'static> Component for Picker<T> {
offset: 0,
selected: Some(cursor),
},
self.truncate_start,
);
}

Expand Down
25 changes: 25 additions & 0 deletions helix-tui/src/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,31 @@ impl Buffer {
(x_offset as u16, y)
}

pub fn set_spans_truncated(&mut self, x: u16, y: u16, spans: &Spans, width: u16) -> (u16, u16) {
let mut remaining_width = width;
let mut alt_x = x;
let (text, styles) =
spans
.0
.iter()
.fold((String::new(), vec![]), |(mut s, mut h), span| {
s.push_str(span.content.as_ref());
let mut styles = span
.styled_graphemes(span.style)
.map(|grapheme| grapheme.style)
.collect();
h.append(&mut styles);

let w = span.width() as u16;
alt_x = alt_x + w;
remaining_width = remaining_width.saturating_sub(w);

(s, h)
});
self.set_string_truncated(x, y, &text, width.into(), |idx| styles[idx], true, true);
(x, y)
}

pub fn set_spans(&mut self, x: u16, y: u16, spans: &Spans, width: u16) -> (u16, u16) {
let mut remaining_width = width;
let mut x = x;
Expand Down
41 changes: 29 additions & 12 deletions helix-tui/src/widgets/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,13 @@ impl TableState {
impl<'a> Table<'a> {
// type State = TableState;

pub fn render_table(mut self, area: Rect, buf: &mut Buffer, state: &mut TableState) {
pub fn render_table(
mut self,
area: Rect,
buf: &mut Buffer,
state: &mut TableState,
truncate_rows: bool,
) {
if area.area() == 0 {
return;
}
Expand Down Expand Up @@ -448,22 +454,33 @@ impl<'a> Table<'a> {
if is_selected {
buf.set_style(table_row_area, self.highlight_style);
}
render_cell(
buf,
cell,
Rect {
x: col,
y: row,
width: *width,
height: table_row.height,
},
);
let rect = Rect {
x: col,
y: row,
width: *width,
height: table_row.height,
};
if truncate_rows {
render_cell_truncated(buf, cell, rect);
} else {
render_cell(buf, cell, rect);
}
col += *width + self.column_spacing;
}
}
}
}

fn render_cell_truncated(buf: &mut Buffer, cell: &Cell, area: Rect) {
buf.set_style(area, cell.style);
for (i, spans) in cell.content.lines.iter().enumerate() {
if i as u16 >= area.height {
break;
}
buf.set_spans_truncated(area.x, area.y + i as u16, spans, area.width);
}
}

fn render_cell(buf: &mut Buffer, cell: &Cell, area: Rect) {
buf.set_style(area, cell.style);
for (i, spans) in cell.content.lines.iter().enumerate() {
Expand All @@ -477,7 +494,7 @@ fn render_cell(buf: &mut Buffer, cell: &Cell, area: Rect) {
impl<'a> Widget for Table<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
let mut state = TableState::default();
Table::render_table(self, area, buf, &mut state);
Table::render_table(self, area, buf, &mut state, false);
}
}

Expand Down

0 comments on commit c1f0733

Please sign in to comment.