SHOW:
|
|
- or go back to the newest paste.
1 | class LineItem(urwid.WidgetWrap): | |
2 | ||
3 | def __init__(self, user, content): | |
4 | self.user = urwid.Text(user) | |
5 | self.content = urwid.Text(content) | |
6 | self.item = [ | |
7 | ('fixed', 10, urwid.Padding( | |
8 | urwid.AttrMap(self.user, 'text'), left=2)), | |
9 | urwid.AttrMap(self.content, 'text') | |
10 | ] | |
11 | self.info = '%s: %s' % (user, content) | |
12 | w = urwid.Columns(self.item) | |
13 | self.__super.__init__(w) | |
14 | ||
15 | def selectable(self): | |
16 | return True | |
17 | def keypress(self, size, key): | |
18 | return key | |
19 | ||
20 | class ExtenedEdit(urwid.Edit): | |
21 | __metaclass = urwid.signals.MetaSignals | |
22 | signals = ['done'] | |
23 | ||
24 | def keypress(self, size, key): | |
25 | ||
26 | if key is 'enter': | |
27 | urwid.emit_signal(self, 'done', self, self.get_edit_text()) | |
28 | super(ExtenedEdit, self).set_edit_text('') | |
29 | return | |
30 | elif key is 'esc': | |
31 | urwid.emit_signal(self, 'done', None) | |
32 | super(ExtenedEdit, self).set_edit_text('') | |
33 | return | |
34 | urwid.Edit.keypress(self, size, key) | |
35 | ||
36 | def selectable(self): | |
37 | return True | |
38 | ||
39 | class MainWindow(object): | |
40 | ||
41 | """ | |
42 | -------context------- | |
43 | | --inner context---- | | |
44 | || HEADER || | |
45 | || || | |
46 | || BODY || | |
47 | || || | |
48 | || DIVIDER || | |
49 | | ------------------- | | |
50 | | FOOTER | | |
51 | --------------------- | |
52 | """ | |
53 | _palette = [ | |
54 | ('divider', 'black', 'dark cyan', 'standout'), | |
55 | ('text', 'light gray', 'default'), | |
56 | ('body', 'text'), | |
57 | ('footer', 'text'), | |
58 | ('header', 'text'), ] | |
59 | ||
60 | def __init__(self): | |
61 | self.items = [] | |
62 | ||
63 | def input_cb(key): | |
64 | if key is 'f8': | |
65 | raise urwid.ExitMainLoop() | |
66 | if key is 'enter': | |
67 | text = self.txt_footer.get_edit_text() | |
68 | self.items.append(LineItem('user:', text)) | |
69 | ||
70 | def run(self): | |
71 | self.build_interface() | |
72 | ||
73 | self.main_loop = urwid.MainLoop( | |
74 | self.context, | |
75 | palette=self._palette, | |
76 | handle_mouse=False, | |
77 | unhandled_input=self.input_cb, | |
78 | ) | |
79 | ||
80 | self.main_loop.run() | |
81 | ||
82 | def _create_widget(self): | |
83 | """ create the UI widgets """ | |
84 | self.header = urwid.Text("HEADER") | |
85 | self.txt_footer = ExtenedEdit(">> ") | |
86 | self.divider = urwid.Text("Initializing.") | |
87 | item = LineItem('bavan', 'Hello') | |
88 | self.items.append(item) | |
89 | self.generic_output_walker = urwid.SimpleListWalker(self.items) | |
90 | self.lst_body = urwid.ListBox( | |
91 | self.generic_output_walker) | |
92 | ||
93 | def _setup_widgets(self): | |
94 | self.header = urwid.AttrMap(self.header, 'divider') | |
95 | self.footer = urwid.AttrMap(self.txt_footer, 'footer') | |
96 | self.divider = urwid.AttrMap(self.divider, 'divider') | |
97 | self.body = urwid.AttrMap(self.lst_body, 'body') | |
98 | ||
99 | def _setup_context(self): | |
100 | self.context = urwid.Frame(self.body, header=self.header, | |
101 | footer=self.divider) | |
102 | self.context = urwid.Frame(self.context, footer=self.footer) | |
103 | self.context.set_focus('footer') | |
104 | ||
105 | def build_interface(self): | |
106 | self._create_widget() | |
107 | self._setup_widgets() | |
108 | self._setup_context() | |
109 | ||
110 | if __name__ == '__main__': | |
111 | import sys | |
112 | try: | |
113 | main_win = MainWindow() | |
114 | main_win.run() | |
115 | except KeyboardInterrupt: | |
116 | sys.exit(0) |