tuikit/widgets/textfield.py
changeset 113 6796adfdc7eb
parent 112 ce2e67e7bbb8
parent 104 742e504ec053
child 119 dd91747504dd
--- a/tuikit/widgets/textfield.py	Wed Sep 03 19:17:04 2014 +0200
+++ b/tuikit/widgets/textfield.py	Wed Sep 03 21:56:20 2014 +0200
@@ -18,13 +18,16 @@
         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.curspos = 0  # position of cursor in value
         self.ofs = 0      # position of value beginning on screen
 
         self._cursor_visible = True
+        self.move_end()
 
     def resize(self, w, h):
         self.tw = self.width - 2
+        if self.curspos >= self.tw:
+            self.ofs = self.curspos - self.tw
 
     def draw(self, buffer):
         color = self.theme.active if self.has_focus() else self.theme.normal
@@ -48,25 +51,22 @@
             self._cursor.update(1 + self.curspos - self.ofs, 0)
 
     def keypress_event(self, ev):
-        consumed = True
-        if ev.keyname == 'left':
-            self.move_left()
-        elif ev.keyname == 'right':
-            self.move_right()
-        elif ev.keyname == 'backspace':
-            if self.curspos > 0:
-                self.move_left()
-                self.del_char()
-        elif ev.keyname == 'delete':
-            self.del_char()
-        else:
-            consumed = False
-
+        map_keyname_to_func = {
+            'left':       self.move_left,
+            'right':      self.move_right,
+            'home':       self.move_home,
+            'end':        self.move_end,
+            'backspace':  self.move_left_and_del,
+            'delete':     self.del_char,
+        }
+        consumed = False
+        if ev.keyname in map_keyname_to_func:
+            map_keyname_to_func[ev.keyname]()
+            consumed = True
         if not ev.keyname and ev.char:
             self.add_char(ev.char)
             self.move_right()
             consumed = True
-
         if consumed:
             #self.redraw()
             return True
@@ -84,8 +84,8 @@
 
     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):
+            if self.curspos - self.ofs < self.tw - 1 \
+            or (self.curspos - self.ofs == self.tw - 1 and self.curspos == len(self.value)-1):
                 # move cursor
                 self.curspos += 1
             else:
@@ -93,9 +93,22 @@
                 self.curspos += 1
                 self.ofs += 1
 
+    def move_home(self):
+        self.curspos = 0
+        self.ofs = 0
+
+    def move_end(self):
+        self.curspos = len(self.value)
+        if self.curspos >= self.tw:
+            self.ofs = self.curspos - self.tw
+
     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:]
 
+    def move_left_and_del(self):
+        if self.curspos > 0:
+            self.move_left()
+            self.del_char()