X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=lightcards%2Fdisplay.py;h=5f7276bac43fe977c0f66fef24213c2bc2062c0a;hb=b1a79e70ed02ceeac0f2343067e0f58deff3b37e;hp=a1a2c2171c78a97cfc15a0f1be243a5e45d21a5b;hpb=eec0373eb1745933e0ad618af7e79556427a4f6f;p=lightcards.git diff --git a/lightcards/display.py b/lightcards/display.py index a1a2c21..5f7276b 100644 --- a/lightcards/display.py +++ b/lightcards/display.py @@ -16,6 +16,7 @@ class Display(): self.obj = obj def run(self, stdscr): + """Set important options before beginning""" self.win = stdscr curses.curs_set(0) # Hide cursor curses.init_pair(1, curses.COLOR_CYAN, 0) @@ -24,11 +25,17 @@ class Display(): self.get_key() def leave(self): - progress.dump(self.obj, "status", self.stack) - progress.dump(self.stack, "stack", self.stack) - progress.dump(self.headers, "headers", self.stack) + """Pickle stack before quitting""" + if self.obj.getIdx() == len(self.stack): + self.obj.setIdx(0) + + progress.dump(self.stack, lightcards.get_orig()) sys.exit(0) + def ntotal(self): + """Get toal number of starred cards""" + return(len([card for card in self.stack if card.getStar()])) + def disp_bar(self): """ Display the statusbar at the bottom of the screen with progress, star @@ -52,19 +59,21 @@ class Display(): # Create bar component bar_start = "[" bar_middle = self.stack[self.obj.getIdx()].printStar() - bar_end = "] [" + percent + "% (" + \ + bar_end = f"] [{self.ntotal()}/{str(len(self.stack))} starred] " + \ + f"[{percent}% (" + \ str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack)))) + \ - "/" + str(len(self.stack)) + ")] [" + \ - self.headers[self.obj.getSide()] + " (" + \ - str(self.obj.getSide() + 1) + ")]" + f"/{str(len(self.stack))})] [" + \ + f"{self.headers[self.obj.getSide()]} (" + \ + f"{str(self.obj.getSide() + 1)})] " # Put it all togethor + self.win.hline(mlines - 2, 0, 0, mcols) self.win.addstr(mlines - 1, 0, bar_start, curses.color_pair(1)) self.win.addstr(bar_middle, star_color) self.win.insstr(bar_end, curses.color_pair(1)) def menu_print(self, string, err=False): - (mlines, mcols) = self.win.getmaxyx() + """Print messages on the menu screen""" self.win.clear() if err: color = curses.color_pair(2) @@ -75,6 +84,7 @@ class Display(): self.menu_grab() def menu_grab(self): + """Grab keypresses for the menu screen""" while True: key = self.win.getkey() if key == "q": @@ -86,6 +96,9 @@ class Display(): elif key == "y": self.stack = lightcards.get_orig()[1] self.menu_print("Stack reset!") + elif key == "a": + self.stack.sort() + self.menu_print("Stack alphabetized!") elif key == "u": [x.unStar() for x in self.stack] self.menu_print("All unstarred!") @@ -126,16 +139,21 @@ class Display(): self.obj.setIdx(0) self.get_key() - def disp_menu(self, keygrab=True): + def disp_menu(self, keygrab=True, quit=False): """ Display a menu once the end of the deck has been reached, offering multiple options on how to continue. """ + quit_text = "[q]: back" + if quit: + quit_text = "[q]: quit" + self.win.addstr("LIGHTCARDS MENU", curses.color_pair(1) + curses.A_BOLD) self.win.hline(1, 0, curses.ACS_HLINE, 15) self.win.addstr(2, 0, "[y]: reset stack to original state\n" + + "[a]: alphabetize stack\n" + "[z]: shuffle stack\n" + "[f]: flip all cards in stack\n" + "[t]: reverse stack order\n" + @@ -143,15 +161,16 @@ class Display(): "[d]: star all\n" + "[s]: update stack to include starred only\n\n" + "[r]: restart\n" + - "[q]: back") + quit_text) if keygrab: self.menu_grab() def wrap_width(self): - (mlines, mcols) = self.win.getmaxyx() - wrap_width = mcols - if mcols > 80: + """Calculate the width at which the body should wrap""" + (_, mcols) = self.win.getmaxyx() + wrap_width = mcols - 20 + if wrap_width > 80: wrap_width = 80 return wrap_width @@ -162,9 +181,9 @@ class Display(): side. """ self.win.clear() - (mlines, mcols) = self.win.getmaxyx() + (_, mcols) = self.win.getmaxyx() if self.obj.getIdx() == len(self.stack): - self.disp_menu() + self.disp_menu(quit=True) else: # If on the back of the card, show the content of the front side in # the header @@ -193,6 +212,7 @@ class Display(): self.stack[self.obj.getIdx()][self.obj.getSide()], width=self.wrap_width())) self.disp_bar() + self.disp_sidebar() def disp_help(self): """Display help screen""" @@ -263,3 +283,29 @@ class Display(): elif key == "e": (self.headers, self.stack) = lightcards.reparse() self.get_key() + + def disp_sidebar(self): + """Display a sidebar with the starred terms""" + (mlines, mcols) = self.win.getmaxyx() + left = mcols - 19 + + self.win.addstr(0, mcols - 16, "STARRED CARDS", + curses.color_pair(3) + curses.A_BOLD) + self.win.vline(0, mcols - 20, 0, mlines - 2) + self.win.hline(1, left, 0, mlines) + + i = 0 + for card in self.stack: + if i > mlines - 6: + self.win.addstr(2 + i, left, f"... ({self.ntotal() - i} more)") + break + elif card.getStar(): + term = card[0] + if len(card[0]) > 18: + term = card[0][:18] + "…" + self.win.addstr(2 + i, left, term) + + i += 1 + + if i == 0: + self.win.addstr(2, left, "None starred")