]> git.armaanb.net Git - lightcards.git/blobdiff - lightcards/display.py
Fix pickle implementation
[lightcards.git] / lightcards / display.py
index 76e312d9a3e3585fb8cfc3f76657746e1c6957ba..a130728e703776f8ee1d5b62ccad9454886da353 100644 (file)
@@ -7,7 +7,7 @@ from random import shuffle
 import sys
 import textwrap
 
-from . import lightcards, progress
+from . import runner, progress
 
 
 class Display:
@@ -17,7 +17,7 @@ class Display:
         self.obj = obj
 
     def run(self, stdscr):
-        """Set important options before beginning"""
+        """Set important options that require stdscr before starting"""
         self.win = stdscr
         (mlines, mcols) = self.win.getmaxyx()
         curses.curs_set(0)  # Hide cursor
@@ -32,26 +32,27 @@ class Display:
         self.get_key()
 
     def panel_create(self, x, y):
-        """Create popup menus"""
+        """Create popup panels to a certain scale"""
         win = curses.newwin(x, y)
         panel = curses.panel.new_panel(win)
         win.erase()
         return (win, panel)
 
     def panel_up(self):
+        """Update panel and window contents"""
         curses.panel.update_panels()
         self.win.refresh()
 
     def leave(self):
         """Pickle stack before quitting"""
-        if self.obj.getIdx() == len(self.stack):
+        if self.obj.getIdx() + 1 == len(self.stack):
             self.obj.setIdx(0)
 
-        progress.dump(self.stack, lightcards.get_orig())
+        progress.dump(self.stack, runner.get_orig()[1])
         sys.exit(0)
 
     def ntotal(self):
-        """Get toal number of starred cards"""
+        """Get total number of starred cards"""
         return [card for card in self.stack if card.getStar()]
 
     def disp_bar(self):
@@ -70,21 +71,21 @@ class Display:
             ).zfill(2)
 
         # Print yellow if starred
-        if self.stack[self.obj.getIdx()].getStar():
+        if self.current_card().getStar():
             star_color = curses.color_pair(3)
         else:
             star_color = curses.color_pair(1)
 
         # Create bar component
         bar_start = "["
-        bar_middle = self.stack[self.obj.getIdx()].printStar()
+        bar_middle = self.current_card().printStar()
         bar_end = (
             f"] [{len(self.ntotal())}/{str(len(self.stack))} starred] "
             + f"[{percent}% ("
             + str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack))))
             + f"/{str(len(self.stack))})] ["
-            + f"{self.headers[self.stack[self.obj.getIdx()].getSide()]} ("
-            + f"{str(self.stack[self.obj.getIdx()].getSide()) + str(1)})] "
+            + f"{self.headers[self.current_card().getSide()]} ("
+            + f"{str(int(self.current_card().getSide()) + 1)})] "
         )
 
         # Put it all togethor
@@ -112,20 +113,20 @@ class Display:
         self.menu_grab()
 
     def menu_grab(self):
-        """Grab keypresses for the menu screen"""
+        """Grab keypresses on the menu screen"""
         while True:
             key = self.win.getkey()
             if key in ["r", "q", "m"]:
                 self.menu_panel.hide()
                 self.panel_up()
             if key in ["q", "m"]:
-                if len(self.stack) == self.obj.getIdx():
+                if len(self.stack) == self.obj.getIdx() + 1:
                     self.leave()
-                elif len(self.stack) < self.obj.getIdx():
+                elif len(self.stack) < self.obj.getIdx() + 1:
                     self.obj.setIdx(0)
                 self.get_key()
             elif key == "y":
-                self.stack = lightcards.get_orig()[1]
+                self.stack = runner.get_orig()[1]
                 self.menu_print("Stack reset!")
             elif key == "a":
                 self.stack.sort()
@@ -172,6 +173,7 @@ class Display:
                 self.get_key()
 
     def menu_init(self, quit=True):
+        """Initialize the menu with content"""
         (self.menu_win, self.menu_panel) = self.panel_create(17, 44)
         self.menu_panel.top()
         self.menu_panel.hide()
@@ -205,8 +207,8 @@ class Display:
 
     def disp_menu(self, keygrab=True):
         """
-        Display a menu once the end of the deck has been reached, offering
-        multiple options on how to continue.
+        Display a menu offering multiple options on how to manipulate the deck
+        and to continue
         """
         (mlines, mcols) = self.win.getmaxyx()
         self.menu_win.mvwin(int(mlines / 2) - 9, int(mcols / 2) - 22)
@@ -217,7 +219,7 @@ class Display:
             self.menu_grab()
 
     def wrap_width(self):
-        """Calculate the width at which the body should wrap"""
+        """Calculate the width at which the body text should wrap"""
         (_, mcols) = self.win.getmaxyx()
         wrap_width = mcols - 20
         if wrap_width > 80:
@@ -226,71 +228,62 @@ class Display:
 
     def disp_card(self):
         """
-        Display the contents of the card
+        Display the contents of the card.
         Shows a header, a horizontal line, and the contents of the current
         side.
         """
         (mlines, mcols) = self.win.getmaxyx()
-        if self.obj.getIdx() == len(self.stack):
-            self.disp_menu()
-        else:
-            self.main_panel.bottom()
-            self.main_win.clear()
-            # If on the back of the card, show the content of the front side in
-            # the header
-            num_done = str(self.obj.getIdx() + 1).zfill(
-                len(str(len(self.stack)))
+        self.main_panel.bottom()
+        self.main_win.clear()
+        # If on the back of the card, show the content of the front side in
+        # the header
+        num_done = str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack))))
+        if self.current_card().getSide() == 0:
+            top = (
+                num_done + " | " + self.headers[self.current_card().getSide()]
             )
-            if self.stack[self.obj.getIdx()].getSide() == 0:
-                top = (
-                    num_done
-                    + " | "
-                    + self.headers[self.stack[self.obj.getIdx()].getSide()]
-                )
-            else:
-                top = (
-                    num_done
-                    + " | "
-                    + self.headers[self.stack[self.obj.getIdx()].getSide()]
-                    + ' | "'
-                    + str(self.stack[self.obj.getIdx()][0])
-                    + '"'
-                )
-            header_width = mcols
-            if mcols > 80:
-                header_width = 80
-
-            self.main_win.addstr(
-                0,
-                0,
-                textwrap.shorten(top, width=header_width, placeholder="…"),
-                curses.A_BOLD,
+        else:
+            top = (
+                num_done
+                + " | "
+                + self.headers[self.current_card().getSide()]
+                + ' | "'
+                + str(self.current_card().getFront())
+                + '"'
             )
+        header_width = mcols
+        if mcols > 80:
+            header_width = 80
 
-            # Add horizontal line
-            lin_width = header_width
-            if len(top) < header_width:
-                lin_width = len(top)
-            self.main_win.hline(1, 0, curses.ACS_HLINE, lin_width)
-
-            # Show current side
-            self.main_win.addstr(
-                2,
-                0,
-                textwrap.fill(
-                    self.stack[self.obj.getIdx()][
-                        self.stack[self.obj.getIdx()].getSide()
-                    ],
-                    width=self.wrap_width(),
-                ),
-            )
+        self.main_win.addstr(
+            0,
+            0,
+            textwrap.shorten(top, width=header_width, placeholder="…"),
+            curses.A_BOLD,
+        )
+
+        # Add horizontal line
+        lin_width = header_width
+        if len(top) < header_width:
+            lin_width = len(top)
+        self.main_win.hline(1, 0, curses.ACS_HLINE, lin_width)
+
+        # Show current side
+        self.main_win.addstr(
+            2,
+            0,
+            textwrap.fill(
+                self.current_card().get(),
+                width=self.wrap_width(),
+            ),
+        )
         self.panel_up()
         self.disp_bar()
         self.disp_sidebar()
         self.win.hline(mlines - 2, 0, 0, mcols)
 
     def help_init(self):
-        """Display help screen"""
+        """Initialize help screen"""
         (self.help_win, self.help_panel) = self.panel_create(20, 52)
         self.help_panel.top()
         self.help_panel.hide()
@@ -300,7 +293,7 @@ class Display:
         )
         self.help_win.hline(2, 1, curses.ACS_HLINE, 15)
         text = [
-            "Welcome to lightcards. Here are some keybindings",
+            "Welcome to runner. Here are some keybindings",
             "to get you started:",
             "",
             "h, left          previous card",
@@ -325,6 +318,7 @@ class Display:
         self.help_win.box()
 
     def disp_help(self):
+        """Display help screen"""
         (mlines, mcols) = self.win.getmaxyx()
         self.help_win.mvwin(int(mlines / 2) - 10, int(mcols / 2) - 26)
         self.panel_up()
@@ -335,12 +329,15 @@ class Display:
                 self.help_panel.hide()
                 self.get_key()
 
+    def current_card(self):
+        """Get current card object"""
+        return self.stack[self.obj.getIdx()]
+
     def get_key(self):
         """
         Display a card and wait for the input.
         Used as a general way of getting back into the card flow from a menu
         """
-
         self.disp_card()
         while True:
             key = self.win.getkey()
@@ -348,32 +345,35 @@ class Display:
                 self.leave()
             elif key in ["h", "KEY_LEFT"]:
                 self.obj.back()
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["l", "KEY_RIGHT"]:
-                self.obj.forward(self.stack)
-                self.stack[self.obj.getIdx()].setSide(0)
-                self.disp_card()
+                if self.obj.getIdx() + 1 == len(self.stack):
+                    self.disp_menu()
+                else:
+                    self.obj.forward(self.stack)
+                    self.current_card().setSide(0)
+                    self.disp_card()
             elif key in ["j", "k", "KEY_UP", "KEY_DOWN"]:
-                self.stack[self.obj.getIdx()].flip()
+                self.current_card().flip()
                 self.disp_card()
             elif key in ["i", "/"]:
-                self.stack[self.obj.getIdx()].toggleStar()
+                self.current_card().toggleStar()
                 self.disp_card()
             elif key in ["0", "^", "KEY_HOME"]:
                 self.obj.setIdx(0)
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["$", "KEY_END"]:
                 self.obj.setIdx(len(self.stack) - 1)
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["H", "?"]:
                 self.disp_help()
             elif key == "m":
                 self.disp_menu()
             elif key == "e":
-                (self.headers, self.stack) = lightcards.reparse()
+                (self.headers, self.stack) = runner.reparse()
                 self.get_key()
 
     def disp_sidebar(self):
@@ -398,12 +398,12 @@ class Display:
         elif mlines - 5 == len(self.ntotal()):
             newntotal = self.ntotal()[: mlines - 3]
 
-        for card in newntotal:
-            for i in enumerate(newntotal):
-                term = i[1][0]
-                if len(i[1][0]) > 18:
-                    term = i[1][0][:18] + "…"
-                self.win.addstr(2 + i[0], left, term)
+        for _ in newntotal:
+            for i, card in enumerate(newntotal):
+                term = card.getFront()
+                if len(term) > 18:
+                    term = term + "…"
+                self.win.addstr(2 + i, left, term)
             if not newntotal == self.ntotal():
                 self.win.addstr(
                     mlines - 3,