diff options
| -rw-r--r-- | tui/widget/list/scrolllist.ha | 2 | ||||
| -rw-r--r-- | tui/widget/widget.ha | 4 | ||||
| -rw-r--r-- | tui/width.ha | 14 |
3 files changed, 16 insertions, 4 deletions
diff --git a/tui/widget/list/scrolllist.ha b/tui/widget/list/scrolllist.ha index fed58a5..2f18ef0 100644 --- a/tui/widget/list/scrolllist.ha +++ b/tui/widget/list/scrolllist.ha @@ -58,8 +58,6 @@ fn printscrolllist(widget: *widget::widget) void = { const list = widget: *scrolllist; assert(list.frame.start >= 0); assert(list.frame.end <= len(list.items): int); - fmt::errorln(list.frame.start)!; - fmt::errorln(list.frame.end)!; list.widget.buf = widget::linesbuf { lines = list.items[list.frame.start..list.frame.end], styles = &stylesscrolllist, diff --git a/tui/widget/widget.ha b/tui/widget/widget.ha index 3e6cf8d..39b77ba 100644 --- a/tui/widget/widget.ha +++ b/tui/widget/widget.ha @@ -234,11 +234,11 @@ fn truncate_to_size(w: *widget) []str = { const line = w.buf.lines[i]; let item = match (w.sz) { case let sz: tty::ttysize => - const s = if (tui::strwidth(line) > sz.columns) strings::sub(line, 0z, sz.columns) else line; + const s = if (tui::strwidth(line) > sz.columns) tui::subwidth(line, sz.columns) else line; yield strings::rpad(s, ' ', sz.columns); case void => const wsz = tty::winsize(w.state.out)!; - const s = if (tui::strwidth(line) > wsz.columns) strings::sub(line, 0z, wsz.columns) else line; + const s = if (tui::strwidth(line) > wsz.columns) tui::subwidth(line, wsz.columns) else line; yield strings::dup(s); }; append(lines, item)!; diff --git a/tui/width.ha b/tui/width.ha index 6f9631c..ed498e6 100644 --- a/tui/width.ha +++ b/tui/width.ha @@ -30,3 +30,17 @@ export fn strwidth(s: str) uint = { }; return sum; }; + +export fn subwidth(s: str, end: (size | strings::end)) str = { + const runes = strings::torunes(s); + defer free(runes); + let sum = 0u; + for (let i = 0z; i < len(runes); i += 1) { + const r = runes[i]; + sum += runewidth(r); + if (sum > end: uint) { + return strings::sub(s, 0, i - 1); + }; + }; + return s; +}; |
