1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 from libxyz.core.utils import ustring
18 from libxyz.ui import lowui
19 import libxyz.ui
20
21 -class ListEntry(lowui.FlowWidget):
22 """
23 List entry
24 """
25
26 - def __init__(self, msg, selected_attr, entry_attr=None):
27 """
28 @param msg: Message
29 @param selected_attr: Atrribute of selected entry
30 @param entry_attr: Entry text attribute
31 """
32
33 super(ListEntry, self).__init__()
34
35 self._text = msg
36 self._sel_attr = selected_attr
37 self._entry_attr = entry_attr
38 self._content = lowui.Text(self._text)
39
40
41
42 - def selectable(self):
44
45
46
47 - def rows(self, (maxcol,), focus=False):
48 return len(self._content.get_line_translation(maxcol))
49
50
51
52 - def render(self, (maxcol,), focus=False):
53 if focus:
54 self._content.set_text((self._sel_attr, self._text))
55 else:
56 if self._entry_attr is not None:
57 self._content.set_text((self._entry_attr, self._text))
58 else:
59 self._content.set_text(self._text)
60
61 return self._content.render((maxcol,), focus)
62
63
64
65 - def keypress(self, (maxcol,), key):
67
68
69
70 text = property(lambda self: self._text)
71
72
73
74 -class NumEntry(ListEntry):
75 """
76 Entry in list box which can be activated by pressing corresponding number
77 """
78
79 - def __init__(self, msg, selected_attr, num_order, entry_attr=None,
80 enter_cb=None):
81 """
82 @param msg: Message
83 @param selected_attr: Atrribute of selected entry
84 @param entry_attr: Entry text attribute
85 @param num_order: Entry number
86 @param enter_cb: Callback to be executed upon ENTER pressed
87 """
88
89 self._num = []
90
91 if callable(enter_cb):
92 self._enter_cb = enter_cb
93 else:
94 self._enter_cb = None
95
96 self.num_order = num_order
97 self._keys = libxyz.ui.Keys()
98 _msg = u"%d: %s" % (num_order, msg)
99
100 super(NumEntry, self).__init__(_msg, selected_attr, entry_attr)
101
102
103
104 - def keypress(self, (maxcol,), key):
105 if key == self._keys.ENTER and callable(self._enter_cb):
106 if self._num:
107 _index = int("".join(self._num))
108 self._num = []
109 else:
110 _index = self.num_order
111 try:
112 self._enter_cb(_index)
113 except Exception, e:
114 xyzlog.error(_(u"Error in entry callback: %s" %
115 ustring(str(e))))
116 xyzlog.debug(ustring(traceback.format_exc()))
117
118 return key
119 elif key.isdigit():
120 self._num.append(key)
121 else:
122 return key
123