From eaeece81770498aa2e898597a5c2091ee1bf3980 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 16 Sep 2021 17:55:22 +0530 Subject: [PATCH] Use the repeat escape code for progress bar rendering --- kittens/transfer/send.py | 2 +- kittens/tui/operations.py | 5 +++++ kittens/tui/progress.py | 18 +++++++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/kittens/transfer/send.py b/kittens/transfer/send.py index 6fc114b5e..d5821b2b3 100644 --- a/kittens/transfer/send.py +++ b/kittens/transfer/send.py @@ -582,7 +582,7 @@ class Send(Handler): af = self.manager.active_file now = monotonic() if af is None: - self.write('─' * self.screen_size.width) + self.cmd.repeat('─', self.screen_size.width) else: self.draw_progress_for_current_file(af, spinner_char=sc) self.print() diff --git a/kittens/tui/operations.py b/kittens/tui/operations.py index 8cd8fff99..91f5ebcb4 100644 --- a/kittens/tui/operations.py +++ b/kittens/tui/operations.py @@ -114,6 +114,11 @@ def without_line_wrap(write: Callable[[str], None]) -> Generator[None, None, Non write(set_line_wrapping(True)) +@cmd +def repeat(char: str, count: int) -> str: + return f'{char}\x1b[{abs(count)}b' + + @cmd def set_cursor_visible(yes_or_no: bool) -> str: return set_mode(Mode.DECTCEM) if yes_or_no else reset_mode(Mode.DECTCEM) diff --git a/kittens/tui/progress.py b/kittens/tui/progress.py index 4d252d8c6..73ff724a2 100644 --- a/kittens/tui/progress.py +++ b/kittens/tui/progress.py @@ -3,7 +3,7 @@ # License: GPLv3 Copyright: 2021, Kovid Goyal -from .operations import styled +from .operations import styled, repeat def render_progress_bar(frac: float, width: int = 80) -> str: @@ -12,28 +12,32 @@ def render_progress_bar(frac: float, width: int = 80) -> str: if frac <= 0: return styled('🬋' * width, dim=True) w = frac * width - overhang = w - int(w) - filled = '🬋' * int(w) + fl = int(w) + overhang = w - fl + filled = repeat('🬋', fl) if overhang < 0.2: needs_break = True elif overhang < 0.8: filled += '🬃' + fl += 1 needs_break = False else: - if len(filled) < width - 1: + if fl < width - 1: filled += '🬋' + fl += 1 needs_break = True else: filled += '🬃' + fl += 1 needs_break = False ans = styled(filled, fg='blue') unfilled = '' - if width > len(filled): + if width > fl: if needs_break: unfilled += '🬇' - filler = width - len(filled) - len(unfilled) + filler = width - fl - len(unfilled) if filler > 0: - unfilled += '🬋' * filler + unfilled += repeat('🬋', filler) if unfilled: ans += styled(unfilled, dim=True) return ans