--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tuikit/widgets/textfield.py Fri Mar 28 19:58:59 2014 +0100
@@ -0,0 +1,102 @@
+import locale
+
+from tuikit.core.widget import Widget
+
+
+class TextField(Widget):
+
+ def __init__(self, value=''):
+ Widget.__init__(self)
+ self.sizereq.update(10, 1)
+
+ self.allow_focus = True
+
+ 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 set_theme(self, theme):
+ self.color = theme.normal
+
+ def draw(self, buffer):
+ with buffer.attr(self.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):
+ Widget.keypress(self, keyname, char, mod)
+ accepted = 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:
+ accepted = False
+
+ if char:
+ self.add_char(char)
+ self.move_right()
+ accepted = True
+
+ #if accepted:
+ #self.redraw()
+ return accepted
+
+ 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:]
+