1 | #!/usr/bin/env python |
---|
2 | |
---|
3 | import curses |
---|
4 | from curses import panel |
---|
5 | |
---|
6 | class Menu(object): |
---|
7 | |
---|
8 | def __init__(self, items, stdscreen): |
---|
9 | self.window = stdscreen.subwin(0,0) |
---|
10 | self.window.keypad(1) |
---|
11 | self.panel = panel.new_panel(self.window) |
---|
12 | self.panel.hide() |
---|
13 | panel.update_panels() |
---|
14 | |
---|
15 | self.position = 0 |
---|
16 | self.items = items |
---|
17 | self.items.append(('exit','exit')) |
---|
18 | |
---|
19 | def navigate(self, n): |
---|
20 | self.position += n |
---|
21 | if self.position < 0: |
---|
22 | self.position = 0 |
---|
23 | elif self.position >= len(self.items): |
---|
24 | self.position = len(self.items)-1 |
---|
25 | |
---|
26 | def display(self): |
---|
27 | self.panel.top() |
---|
28 | self.panel.show() |
---|
29 | self.window.clear() |
---|
30 | |
---|
31 | |
---|
32 | while True: |
---|
33 | self.window.refresh() |
---|
34 | curses.doupdate() |
---|
35 | for index, item in enumerate(self.items): |
---|
36 | if index == self.position: |
---|
37 | mode = curses.A_REVERSE |
---|
38 | else: |
---|
39 | mode = curses.A_NORMAL |
---|
40 | |
---|
41 | msg = '%d. %s' % (index, item[0]) |
---|
42 | self.window.addstr(1+index, 1, msg, mode) |
---|
43 | |
---|
44 | key = self.window.getch() |
---|
45 | |
---|
46 | if key in [curses.KEY_ENTER, ord('\n')]: |
---|
47 | if self.position == len(self.items)-1: |
---|
48 | break |
---|
49 | else: |
---|
50 | self.items[self.position][1]() |
---|
51 | |
---|
52 | elif key == curses.KEY_UP: |
---|
53 | self.navigate(-1) |
---|
54 | |
---|
55 | elif key == curses.KEY_DOWN: |
---|
56 | self.navigate(1) |
---|
57 | |
---|
58 | self.window.clear() |
---|
59 | self.panel.hide() |
---|
60 | panel.update_panels() |
---|
61 | curses.doupdate() |
---|
62 | |
---|
63 | |
---|
64 | class MyApp(object): |
---|
65 | |
---|
66 | def __init__(self, stdscreen): |
---|
67 | self.screen = stdscreen |
---|
68 | curses.curs_set(0) |
---|
69 | |
---|
70 | submenu_items = [ |
---|
71 | ('beep', curses.beep), |
---|
72 | ('flash', curses.flash) |
---|
73 | ] |
---|
74 | submenu = Menu(submenu_items, self.screen) |
---|
75 | |
---|
76 | main_menu_items = [ |
---|
77 | ('beep', curses.beep), |
---|
78 | ('flash', curses.flash), |
---|
79 | ('submenu', submenu.display) |
---|
80 | ] |
---|
81 | main_menu = Menu(main_menu_items, self.screen) |
---|
82 | main_menu.display() |
---|
83 | |
---|
84 | if __name__ == '__main__': |
---|
85 | curses.wrapper(MyApp) |
---|