6
def __init__(self, char, action, help, default=False):
12
class UserInteractor(object):
21
def add_item(self, item):
22
self.items.append(item)
23
self.__total_items = len(self.items)
25
def set_items(self, item_list):
26
self.items = item_list
27
self.__total_items = len(self.items)
29
def set_item_callback(self, cb):
30
self.item_callback = cb
32
def set_start_callback(self, cb):
33
self.start_callback = cb
35
def set_end_callback(self, cb):
36
self.end_callback = cb
38
def set_prompt(self, prompt):
41
def set_options(self, opt_list):
43
for option in opt_list:
44
self.add_option(option)
46
def add_option(self, option):
47
self._options[option.char] = option
49
def get_option(self, char):
50
return self._options[char]
52
def __do_action(self, action, item):
53
if type(action) is int:
54
if action == self.QUIT:
56
self.__finished = True
57
elif action == self.RESTART:
59
elif action == self.FINISH:
60
self.__finished = True
65
def __select_loop(self):
68
while i < len(self.items):
71
self.item_callback(item, i + 1)
73
if self.__ask_once(item, i + 1):
76
if self.__quit or self.__finished:
81
self.__finished = False
83
while not self.__quit and not self.__finished:
84
self.__restart = False
90
if self.end_callback():
93
self.__ask_once(None, self.__total_items)
94
while not self.__finished and not self.__restart:
95
self.__ask_once(None, -1)
97
return not self.__quit
99
def __ask_once(self, item, count):
100
args = {'count': count, 'total' : self.__total_items}
103
sys.stdout.write(self.prompt % args)
104
sys.stdout.write(' [')
105
for char, opt in self._options.iteritems():
108
sys.stdout.write(opt.char)
109
sys.stdout.write('?] (%s): ' % default.char)
111
response = self.__getchar()
113
# default, which we see as newline, is 'n'
114
if response in ['\n', '\r', '\r\n']:
115
response = default.char
117
print response # because echo is off
119
for char, opt in self._options.iteritems():
120
if opt.char == response:
121
return self.__do_action(opt.action, item)
125
def __show_help(self):
126
for char, opt in self._options.iteritems():
127
print ' %s - %s' % (char, opt.help)
129
if sys.platform == "win32":
132
return msvcrt.getche()
137
fd = sys.stdin.fileno()
138
settings = termios.tcgetattr(fd)
141
ch = sys.stdin.read(1)
143
termios.tcsetattr(fd, termios.TCSADRAIN, settings)