From 4a289c098c6b67eb7bf71aecac943dd705500107 Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Fri, 12 Feb 2021 21:46:05 -0500 Subject: [PATCH] Add progress bar --- lightcards/display.py | 46 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/lightcards/display.py b/lightcards/display.py index db97fdf..0b75569 100644 --- a/lightcards/display.py +++ b/lightcards/display.py @@ -255,7 +255,7 @@ class Display: status, and card side. """ (mlines, mcols) = self.win.getmaxyx() - self.win.hline(mlines - 2, 0, 0, mcols) + self.win.hline(mlines - 3, 0, 0, mcols) # Calculate percent done if len(self.stack) <= 1: @@ -271,15 +271,15 @@ class Display: else: star_color = curses.color_pair(1) + progress = ( + f"[{percent}% (" + f"{str(self.obj.index).zfill(len(str(len(self.stack))))})]" + ) + # Compose bar text bar_start = "[" bar_middle = self.current_card().printStar() - bar_end = ( - f"] [{len(self.nstarred())}/{str(len(self.stack))} starred] " - f"[{percent}% (" - f"{str(self.obj.index).zfill(len(str(len(self.stack))))}" - f"/{str(len(self.stack))})]" - ) + bar_end = f"] [{len(self.nstarred())}/{str(len(self.stack))} starred] " if self.view != 3: bar_end += ( f" [{self.get_side()} (" @@ -288,15 +288,35 @@ class Display: bar_end += f" [View {str(self.view)}]" # Put it all togethor - self.win.addstr(mlines - 1, 0, bar_start, curses.color_pair(1)) - self.win.addstr(mlines - 1, len(bar_start), bar_middle, star_color) + height = mlines - 2 + self.win.addstr(height, 0, bar_start, curses.color_pair(1)) + self.win.addstr(height, len(bar_start), bar_middle, star_color) self.win.addstr( - mlines - 1, + height, len(bar_start + bar_middle), textwrap.shorten(bar_end, width=mcols - 20, placeholder="…"), curses.color_pair(1), ) + self.win.addstr( + height + 1, + mcols - len(progress) - 1, + progress, + curses.color_pair(1), + ) + + for i in range( + int( + self.obj.index + / (len(self.stack) - 1) + * (mcols - len(progress)) + - 2 + ) + ): + # TODO: Use the variying width unicode block characters to make a + # super accurate bar + self.win.addch(height + 1, i, "»", curses.color_pair(1)) + def wrap_width(self): """Calculate the width at which the body text should wrap""" (_, mcols) = self.win.getmaxyx() @@ -454,7 +474,7 @@ class Display: "STARRED CARDS", curses.color_pair(3) + curses.A_BOLD, ) - self.win.vline(0, mcols - 20, 0, mlines - 2) + self.win.vline(0, mcols - 20, 0, mlines - 3) nstarred = self.nstarred() for i, card in enumerate(nstarred): @@ -462,12 +482,12 @@ class Display: if len(term) > 18: term = term[:18] + "…" - if i > mlines - 5: + if i > mlines - 6: for i in range(19): self.win.addch(mlines - 3, left + i, " ") self.win.addstr( - mlines - 3, + mlines - 4, left, f"({len(nstarred) - i - 2} more)", ) -- 2.39.2