16 |
16 |
17 self.value = value |
17 self.value = value |
18 self.maxlen = None # unlimited |
18 self.maxlen = None # unlimited |
19 |
19 |
20 self.tw = 0 # real width of text field (minus space for arrows) |
20 self.tw = 0 # real width of text field (minus space for arrows) |
21 self.curspos = len(value) # position of cursor in value |
21 self.curspos = 0 # position of cursor in value |
22 self.ofs = 0 # position of value beginning on screen |
22 self.ofs = 0 # position of value beginning on screen |
23 |
23 |
24 self._cursor_visible = True |
24 self._cursor_visible = True |
|
25 self.move_end() |
25 |
26 |
26 def resize(self, w, h): |
27 def resize(self, w, h): |
27 self.tw = self.width - 2 |
28 self.tw = self.width - 2 |
|
29 if self.curspos >= self.tw: |
|
30 self.ofs = self.curspos - self.tw |
28 |
31 |
29 def draw(self, buffer): |
32 def draw(self, buffer): |
30 color = self.theme.active if self.has_focus() else self.theme.normal |
33 color = self.theme.active if self.has_focus() else self.theme.normal |
31 with buffer.attr(color): |
34 with buffer.attr(color): |
32 # draw value |
35 # draw value |
46 buffer.putch(c, self.width-1, 0) |
49 buffer.putch(c, self.width-1, 0) |
47 |
50 |
48 self._cursor.update(1 + self.curspos - self.ofs, 0) |
51 self._cursor.update(1 + self.curspos - self.ofs, 0) |
49 |
52 |
50 def keypress_event(self, ev): |
53 def keypress_event(self, ev): |
51 consumed = True |
54 map_keyname_to_func = { |
52 if ev.keyname == 'left': |
55 'left': self.move_left, |
53 self.move_left() |
56 'right': self.move_right, |
54 elif ev.keyname == 'right': |
57 'home': self.move_home, |
55 self.move_right() |
58 'end': self.move_end, |
56 elif ev.keyname == 'backspace': |
59 'backspace': self.move_left_and_del, |
57 if self.curspos > 0: |
60 'delete': self.del_char, |
58 self.move_left() |
61 } |
59 self.del_char() |
62 consumed = False |
60 elif ev.keyname == 'delete': |
63 if ev.keyname in map_keyname_to_func: |
61 self.del_char() |
64 map_keyname_to_func[ev.keyname]() |
62 else: |
65 consumed = True |
63 consumed = False |
|
64 |
|
65 if not ev.keyname and ev.char: |
66 if not ev.keyname and ev.char: |
66 self.add_char(ev.char) |
67 self.add_char(ev.char) |
67 self.move_right() |
68 self.move_right() |
68 consumed = True |
69 consumed = True |
69 |
|
70 if consumed: |
70 if consumed: |
71 #self.redraw() |
71 #self.redraw() |
72 return True |
72 return True |
73 Widget.keypress_event(self, ev) |
73 Widget.keypress_event(self, ev) |
74 |
74 |
82 self.curspos -= 1 |
82 self.curspos -= 1 |
83 self.ofs -= 1 |
83 self.ofs -= 1 |
84 |
84 |
85 def move_right(self): |
85 def move_right(self): |
86 if self.curspos < len(self.value): |
86 if self.curspos < len(self.value): |
87 if self.curspos - self.ofs < self.tw - 2 \ |
87 if self.curspos - self.ofs < self.tw - 1 \ |
88 or (self.curspos - self.ofs == self.tw - 2 and self.curspos == len(self.value)-1): |
88 or (self.curspos - self.ofs == self.tw - 1 and self.curspos == len(self.value)-1): |
89 # move cursor |
89 # move cursor |
90 self.curspos += 1 |
90 self.curspos += 1 |
91 else: |
91 else: |
92 # move content in field |
92 # move content in field |
93 self.curspos += 1 |
93 self.curspos += 1 |
94 self.ofs += 1 |
94 self.ofs += 1 |
95 |
95 |
|
96 def move_home(self): |
|
97 self.curspos = 0 |
|
98 self.ofs = 0 |
|
99 |
|
100 def move_end(self): |
|
101 self.curspos = len(self.value) |
|
102 if self.curspos >= self.tw: |
|
103 self.ofs = self.curspos - self.tw |
|
104 |
96 def add_char(self, c): |
105 def add_char(self, c): |
97 self.value = self.value[:self.curspos] + c + self.value[self.curspos:] |
106 self.value = self.value[:self.curspos] + c + self.value[self.curspos:] |
98 |
107 |
99 def del_char(self): |
108 def del_char(self): |
100 self.value = self.value[:self.curspos] + self.value[self.curspos+1:] |
109 self.value = self.value[:self.curspos] + self.value[self.curspos+1:] |
101 |
110 |
|
111 def move_left_and_del(self): |
|
112 if self.curspos > 0: |
|
113 self.move_left() |
|
114 self.del_char() |