62decc6b326c61e87a90ce02c673594340059f6a
[lilass.git] / gui.py
1 # DSL - easy Display Setup for Laptops
2 # Copyright (C) 2012-2015 Ralf Jung <post@ralfj.de>
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 # This file abstracts GUI stuff away, so that the actual dsl.py does not have to deal with it
19
20 '''
21 This module implements two functions:
22
23 def error(message):
24     This function displays the error message to the user in some appropriate fassion
25
26 def setup(internalResolutions, externalResolutions):
27     Both arguments are lists of (width, height) tuples of resolutions. You can use dsl.res2user to obtain a user-readable representation of a resolution tuple.
28     The user should be asked about his display setup preferences.
29     The function returns None if the user cancelled, and an instance of dsl.ScreenSetup otherwise.
30 '''
31 import sys
32 import collections
33
34 from cli_frontend import CLIFrontend
35 from zenity_frontend import ZenityFrontend
36
37 # Qt frontend
38 class QtFrontend:
39     def __init__(self):
40         from PyQt4 import QtGui
41         self.app = QtGui.QApplication(sys.argv)
42         print("Qt loaded")
43     
44     def error(self, message):
45         from PyQt4 import QtGui
46         QtGui.QMessageBox.critical(None, 'Fatal error', message)
47     
48     def setup(self, situation):
49         from qt_dialogue import PositionSelection
50         return PositionSelection(situation).run()
51     
52     @staticmethod
53     def isAvailable():
54         try:
55             import PyQt4
56             return True
57         except ImportError:
58             return False
59
60 # list of available frontends
61 frontends = collections.OrderedDict()
62 frontends["qt"] = QtFrontend
63 frontends["zenity"] = ZenityFrontend
64 frontends["cli"] = CLIFrontend
65
66 # get a frontend
67 def getFrontend(name = None):
68     # by name
69     if name is not None:
70         if name in frontends:
71             if frontends[name].isAvailable():
72                 return frontends[name]() # call constructor
73             else:
74                 raise Exception("Frontend %s not available" % name)
75         # frontend not found
76         raise Exception("Frontend %s not found" % name)
77     # auto-detect
78     for frontend in frontends.values():
79         if frontend.isAvailable():
80             return frontend() # call constructor
81     raise Exception("No frontend is available - this should not happen")