]> git.armaanb.net Git - lightcards.git/blobdiff - lightcards/display.py
Add proper text wrapping and truncation
[lightcards.git] / lightcards / display.py
index 59a5bca194a0a8500728a477d34d00ba2190e429..c9da9a95557aa133129319c3890ca45060e3f1ea 100755 (executable)
@@ -3,6 +3,8 @@
 
 import curses
 from random import shuffle
+import sys
+import textwrap
 
 
 def disp_bar(stdscr, stack, headers, obj):
@@ -29,6 +31,7 @@ def disp_bar(stdscr, stack, headers, obj):
 
 
 def disp_menu(stdscr, stack, headers, idx):
+    stdscr.clear()
     curses.init_pair(1, curses.COLOR_CYAN, 0)
     curses.init_pair(2, curses.COLOR_RED, 0)
     stdscr.addstr("Good job, you've completed a round!\n\n",
@@ -42,7 +45,7 @@ def disp_menu(stdscr, stack, headers, idx):
     while True:
         key = stdscr.getkey()
         if key == "q":
-            exit(0)
+            sys.exit(0)
         elif key == "r":
             idx.setIdx(0)
             get_key(stdscr, stack, headers, idx)
@@ -74,23 +77,36 @@ def disp_menu(stdscr, stack, headers, idx):
 
 def disp_card(stdscr, stack, headers, obj):
     stdscr.clear()
+    (mlines, mcols) = stdscr.getmaxyx()
     if obj.getIdx() == len(stack):
         disp_menu(stdscr, stack, headers, obj)
     else:
         if obj.getSide() == 0:
-            top = headers[obj.getSide()] + " " + str(obj.getIdx() + 1) + "\n"
+            top = headers[obj.getSide()] + "; " + str(obj.getIdx() + 1)
         else:
-            top = headers[obj.getSide()] + " " + str(obj.getIdx() + 1) + \
-                "; " + str(stack[obj.getIdx()][0]) + "\n"
+            top = headers[obj.getSide()] + "; " + str(obj.getIdx() + 1) + \
+                "; " + str(stack[obj.getIdx()][0])
+
+        header_width = mcols
+        if mcols > 80:
+            header_width = 80
+
+        stdscr.addstr(textwrap.shorten(top, width=header_width,
+                                       placeholder="…"), curses.A_BOLD)
 
-        stdscr.addstr(top, curses.A_BOLD)
-        (mlines, mcols) = stdscr.getmaxyx()
+        # Add horizontal line
+        lin_width = mcols
         if len(top) < mcols:
-            mcols = len(top)
-        for i in range(mcols):
-            stdscr.addch("=")
+            lin_width = len(top)
+        stdscr.hline(1, 0, curses.ACS_HLINE, lin_width)
 
-        stdscr.addstr("\n" + str(stack[obj.getIdx()][obj.getSide()]))
+        # Show current side
+        wrap_width = mcols
+        if mcols > 80:
+            wrap_width = 80
+        stdscr.hline(curses.ACS_HLINE, lin_width)
+        stdscr.addstr(2, 0, textwrap.fill(stack[obj.getIdx()][obj.getSide()],
+                                          width=wrap_width))
     disp_bar(stdscr, stack, headers, obj)
 
 
@@ -101,7 +117,7 @@ def get_key(stdscr, stack, headers, idx):
     while True:
         key = stdscr.getkey()
         if key == "q":
-            exit(0)
+            sys.exit(0)
         elif key in ["l", "KEY_LEFT"]:
             idx.forward(stack)
             idx.setSide(0)