1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# check if the entry.py and time modules are being used. Remove import if not.
from msvcrt import *
from entry import *
from time import *
class Menu():
def __init__(self, prompt, entries, color_int=7, side_bar=None):
self.prompt = prompt
self.entries = entries
self.iter_entries = iter(entries)
self.color_int = color_int
self.next_item = None
self.side_bar = side_bar
@property
def text_color(self):
if self.color_int > 0 and self.color_int <=7:
return f'\033[9{self.color_int}m'
@property
def indicate_color(self):
if self.color_int > 0 and self.color_int <=7:
return f'\033[10{self.color_int}m\033[30m'
def refresh(self):
if self.color_int == 7: color_int = None
else: color_int = self.color_int
self.text = '\n'
if color_int: self.text += f'\033[9{color_int}m'
self.text += self.prompt
self.text += '\n' * 2
for entry in self.entries:
if hasattr(entry, 'get_options'):
entry.get_options()
self.text += '\t' + entry.indicate(color_int)
if color_int: self.text += f'\033[9{color_int}m'
self.text += '\n'
self.text += '\n'
def open(self, prev_menu):
self.clear()
self.prev_menu = prev_menu
self.next_item = None
self.entries.set_select()
self.refresh()
self.print_side_bar()
print(self.text)
self.keyboard_nav()
def clear(self):
print('\033[0m', '\033[?25l', '\033[2J', '\033[0;0f', sep='', end='')
def reprint(self):
self.clear()
self.print_side_bar()
print(self.text)
def print_side_bar(self):
if self.side_bar:
lines = self.side_bar.split('\n')
l = 2
for line in lines:
print(f'\033[{l};40f', f'\033[9{self.color_int}m', line, '\033[0m', sep='', end='')
l+=1
print('\033[0;0f', end='')
def nav_entries(self, next='NEXT'):
self.entries.nav(next)
self.refresh()
self.reprint()
def edit_param(self, param):
param.edit = True
self.refresh()
self.reprint()
param.keyboard_edit()
param.edit = False
self.refresh()
self.reprint()
def keyboard_nav(self):
while True:
cmd = getch()
if cmd == b'\x1b' or cmd == b'\x08':
self.next_item = self.prev_menu
break
elif cmd == b'\x00' or cmd == b'\xe0':
cmd = getch()
if cmd == b'M' or cmd == b'P':
self.nav_entries(next='NEXT')
elif cmd == b'K' or cmd == b'H':
self.nav_entries(next='PREV')
elif cmd == b'\t':
self.nav_entries(next='NEXT')
elif cmd == b'\r':
for entry in self.entries:
if entry.select and type(entry) is Param:
self.edit_param(entry)
elif entry.select:
self.next_item = entry.item
if self.next_item != None:
break
|