Add cursesw driver, using curses get_wch() for unicode input. It alse has enabled keypad() to let curses interpret control keys and mouse input.
import locale
from tuikit.core.widget import Widget
class TextField(Widget):
def __init__(self, value=''):
Widget.__init__(self)
self.allow_focus = True
self.sizereq.update(10, 1)
self.code = locale.getpreferredencoding()
if not isinstance(value, str):
value = str(value, self.code)
self.value = value
self.maxlen = None # unlimited
self.tw = 0 # real width of text field (minus space for arrows)
self.curspos = len(value) # position of cursor in value
self.ofs = 0 # position of value beginning on screen
def resize(self, w, h):
self.tw = self.width - 2
def draw(self, buffer):
color = self.theme.active if self.has_focus() else self.theme.normal
with buffer.attr(color):
# draw value
val = self.value + ' ' * self.tw # add spaces to fill rest of field
val = val[self.ofs : self.ofs + self.tw] # cut value - begin from ofs, limit to tw chars
buffer.puts(val.encode(self.code), 1)
# draw arrows if content overflows
c = ' '
if self.ofs > 0:
c = '<'
buffer.putch(c)
c = ' '
if len(self.value[self.ofs:]) > self.tw:
c = '>'
buffer.putch(c, self.width-1, 0)
self._cursor = (1 + self.curspos - self.ofs, 0)
def keypress(self, keyname, char, mod=0):
consumed = True
if keyname == 'left':
self.move_left()
elif keyname == 'right':
self.move_right()
elif keyname == 'backspace':
if self.curspos > 0:
self.move_left()
self.del_char()
elif keyname == 'delete':
self.del_char()
else:
consumed = False
if not keyname and char:
self.add_char(char)
self.move_right()
consumed = True
if consumed:
#self.redraw()
return True
Widget.keypress(self, keyname, char, mod)
def move_left(self):
if self.curspos - self.ofs > 1 or (self.ofs == 0 and self.curspos == 1):
# move cursor
self.curspos -= 1
else:
# move content in field
if self.ofs > 0:
self.curspos -= 1
self.ofs -= 1
def move_right(self):
if self.curspos < len(self.value):
if self.curspos - self.ofs < self.tw - 2 \
or (self.curspos - self.ofs == self.tw - 2 and self.curspos == len(self.value)-1):
# move cursor
self.curspos += 1
else:
# move content in field
self.curspos += 1
self.ofs += 1
def add_char(self, c):
self.value = self.value[:self.curspos] + c + self.value[self.curspos:]
def del_char(self):
self.value = self.value[:self.curspos] + self.value[self.curspos+1:]