summaryrefslogtreecommitdiffstats
path: root/cholerab/cholerab-live/view.py
blob: 01b53b8c9564dee62e1ff71c2d919d28e3b8b4e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/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
      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: 
        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()