View difference between Paste ID: Kj2zpcJF and 50B3H7yr
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)