Subversion Repositories programming

Rev

Blame | Last modification | View Log | RSS feed

#!/usr/bin/env python

__author__    = "Ira W. Snyder (devel@irasnyder.com)"
__copyright__ = "Copyright (c) 2006 Ira W. Snyder (devel@irasnyder.com)"
__license__   = "GNU GPL v2 (or, at your option, any later version)"

from PyCompat import * # fixes for school computers

def getstr (prompt):
        return raw_input (prompt + ': ')

class MenuEntry (object):

        def __init__ (self, key, prompt, callback_func, hidden=False):
                self.key = key
                self.prompt = prompt
                self.callback_func = callback_func
                self.hidden = hidden

class Menu (object):

        def __init__ (self, entries=None, autorun=False, name=None):
                if not entries:
                        self.entries = []
                else:
                        self.entries = entries

                self.autorun = autorun
                self.name = name

        def __sort_entries (self):
                newlist = []
                
                for e in self.entries:
                        newlist.append ((e.key, e))

                newlist.sort ()
                self.entries = [e[1] for e in newlist]

        def add_entry (self, key, prompt, callback_func):
                for e in self.entries:
                        if e.key == str(key):
                                raise ValueError
                
                self.entries.append (MenuEntry (str(key), prompt, callback_func))
                self.__sort_entries ()

        def hide_entry (self, key):
                for e in self.entries:
                        if e.key == str(key):
                                e.hidden = True

        def unhide_entry (self, key):
                for e in self.entries:
                        if e.key == str(key):
                                e.hidden = False

        def show_menu (self):
                if self.name:
                        print self.name
                        print '========================================'

                for e in self.entries:
                        if not e.hidden:
                                print '%s) %s' % (e.key, e.prompt)

        def run_menu (self):
                choices = {}

                for e in self.entries:
                        if not e.hidden:
                                choices[e.key] = e.callback_func

                ok = False
                while not ok:
                        self.show_menu ()
                        c = getstr ('Enter Choice')
                        print

                        if c in choices.keys():
                                ok = True
                                if self.autorun:
                                        result = choices[c]()
                                        return (c, result)
                                else:
                                        return (c, choices[c]) # (choice, callback function pointer)
                        else:
                                print 'Unrecognized Choice, try again!\n'

import sys

def main ():
        m = Menu ()
        m.add_entry (1, 'Run DFS', lambda: 'in dfs')
        m.add_entry (2, 'Run BFS', lambda: 'in bfs')
        m.add_entry (3, 'Enter Data', lambda: 'enter data')
        m.add_entry ('Q', 'Quit', sys.exit)

        stat = m.run_menu ()
        print 'stat:', stat

if __name__ == '__main__':
        main ()