diff options
Diffstat (limited to '.graveyard/cholerab-live/view.py')
| -rw-r--r-- | .graveyard/cholerab-live/view.py | 112 | 
1 files changed, 112 insertions, 0 deletions
| diff --git a/.graveyard/cholerab-live/view.py b/.graveyard/cholerab-live/view.py new file mode 100644 index 00000000..6a75f655 --- /dev/null +++ b/.graveyard/cholerab-live/view.py @@ -0,0 +1,112 @@ +#!/usr/bin/python2 + +from curses import * +import socket +import threading +import logging +log = logging.getLogger('cholerab-curses') + +class CursesView(threading.Thread): +  def addch(self,char): +    """ +    adds a char at the current cursor position +    abstraction to the curses win.addch() +    """ +    try: self.win.addch(char) +    except: pass +    self.cholerab.send_char(self.x,self.y,chr(char)) +  def stop(self): +    #TODO setting back the whole terminal currently does not work correctly, fix me harder +    self.running = False +    self.clear() +    self.win.refresh() +    nocbreak(); self.scr.keypad(0); echo() +    #endwin() + +  def run(self): +    """ +    input loop + +    TODO add Unicode Input Support +    """ +    self.running = True +    def try_move(x,y): +      if x >= self.width: x = 0;y = y+1 +      if x < 0 : x = self.width-1; y= y-1 +      if y >= self.height : x = x+1;y = 0 +      if y < 0 : x = x-1; y = self.height-1 +      self.win.move(y,x); return x,y + +    while self.running: +      c = self.scr.getch() #get_char(self.scr)  +                           #TODO UTF8 here, get_wch not yet implemented +      log.debug("Pressed : %d" % c) +      if c == KEY_LEFT : self.x -=1 +      elif c == KEY_RIGHT : self.x +=1 +      elif c == KEY_UP : self.y -=1 +      elif c == KEY_DOWN : self.y +=1 +      elif c == ord('q') : self.stop() +      elif c == 127 or c == KEY_BACKSPACE:  +        log.info('backspace pressed') +        self.x -=1;  +        self.x,self.y = try_move(self.x,self.y) +        self.addch(ord(' ')) +      elif c == ord('\n'):  +        log.info('enter pressed') +        self.y +=1;  +        self.x,self.y = try_move(self.x,self.y) +      else :  +        self.addch(c)  +        self.x +=1 +      self.x,self.y = try_move(self.x,self.y) +      self.refresh() + +  def write_char(self,x,y,char,user=1): +    user = user % 3 + 1 +    self.win.addch(y,x,char,color_pair(user)) +    self.win.move(self.y,self.x) +    self.refresh() +  def write_str(self,x,y,string,user=1): +    self.win.addstr(y,x,string,color_pair(user)) +    self.win.move(self.y,self.x) +    self.refresh() +  def refresh(self): +    self.scr.refresh() +    self.win.refresh() +  def clear(self): +    self.win.clear() +    pass +  def write_field(self,ar): +    """ +    writes the whole field with given 2-dimensional array +    """ +    self.clear() +    pass + +  def __init__(self,height=24,width=80,cholerab=None,scr=None): +    # TODO handle sessions somehow +    if scr: +     self.scr = scr +    else: +     self.scr = initscr() +    start_color() +    init_pair(1,COLOR_WHITE,COLOR_BLACK) +    init_pair(2,COLOR_RED,COLOR_BLACK) +    init_pair(3,COLOR_GREEN,COLOR_BLACK) +    init_pair(3,COLOR_CYAN,COLOR_BLACK) +    threading.Thread.__init__(self) +    self.cholerab = cholerab + +    noecho() +    cbreak() +    self.scr.keypad(1) +    try: curs_set(2) +    except: pass # go home with your non-standard terminals! + +    begin_x = 0;begin_y = 0 +    self.height = height +    self.width = width +    self.x = 0 ; self.y = 0 + +    self.win = newwin(height,width,begin_y,begin_x) +    self.clear() | 
