Package TEES :: Package Utils :: Module Menu
[hide private]

Source Code for Module TEES.Utils.Menu

  1  import sys 
  2  import types 
  3  import textwrap 
  4  import traceback 
  5   
 34   
178   
179 -class Option:
180 SPACE = "SPACE" 181 QUIT = "QUIT" 182
183 - def __init__(self, key, text, nextMenu=None, handler=None, isDefault=False, toggle=None, dataInput=None, handlerArgs=[]):
184 self.key = key 185 self.text = text 186 self.toggle = toggle 187 self.dataInput = dataInput 188 self.isDefault = isDefault 189 self.menu = None 190 self.handler = handler 191 self.handlerArgs = handlerArgs 192 self.nextMenu = nextMenu
193
194 - def show(self, alignText=True):
195 if self.key == None: # SPACE 196 print >> sys.stderr 197 return 198 199 if self.isDefault: 200 print >> sys.stderr, " * ", 201 elif self.toggle != None: 202 if self.toggle: 203 print >> sys.stderr, "[X]", 204 else: 205 print >> sys.stderr, "[ ]", 206 else: 207 print >> sys.stderr, " ", 208 print >> sys.stderr, self.key + ")", 209 210 if self.dataInput != None: 211 print >> sys.stderr, self.text, "(" + self.menu.getAttrString(self.dataInput) + ")" 212 else: 213 print >> sys.stderr, self.text
214
215 - def do(self):
216 if self.handler == None: # no handler for this menu option, proceed to next menu 217 return 218 elif type(self.handler) == types.ListType: # multiple handlers 219 for i in range(len(self.handler)): 220 if len(self.handlerArgs) > i: 221 self._runHandler(self.handler[i], self.handlerArgs[i]) #self.handler[i](*self.handlerArgs[i]) 222 else: 223 self._runHandler(self.handler[i]) #self.handler[i]() 224 else: # one handler 225 self._runHandler(self.handler, self.handlerArgs) #self.handler(*self.handlerArgs)
226
227 - def _runHandler(self, handler, handlerArgs=[]):
228 try: 229 handler(*handlerArgs) 230 except Exception, e: 231 print >> sys.stderr 232 print >> sys.stderr, "***", "Exception processing menu '" + self.menu.title + "' option '" + self.key + " (" + self.text + ")", "***" 233 print >> sys.stderr, "Exception:", e 234 traceback.print_exc(file=sys.stderr) 235 assert self.menu.system.onException in ["EXIT", "IGNORE", "ASK"] 236 if self.menu.system.onException == "EXIT": 237 print >> sys.stderr, "Exiting" 238 sys.exit(1) 239 elif self.menu.system.onException == "IGNORE": 240 print >> sys.stderr, "Ignoring error and continuing" 241 else: # ASK 242 Option.exceptionMenu.show() 243 print >> sys.stderr, "Ignoring error and continuing"
244 245 Option.exceptionMenu = Menu("Error", "There was an error processing the menu option. Please choose whether to quit or continue", 246 [Option("i", "Ignore and continue"), 247 Option("q", "Quit", isDefault=True, handler=sys.exit, handlerArgs=[1])], 248 addToSystem=False) 249 250 # def do(self): 251 # assert self.action != None 252 # if self.action.__class__.__name__ == Menu.__name__: 253 # return self.action 254 # else: 255 # self.action(**self.actionArgs) 256 # return None 257 258 if __name__=="__main__": 259 # Import Psyco if available 260 try: 261 import psyco 262 psyco.full() 263 print >> sys.stderr, "Found Psyco, using" 264 except ImportError: 265 print >> sys.stderr, "Psyco not installed" 266 267 m = Menu("Main menu", 268 "Some Text." 269 [Option("Y", "Yes", None, True), Option("N", "No")]) 270 m.show() 271