Skip to content

Commit

Permalink
use tui-react to draw text…
Browse files Browse the repository at this point in the history
…for a chance to get it to be faster.
Right now, it isn't though, graphemes are killing it.
  • Loading branch information
Byron committed Mar 29, 2020
1 parent 0838d9e commit e8c00b7
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion tui-react/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "tui-react"
version = "0.2.2"
version = "0.2.3"
authors = ["Sebastian Thiel <sthiel@thoughtworks.com>"]
edition = "2018"
repository = "https://github.com/Byron/dua-cli"
Expand Down
37 changes: 37 additions & 0 deletions tui-react/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,43 @@ pub fn draw_text_with_ellipsis_nowrap<'a>(
total_width as u16
}

pub fn draw_text_without_ellipsis_nowrap<'a>(
bound: Rect,
buf: &mut Buffer,
text: impl AsRef<str>,
style: impl Into<Option<Style>>,
) -> u16 {
let s = style.into();
let t = text.as_ref();
let mut graphemes = t.graphemes(true);
let mut total_width = 0;
{
let mut x_offset = 0;
for (g, mut x) in graphemes.by_ref().zip(bound.left()..bound.right()) {
let width = g.width();
total_width += width;

x += x_offset;
let cell = buf.get_mut(x, bound.y);
cell.symbol = g.into();
if let Some(s) = s {
cell.style = s;
}

x_offset += width.saturating_sub(1) as u16;
if x + x_offset >= bound.right() {
break;
}
let x = x as usize;
for x in x + 1..x + width {
let i = buf.index_of(x as u16, bound.y);
buf.content[i].reset();
}
}
}
total_width as u16
}

pub fn draw_text_nowrap_fn(
bound: Rect,
buf: &mut Buffer,
Expand Down
28 changes: 18 additions & 10 deletions tui-react/src/list.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
use crate::draw_text_without_ellipsis_nowrap;
use crate::util::rect::offset_x;
use tui::{
buffer::Buffer,
layout::Rect,
widgets::{Block, Paragraph, Text, Widget},
style::Style,
widgets::{Block, Text, Widget},
};

#[derive(Default)]
Expand Down Expand Up @@ -62,15 +65,20 @@ impl List {
.take(list_area.height as usize)
{
let (x, y) = (list_area.left(), list_area.top() + i as u16);
Paragraph::new(text_iterator.iter()).draw(
Rect {
x,
y,
width: list_area.width,
height: 1,
},
buf,
);
let mut bound = Rect {
x,
y,
width: list_area.width,
height: 1,
};
for text in text_iterator.into_iter() {
let (text, style) = match text {
Text::Raw(s) => (s, Style::default()),
Text::Styled(s, style) => (s, style),
};
let offset = draw_text_without_ellipsis_nowrap(bound, buf, text, Some(style));
bound = offset_x(bound, offset);
}
}
}
}

0 comments on commit e8c00b7

Please sign in to comment.