From 611a8e823ba8a4471d1b0cabb1dcd82506f36551 Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Sat, 30 Jan 2021 21:50:11 -0500 Subject: [PATCH] Add menu at end of stack --- lightcards/deck.py | 14 ++++- lightcards/display.py | 126 +++++++++++++++++++++++++-------------- lightcards/lightcards.py | 4 +- 3 files changed, 97 insertions(+), 47 deletions(-) diff --git a/lightcards/deck.py b/lightcards/deck.py index 2136ecc..4a768b6 100644 --- a/lightcards/deck.py +++ b/lightcards/deck.py @@ -4,6 +4,12 @@ class Card(list): starred = False + def unStar(self): + self.starred = False + + def star(self): + self.starred = True + def toggleStar(self): if self.starred: self.starred = False @@ -11,6 +17,9 @@ class Card(list): self.starred = True def getStar(self): + return self.starred + + def printStar(self): if self.starred: return "★ Starred ★" else: @@ -22,7 +31,7 @@ class Status(): side = 0 def forward(self, stack): - if not self.index == len(stack) - 1: + if not self.index == len(stack): self.index += 1 def back(self): @@ -38,6 +47,9 @@ class Status(): def setSide(self, inp): self.side = inp + def setIdx(self, inp): + self.index = inp + def getSide(self): return self.side diff --git a/lightcards/display.py b/lightcards/display.py index 349d77a..a4e5626 100755 --- a/lightcards/display.py +++ b/lightcards/display.py @@ -7,56 +7,92 @@ import os from .deck import Status +def disp_bar(stdscr, stack, headers, obj): + (mlines, mcols) = stdscr.getmaxyx() + if len(stack) <= 1: + percent = "100" + else: + percent = str(round(obj.getIdx() / (len(stack)) * 100)).zfill(3) + + stdscr.insstr(mlines - 1, 0, + "[" + + stack[obj.getIdx()].printStar() + + "] [" + + percent + + "% (" + + str(obj.getIdx() + 1) + + "/" + + str(len(stack)) + + ")]" + + " [" + + headers[obj.getSide()] + + "]") + + +def disp_menu(stdscr, stack, headers, idx): + stdscr.addstr("Good job, you've completed a round!\n\n" + + "Choose one of the following options:\n" + + "[r]estart, [s]tarred only, [u]nstar all and restart, [q]uit") + while True: + key = stdscr.getkey() + if key == "q" or key == os.linesep: + exit(0) + elif key == "r": + idx.setIdx(0) + get_key(stdscr, stack, headers, idx) + elif key == "u": + idx.setIdx(0) + for x in stack: + x.unStar() + get_key(stdscr, stack, headers, idx) + elif key == "s": + cont = False + for x in stack: + if x.getStar(): + cont = True + + if cont: + idx.setIdx(0) + stack = [x for x in stack if x.getStar()] + get_key(stdscr, stack, headers, idx) + else: + stdscr.clear() + stdscr.addstr("ERR: Stack empty. Choose another option\n\n") + disp_menu(stdscr, stack, headers, idx) + + def disp_card(stdscr, stack, headers, obj): stdscr.clear() - side_title = headers[obj.getSide()] - stdscr.addstr(side_title + "\n") - for i in range(len(side_title)): - stdscr.addstr("=") - stdscr.addstr("\n" + str(stack[obj.getIdx()][obj.getSide()])) + if obj.getIdx() == len(stack): + disp_menu(stdscr, stack, headers, obj) + else: + side_title = headers[obj.getSide()] + stdscr.addstr(side_title + "\n") + for i in range(len(side_title)): + stdscr.addch("=") + stdscr.addstr("\n" + str(stack[obj.getIdx()][obj.getSide()])) + disp_bar(stdscr, stack, headers, obj) - (mlines, mcols) = stdscr.getmaxyx() - try: - stdscr.insstr(mlines - 1, 1, - "[" + - stack[obj.getIdx()].getStar() + - "] [" + - str(round(obj.getIdx() / (len(stack) - 1) * 100)).zfill(3) + - "% (" + - str(obj.getIdx() + 1) + - "/" + - str(len(stack)) + - ")]" + - " [" + - headers[obj.getSide()] + - "]") - except Exception: - pass - - -def get_key(stdscr, stack, headers): - idx = Status() + +def get_key(stdscr, stack, headers, idx): curses.curs_set(0) disp_card(stdscr, stack, headers, idx) while True: key = stdscr.getkey() - try: - if key == "q" or key == os.linesep: - exit(0) - elif key in ["l", "KEY_LEFT"]: - idx.forward(stack) - idx.setSide(0) - disp_card(stdscr, stack, headers, idx) - elif key in ["h", "KEY_RIGHT"]: - idx.back() - idx.setSide(0) - disp_card(stdscr, stack, headers, idx) - elif key in ["j", "k", "KEY_UP", "KEY_DOWN"]: - idx.flip() - disp_card(stdscr, stack, headers, idx) - elif key in ["i", "/"]: - stack[idx.getIdx()].toggleStar() - disp_card(stdscr, stack, headers, idx) - except Exception: - pass + if key == "q" or key == os.linesep: + exit(0) + elif key in ["l", "KEY_LEFT"]: + idx.forward(stack) + idx.setSide(0) + disp_card(stdscr, stack, headers, idx) + elif key in ["h", "KEY_RIGHT"]: + idx.back() + idx.setSide(0) + disp_card(stdscr, stack, headers, idx) + elif key in ["j", "k", "KEY_UP", "KEY_DOWN"]: + idx.flip() + disp_card(stdscr, stack, headers, idx) + elif key in ["i", "/"]: + stack[idx.getIdx()].toggleStar() + disp_card(stdscr, stack, headers, idx) diff --git a/lightcards/lightcards.py b/lightcards/lightcards.py index 23f94df..775b13d 100755 --- a/lightcards/lightcards.py +++ b/lightcards/lightcards.py @@ -6,6 +6,7 @@ import argparse from curses import wrapper from . import display, parse +from .deck import Status def parse_args(): @@ -21,7 +22,8 @@ def parse_args(): def show(stack, headers): - wrapper(display.get_key, stack, headers) + idx = Status() + wrapper(display.get_key, stack, headers, idx) def main(): -- 2.39.2