--- 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()