0
|
1 |
# -*- coding: utf-8 -*-
|
|
2 |
|
|
3 |
import curses
|
|
4 |
import locale
|
|
5 |
|
|
6 |
from .widget import Widget
|
|
7 |
|
|
8 |
|
|
9 |
class EditField(Widget):
|
|
10 |
def __init__(self, width=10, value=''):
|
|
11 |
Widget.__init__(self, width, 1)
|
|
12 |
|
|
13 |
self.code = locale.getpreferredencoding()
|
|
14 |
if not type(value) is str:
|
|
15 |
value = str(value, self.code)
|
|
16 |
|
|
17 |
self.value = value
|
|
18 |
self.maxlen = None # unlimited
|
|
19 |
|
|
20 |
self.tw = self.width - 2 # real width of text field (minus space for arrows)
|
|
21 |
self.cursor = 0 # position of cursor on screen
|
|
22 |
self.pos = 0 # position of cursor in value
|
|
23 |
self.ofs = 0 # position of value beginning on screen
|
|
24 |
|
|
25 |
self.connect('draw', self.on_draw)
|
|
26 |
self.connect('keypress', self.on_keypress)
|
|
27 |
|
|
28 |
|
|
29 |
def on_draw(self, screen, x, y):
|
|
30 |
# draw value
|
|
31 |
val = self.value + ' ' * self.tw # add spaces to fill rest of field
|
|
32 |
val = val[self.ofs : self.ofs + self.tw] # cut value - begin from ofs, limit to tw chars
|
|
33 |
screen.puts(x + 1, y, val.encode(self.code))
|
|
34 |
|
|
35 |
# draw arrows if content overflows
|
|
36 |
c = ' '
|
|
37 |
if self.ofs > 0:
|
|
38 |
c = '<'
|
|
39 |
screen.putch(x, y, c)
|
|
40 |
|
|
41 |
c = ' '
|
|
42 |
if len(self.value[self.ofs:]) > self.tw:
|
|
43 |
c = '>'
|
|
44 |
screen.putch(x + self.width-1, y, c)
|
|
45 |
|
|
46 |
# move cursor to the position
|
|
47 |
screen.showcursor(x + 1 + self.cursor, y)
|
|
48 |
|
|
49 |
|
|
50 |
def on_keypress(self, keyname, char):
|
|
51 |
if keyname:
|
|
52 |
if keyname == 'left':
|
|
53 |
self.move_left()
|
|
54 |
|
|
55 |
if keyname == 'right':
|
|
56 |
self.move_right()
|
|
57 |
|
|
58 |
if keyname == 'backspace':
|
|
59 |
if self.pos > 0:
|
|
60 |
self.move_left()
|
|
61 |
self.del_char()
|
|
62 |
|
|
63 |
if keyname == 'delete':
|
|
64 |
self.del_char()
|
|
65 |
|
|
66 |
if char:
|
|
67 |
self.add_char(char)
|
|
68 |
self.move_right()
|
|
69 |
|
|
70 |
self.redraw()
|
|
71 |
|
|
72 |
|
|
73 |
def move_left(self):
|
|
74 |
if self.cursor > 1 or (self.cursor == 1 and self.pos == 1):
|
|
75 |
# move cursor
|
|
76 |
self.pos -= 1
|
|
77 |
self.cursor -= 1
|
|
78 |
else:
|
|
79 |
# move content in field
|
|
80 |
if self.pos > self.cursor:
|
|
81 |
self.pos -= 1
|
|
82 |
self.ofs -= 1
|
|
83 |
|
|
84 |
|
|
85 |
def move_right(self):
|
|
86 |
if self.pos < len(self.value):
|
|
87 |
if self.cursor < self.tw - 2 \
|
|
88 |
or (self.cursor == self.tw - 2 and self.pos == len(self.value)-1):
|
|
89 |
# move cursor
|
|
90 |
self.pos += 1
|
|
91 |
self.cursor += 1
|
|
92 |
else:
|
|
93 |
# move content in field
|
|
94 |
self.pos += 1
|
|
95 |
self.ofs += 1
|
|
96 |
|
|
97 |
|
|
98 |
def add_char(self, c):
|
|
99 |
self.value = self.value[:self.pos] + c + self.value[self.pos:]
|
|
100 |
|
|
101 |
|
|
102 |
def del_char(self):
|
|
103 |
self.value = self.value[:self.pos] + self.value[self.pos+1:]
|
|
104 |
|