From: Constantin Berhard Date: Tue, 28 Jul 2015 10:47:26 +0000 (+0200) Subject: moved cli and zenity frontend to their own files X-Git-Url: https://git.ralfj.de/lilass.git/commitdiff_plain/903dba50d3acc98129b86fb8c6a92997ec086114?hp=6fd92bb21b1a743d0a794141277a7aea857d3c50 moved cli and zenity frontend to their own files --- diff --git a/cli_frontend.py b/cli_frontend.py new file mode 100644 index 0000000..5e9d400 --- /dev/null +++ b/cli_frontend.py @@ -0,0 +1,51 @@ +# DSL - easy Display Setup for Laptops +# Copyright (C) 2012-2015 Ralf Jung +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# interactive command line interface, question based + +from question_frontend import QuestionFrontend + +import sys + +class CLIFrontend(QuestionFrontend): + def error(self, message): + print(message, file=sys.stderr) + + 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 diff --git a/gui.py b/gui.py index d586442..1622410 100644 --- a/gui.py +++ b/gui.py @@ -31,7 +31,8 @@ def setup(internalResolutions, externalResolutions): ''' import subprocess, collections -from question_frontend import QuestionFrontend +from cli_frontend import CLIFrontend +from zenity_frontend import ZenityFrontend from screen import processOutputIt # Qt frontend @@ -57,63 +58,6 @@ class QtFrontend: except ImportError: return False - -# Zenity frontend -class ZenityFrontend(QuestionFrontend): - def error(self, message): - '''Displays a fatal error to the user''' - subprocess.check_call(["zenity", "--error", "--text="+message]) - 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: - processOutputIt("zenity", "--version") - return True - except FileNotFoundError: - return False - except PermissionError: - return False - -# CLI frontend -class CLIFrontend(QuestionFrontend): - def error(self, message): - print(message, file=sys.stderr) - - 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 - # list of available frontends frontends = collections.OrderedDict() frontends["qt"] = QtFrontend diff --git a/zenity_frontend.py b/zenity_frontend.py new file mode 100644 index 0000000..7dd4d82 --- /dev/null +++ b/zenity_frontend.py @@ -0,0 +1,50 @@ +# DSL - easy Display Setup for Laptops +# Copyright (C) 2012-2015 Ralf Jung +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# interactive zenity interface, question based + +from question_frontend import QuestionFrontend +from screen import processOutputIt + +import subprocess + +class ZenityFrontend(QuestionFrontend): + def error(self, message): + '''Displays a fatal error to the user''' + subprocess.check_call(["zenity", "--error", "--text="+message]) + + 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: + processOutputIt("zenity", "--version") + return True + except FileNotFoundError: + return False + except PermissionError: + return False