~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to userinteractor.py

  • Committer: abentley
  • Date: 2005-09-09 23:45:23 UTC
  • Revision ID: abentley@lappy-20050909234523-421be0d47ff07df4
Typo fix from David Clymer

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import sys
2
 
 
3
 
if sys.platform == "win32":
4
 
    import msvcrt
5
 
    def getchar():
6
 
        return msvcrt.getch()
7
 
else:
8
 
    import tty
9
 
    import termios
10
 
    def getchar():
11
 
        fd = sys.stdin.fileno()
12
 
        settings = termios.tcgetattr(fd)
13
 
        try:
14
 
            tty.setraw(fd)
15
 
            ch = sys.stdin.read(1)
16
 
        finally:
17
 
            termios.tcsetattr(fd, termios.TCSADRAIN, settings)
18
 
        return ch
19
 
 
20
 
 
21
 
class UserOption:
22
 
    def __init__(self, char, action, help, default=False):
23
 
        self.char = char
24
 
        self.action = action
25
 
        self.default = default
26
 
        self.help = help
27
 
 
28
 
class UserInteractor(object):
29
 
    # Special actions
30
 
    RESTART = 0
31
 
    QUIT = 1
32
 
    FINISH = 2
33
 
 
34
 
    def __init__(self):
35
 
        self.items = []
36
 
 
37
 
    def add_item(self, item):
38
 
        self.items.append(item)
39
 
        self.__total_items = len(self.items)
40
 
 
41
 
    def set_items(self, item_list):
42
 
        self.items = item_list
43
 
        self.__total_items = len(self.items)
44
 
 
45
 
    def set_item_callback(self, cb):
46
 
        self.item_callback = cb
47
 
 
48
 
    def set_start_callback(self, cb):
49
 
        self.start_callback = cb
50
 
 
51
 
    def set_end_callback(self, cb):
52
 
        self.end_callback = cb
53
 
 
54
 
    def set_prompt(self, prompt):
55
 
        self.prompt = prompt
56
 
 
57
 
    def set_options(self, opt_list):
58
 
        self._options = []
59
 
        self._option_dict = {}
60
 
        for option in opt_list:
61
 
            self.add_option(option)
62
 
 
63
 
    def add_option(self, option):
64
 
        self._options.append(option)
65
 
        self._option_dict[option.char] = option
66
 
 
67
 
    def get_option(self, char):
68
 
        return self._option_dict[char]
69
 
 
70
 
    def __do_action(self, action, item):
71
 
        if type(action) is int:
72
 
            if action == self.QUIT:
73
 
                self.__quit = True
74
 
                self.__finished = True
75
 
            elif action == self.RESTART:
76
 
                self.__restart = True
77
 
                self.__finished = False
78
 
            elif action == self.FINISH:
79
 
                self.__finished = True
80
 
            return True
81
 
        else:
82
 
            return action(item)
83
 
 
84
 
    def __select_loop(self):
85
 
        i = 0
86
 
        self.start_callback()
87
 
        while i < len(self.items):
88
 
                item = self.items[i]
89
 
 
90
 
                self.item_callback(item, i + 1)
91
 
 
92
 
                if self.__ask_once(item, i + 1):
93
 
                    i += 1
94
 
 
95
 
                if self.__quit or self.__finished:
96
 
                    break
97
 
 
98
 
    def interact(self):
99
 
        self.__quit = False
100
 
        self.__finished = False
101
 
 
102
 
        while not self.__quit and not self.__finished:
103
 
            self.__restart = False
104
 
 
105
 
            self.__select_loop()
106
 
            if self.__quit:
107
 
                break
108
 
 
109
 
            if self.end_callback():
110
 
                break
111
 
 
112
 
            self.__finished = False
113
 
 
114
 
            self.__ask_once(None, self.__total_items)
115
 
            while not self.__finished and not self.__restart:
116
 
                self.__ask_once(None, -1)
117
 
 
118
 
        return not self.__quit
119
 
 
120
 
    def __ask_once(self, item, count):
121
 
        args = {'count': count, 'total' : self.__total_items}
122
 
 
123
 
        while True:
124
 
            sys.stdout.write(self.prompt % args)
125
 
            sys.stdout.write(' [')
126
 
            for opt in self._options:
127
 
                if opt.default:
128
 
                    default = opt
129
 
                sys.stdout.write(opt.char)
130
 
            sys.stdout.write('?] (%s): ' % default.char)
131
 
 
132
 
            response = getchar()
133
 
 
134
 
            # default, which we see as newline, is 'n'
135
 
            if response in ['\n', '\r', '\r\n']:
136
 
                response = default.char
137
 
 
138
 
            print response # because echo is off
139
 
 
140
 
            for opt in self._options:
141
 
                if opt.char == response:
142
 
                    return self.__do_action(opt.action, item)
143
 
 
144
 
            self.__show_help()
145
 
 
146
 
        return False # keep pychecker happy
147
 
 
148
 
    def __show_help(self):
149
 
        for opt in self._options:
150
 
            print '  %s - %s' % (opt.char, opt.help)