X-Git-Url: https://git.ralfj.de/lilass.git/blobdiff_plain/b098177b57f9e0ed811bbaaad0d8a09486101cd1..6fd92bb21b1a743d0a794141277a7aea857d3c50:/gui.py diff --git a/gui.py b/gui.py index 998783f..d586442 100644 --- a/gui.py +++ b/gui.py @@ -31,6 +31,9 @@ def setup(internalResolutions, externalResolutions): ''' import subprocess, collections +from question_frontend import QuestionFrontend +from screen import processOutputIt + # Qt frontend class QtFrontend: def __init__(self): @@ -56,33 +59,57 @@ class QtFrontend: # Zenity frontend -class ZenityFrontend: - def error(message): +class ZenityFrontend(QuestionFrontend): + def error(self, message): '''Displays a fatal error to the user''' subprocess.check_call(["zenity", "--error", "--text="+message]) - - def setup(self, situation): - from zenity_dialogue import run - return run(situation.internalResolutions(), situation.externalResolutions()) - - @staticmethod + def userChoose (self, title, choices, returns, fallback): + assert len(choices) == len(returns) + args = ["zenity", "--list", "--text="+title, "--column="]+choices + switch = dict (list(zip (choices,returns))) + try: + for line in processOutputIt(*args): + return switch.get(line.strip(), fallback) + except Exception: + # on user cancel, the return code of zenity is nonzero + return fallback + # if the output was empty + return fallback def isAvailable(): try: - from screen import processOutputIt processOutputIt("zenity", "--version") return True - except Exception: + except FileNotFoundError: + return False + except PermissionError: return False - # CLI frontend -class CLIFrontend: +class CLIFrontend(QuestionFrontend): def error(self, message): print(message, file=sys.stderr) - - def setup(self, internalResolutions, externalResolutions, commonRes): - raise Exception("Choosing the setup interactively is not supported with the CLI frontend") - + + def userChoose (self, title, choices, returns, fallback): + while True: + # print question + print(title) + for i in range(len(choices)): + print("%d. %s"%(i,choices[i])) + print("Enter 'c' to cancel.") + # handle input + answer = input("> ") + if answer == "c": + return None + #else + try: + answerint = int(answer) + if answerint >= 0 and answerint < len(choices): + return returns[answerint] + except ValueError: + pass + # if we are here something invalid was entered + print("INVALID ANSWER: '%s'" % answer) + @staticmethod def isAvailable(): return True @@ -100,8 +127,10 @@ def getFrontend(name = None): if name in frontends: if frontends[name].isAvailable(): return frontends[name]() # call constructor - # frontend not found or not available - raise Exception("Frontend %s not found or not available" % name) + else: + raise Exception("Frontend %s not available" % name) + # frontend not found + raise Exception("Frontend %s not found" % name) # auto-detect for frontend in frontends.values(): if frontend.isAvailable():