tuikit/widgets/textfield.py
changeset 97 0c2e0c09ba5c
parent 62 2f61931520c9
child 103 49f212aa0228
child 109 105b1affc3c2
--- /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:]
+