# Copyright (C) 2020-2022, Dhinak G, Mykola Grymalyuk from resources import utilities class TUIMenu: def __init__(self, title, prompt, options=None, return_number_instead_of_direct_call=False, add_quit=True, auto_number=False, in_between=None, top_level=False, loop=False): self.title = title self.prompt = prompt self.in_between = in_between or [] self.options = options or [] self.return_number_instead_of_direct_call = return_number_instead_of_direct_call self.auto_number = auto_number self.add_quit = add_quit self.top_level = top_level self.loop = loop self.added_quit = False def add_menu_option(self, name, description="", function=None, key=""): self.options.append([key, name, description, function]) def start(self): return_option = ["Q", "Quit"] if self.top_level else ["B", "Back"] if self.add_quit and not self.added_quit: self.add_menu_option(return_option[1], function=None, key=return_option[0]) self.added_quit = True while True: utilities.cls() utilities.header(self.title) print() for i in self.in_between: print(i) if self.in_between: print() for index, option in enumerate(self.options): if self.auto_number and not (index == (len(self.options) - 1) and self.add_quit): option[0] = str((index + 1)) print(option[0] + ". " + option[1]) for i in option[2]: print("\t" + i) print() selected = input(self.prompt) keys = [option[0].upper() for option in self.options] if not selected or selected.upper() not in keys: if self.loop: continue else: return if self.add_quit and selected.upper() == return_option[0]: return -1 elif self.return_number_instead_of_direct_call: return self.options[keys.index(selected.upper())][0] else: self.options[keys.index(selected.upper())][3]() if self.options[keys.index(selected.upper())][3] else None if not self.loop: return class TUIOnlyPrint: def __init__(self, title, prompt, in_between=None): self.title = title self.prompt = prompt self.in_between = in_between or [] def start(self): utilities.cls() utilities.header(self.title) print() for i in self.in_between: print(i) if self.in_between: print() return input(self.prompt)