aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormWalrus2023-03-22 14:38:34 +0000
committerBlaž Hrastnik2023-03-31 06:19:17 +0000
commite72be529968071abcd5fce1d9a06e8e2e2bbaacf (patch)
tree8c0f12984f736c8fce0b0241e541073218f318a4
parenta863fd89e149ae698f1c7d1d493cc4197abd430a (diff)
Truncate paths in the file picker (#6410)
-rw-r--r--helix-term/src/ui/menu.rs1
-rw-r--r--helix-term/src/ui/picker.rs1
-rw-r--r--helix-tui/src/buffer.rs25
-rw-r--r--helix-tui/src/widgets/table.rs20
4 files changed, 43 insertions, 4 deletions
diff --git a/helix-term/src/ui/menu.rs b/helix-term/src/ui/menu.rs
index 30625ace..bdad2e40 100644
--- a/helix-term/src/ui/menu.rs
+++ b/helix-term/src/ui/menu.rs
@@ -347,6 +347,7 @@ impl<T: Item + 'static> Component for Menu<T> {
offset: scroll,
selected: self.cursor,
},
+ false,
);
if let Some(cursor) = self.cursor {
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index 3294a2a1..e73088e5 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -885,6 +885,7 @@ impl<T: Item + 'static> Component for Picker<T> {
offset: 0,
selected: Some(cursor),
},
+ self.truncate_start,
);
}
diff --git a/helix-tui/src/buffer.rs b/helix-tui/src/buffer.rs
index b1fd4478..2c212b12 100644
--- a/helix-tui/src/buffer.rs
+++ b/helix-tui/src/buffer.rs
@@ -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;
diff --git a/helix-tui/src/widgets/table.rs b/helix-tui/src/widgets/table.rs
index 400f65e0..97762167 100644
--- a/helix-tui/src/widgets/table.rs
+++ b/helix-tui/src/widgets/table.rs
@@ -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: bool,
+ ) {
if area.area() == 0 {
return;
}
@@ -401,6 +407,7 @@ impl<'a> Table<'a> {
width: *width,
height: max_header_height,
},
+ truncate,
);
col += *width + self.column_spacing;
}
@@ -457,6 +464,7 @@ impl<'a> Table<'a> {
width: *width,
height: table_row.height,
},
+ truncate,
);
col += *width + self.column_spacing;
}
@@ -464,20 +472,24 @@ impl<'a> Table<'a> {
}
}
-fn render_cell(buf: &mut Buffer, cell: &Cell, area: Rect) {
+fn render_cell(buf: &mut Buffer, cell: &Cell, area: Rect, truncate: bool) {
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(area.x, area.y + i as u16, spans, area.width);
+ if truncate {
+ buf.set_spans_truncated(area.x, area.y + i as u16, spans, area.width);
+ } else {
+ buf.set_spans(area.x, area.y + i as u16, spans, area.width);
+ }
}
}
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);
}
}