Author: Not specified Language: python
Description: Not specified Timestamp: 2013-02-28 13:39:35 +0000
View raw paste Reply
  1. import curses
  2. from collections import deque
  3. from time import sleep
  4.  
  5. def splitstr(buf, length):
  6.     return [buf[i:i+length] for i in range(0, len(buf), length)]
  7.  
  8.  
  9. class ScrollableWindow(object):
  10.     def __init__(self, stdscr, text):
  11.         self.stdscr = stdscr
  12.  
  13.         self.text = text.split('\n')
  14.         self.create_pad()
  15.  
  16.         self.rows = -1
  17.         self.cols = -1
  18.  
  19.         self.scrollpos = 0
  20.  
  21.  
  22.     def create_pad(self):
  23.         self.recompute_scratch()
  24.         self.pad = curses.newpad(len(self.scratchtext), self.cols)
  25.  
  26.         for index, line in enumerate(self.scratchtext):
  27.             self.pad.addstr(index, 0, line)
  28.  
  29.  
  30.     def recompute_scratch(self):
  31.         rows, cols = self.stdscr.getmaxyx()
  32.         self.rows, self.cols = rows, cols
  33.  
  34.         self.scratchtext = deque()
  35.         for x in self.text:
  36.             self.scratchtext.extend(splitstr(x, self.rows))
  37.  
  38.  
  39.     def add_line(self, line):
  40.         self.text.extend(line.split('\n'))
  41.  
  42.         self.recompute_scratch()
  43.  
  44.  
  45.     def display_pad(self):
  46.         self.pad.refresh(self.scrollpos, 0, 0, 0, self.rows-1, self.cols-1)
  47.  
  48.  
  49. def test(stdscr):
  50.     with open('lines.txt', 'r') as f:
  51.         text = ''.join(f.readlines())
  52.  
  53.     curses.curs_set(0)
  54.  
  55.     f = ScrollableWindow(stdscr, text)
  56.  
  57.     f.create_pad()
  58.     f.display_pad()
  59.  
  60.     while True:
  61.         c = stdscr.getch()
  62.         if c == curses.KEY_DOWN:
  63.             if f.scrollpos >= (len(f.scratchtext) - f.rows):
  64.                 curses.flash()
  65.             else:
  66.                 f.scrollpos += 1
  67.                 f.display_pad()
  68.         elif c == curses.KEY_UP:
  69.             if f.scrollpos <= 0:
  70.                 curses.flash()
  71.             else:
  72.                 f.scrollpos -= 1
  73.                 f.display_pad()
  74.         elif c == curses.KEY_RESIZE:
  75.             f.create_pad()
  76.             f.display_pad()
  77.         elif c == 27 or c == ord('q'):
  78.             return
  79.  
  80. curses.wrapper(test)
  81.  
View raw paste Reply