import curses from time import sleep from fallout_functions import slowWrite, centeredWrite, NEWLINE, SPACE, addSound ###################### Functions ############################ def makeSelection(scr, SELECTIONS, MSGS): """ ALlow the user to select an option Returns the line number of the users selection starting at 0 """ inchar = 0 selection = 0 selection_count = len(SELECTIONS) selection_start_y = scr.getyx()[0] width = scr.getmaxyx()[1] while inchar not in [NEWLINE, SPACE]: # move to start of selections and hightlight current selection scr.move(selection_start_y, 0) line = 0 for sel in SELECTIONS: whole_line = "> " + SELECTIONS[line] space = width - len(whole_line) % width whole_line += " " * space if line == selection: scr.addstr(whole_line, curses.A_REVERSE) else: scr.addstr(whole_line) line += 1 scr.refresh() inchar = scr.getch() # move up and down if inchar == curses.KEY_UP and selection > 0: selection -= 1 addSound("keyenter") elif inchar == curses.KEY_DOWN and selection < selection_count - 1: selection += 1 addSound("keyenter") addSound("keyenter") if MSGS and MSGS[selection]: whole_line = "> " + MSGS[selection] space = width - len(whole_line) % width whole_line += " " * space scr.addstr(" " * width) scr.addstr(whole_line) scr.refresh() sleep(2) return selection def runSelection(scr, CENTERED_HEADERS, OTHER_HEADERS, OPTIONS, MESSAGES): """ Print the selections and allow the user to select one """ curses.use_default_colors() scr.erase() scr.move(0, 0) curses.curs_set(0) curses.noecho() width = scr.getmaxyx()[1] for header in CENTERED_HEADERS: centeredWrite(scr, header + "\n") for header in OTHER_HEADERS: slowWrite(scr, header + "\n") for i in range(width): scr.addch(curses.ACS_BSBS) scr.refresh() return makeSelection(scr, OPTIONS, MESSAGES) def beginSelection(center, other, options, messages=[]): """ Initialize curses and start the boot process """ res = curses.wrapper(runSelection, center, other, options, messages) return res