import sys
import textwrap
-from . import lightcards
+from . import lightcards, progress
class Display():
curses.init_pair(3, curses.COLOR_YELLOW, 0)
self.get_key()
+ def leave(self):
+ if self.obj.getIdx() == len(self.stack):
+ self.obj.setIdx(0)
+
+ progress.dump((self.obj, self.stack, self.headers), self.stack)
+ sys.exit(0)
+
def disp_bar(self):
"""
Display the statusbar at the bottom of the screen with progress, star
status, and card side.
"""
- (mlines, mcols) = self.win.getmaxyx()
+ (mlines, _) = self.win.getmaxyx()
# Calculate percent done
if len(self.stack) <= 1:
percent = "100"
else:
percent = str(round(self.obj.getIdx() /
- len(self.stack) * 100)).zfill(3)
+ len(self.stack) * 100)).zfill(2)
# Print yellow if starred
if self.stack[self.obj.getIdx()].getStar():
# Create bar component
bar_start = "["
bar_middle = self.stack[self.obj.getIdx()].printStar()
- bar_end= "] [" + percent + "% (" + \
+ bar_end = "] [" + percent + "% (" + \
str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack)))) + \
"/" + str(len(self.stack)) + ")] [" + \
self.headers[self.obj.getSide()] + " (" + \
def menu_print(self, string, err=False):
self.win.clear()
if err:
- self.win.addstr(string + "\n\n", curses.color_pair(2))
+ color = curses.color_pair(2)
else:
- self.win.addstr(string + "\n\n", curses.color_pair(1))
- self.disp_menu()
+ color = curses.color_pair(1)
+ self.disp_menu(keygrab=False)
+ self.win.addstr("\n\n" + string, color)
+ self.menu_grab()
- def disp_menu(self):
- """
- Display a menu once the end of the deck has been reached, offering
- multiple options on how to continue.
- """
-
- self.win.addstr("Choose one of the following options:\n\n" +
- "[y]: reset stack to original state\n" +
- "[z]: shuffle stack\n" +
- "[f]: flip all cards in stack\n" +
- "[t]: reverse stack order\n" +
- "[u]: unstar all\n" +
- "[s]: update stack to include starred only\n\n" +
- "[r]: restart\n" +
- "[q]: quit")
- self.obj.setIdx(0)
+ def menu_grab(self):
while True:
key = self.win.getkey()
if key == "q":
- sys.exit(0)
+ if len(self.stack) == self.obj.getIdx():
+ self.leave()
+ elif len(self.stack) < self.obj.getIdx():
+ self.obj.setIdx(0)
+ self.get_key()
elif key == "y":
self.stack = lightcards.get_orig()[1]
self.menu_print("Stack reset!")
elif key == "u":
[x.unStar() for x in self.stack]
self.menu_print("All unstarred!")
+ elif key == "d":
+ [x.star() for x in self.stack]
+ self.menu_print("All starred!")
elif key == "t":
self.stack.reverse()
self.menu_print(
"self.stack reversed!")
elif key == "z":
shuffle(self.stack)
- self.menu_print("self.stack shuffled!")
+ self.menu_print("Stack shuffled!")
elif key == "f":
for x in self.stack:
x[0], x[1] = x[1], x[0]
self.menu_print("Stars only!")
else:
self.menu_print("ERR: None are starred!", err=True)
+ elif key in ["h", "KEY_LEFT"]:
+ self.obj.setIdx(len(self.stack) - 1)
+ self.get_key()
elif key == "r":
+ self.obj.setIdx(0)
self.get_key()
+ 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" +
+ "[z]: shuffle stack\n" +
+ "[f]: flip all cards in stack\n" +
+ "[t]: reverse stack order\n" +
+ "[u]: unstar all\n" +
+ "[d]: star all\n" +
+ "[s]: update stack to include starred only\n\n" +
+ "[r]: restart\n" +
+ quit_text)
+
+ if keygrab:
+ self.menu_grab()
+
def wrap_width(self):
- (mlines, mcols) = self.win.getmaxyx()
+ (_, mcols) = self.win.getmaxyx()
wrap_width = mcols
if mcols > 80:
wrap_width = 80
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
self.win.hline(1, 0, curses.ACS_HLINE, 15)
self.win.addstr(2, 0, textwrap.fill(
"Welcome to lightcards. Here are some keybindings to get you " +
- "started", width=self.wrap_width()) +
+ "started:", width=self.wrap_width()) +
"\n\nh, left previous card\n" +
"l, right next card\n" +
"j, k, up, down flip card\n" +
"0, ^, home go to the start of the deck\n" +
"$, end go to the end of the deck\n" +
"H, ? open this screen\n" +
- "e open the input file in $EDITOR\n\n" +
+ "e open the input file in $EDITOR\n" +
+ "m open the control menu\n\n" +
textwrap.fill(
"More information can be found in the man page, " +
"or by running `lightcards --help`.",
while True:
key = self.win.getkey()
if key == "q":
- sys.exit(0)
+ self.leave()
elif key in ["l", "KEY_RIGHT"]:
self.obj.forward(self.stack)
self.obj.setSide(0)
self.disp_card()
elif key in ["H", "?"]:
self.disp_help()
+ elif key == "m":
+ self.win.clear()
+ self.disp_menu()
elif key == "e":
(self.headers, self.stack) = lightcards.reparse()
self.get_key()