abstract the dialogue away so it can be implementing using an abritrary GUI frontend...
authorRalf Jung <post@ralfj.de>
Sun, 7 Oct 2012 12:45:29 +0000 (14:45 +0200)
committerRalf Jung <post@ralfj.de>
Sun, 7 Oct 2012 12:45:29 +0000 (14:45 +0200)
dsl.py
gui.py
qt_dialogue.py [moved from selector_window.py with 86% similarity]

diff --git a/dsl.py b/dsl.py
index e1a945e5208454ac58deb0dfd083ce64f94f6fb1..1c4ec1e867e2eef94d26ec7fdbf36716e0ac115b 100755 (executable)
--- a/dsl.py
+++ b/dsl.py
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 import os, re, subprocess
-from selector_window import PositionSelection
 import gui
 
 # for auto-config: common names of internal connectors
 commonInternalConnectorNames = ['LVDS', 'LVDS0', 'LVDS1', 'LVDS-0', 'LVDS-1']
 
+# this is as close as one can get to an enum in Python
+class RelativeScreenPosition:
+       LEFT          = 0
+       RIGHT         = 1
+       EXTERNAL_ONLY = 2
+
 # Load a section-less config file: maps parameter names to space-separated lists of strings (with shell quotation)
 def loadConfigFile(file):
        import shlex
@@ -142,25 +147,25 @@ def main():
        if usedExternalConnector is not None: # there's an external screen connected, we need to ask what to do
                internalResolutions = connectors[internalConnector]
                externalResolutions = connectors[usedExternalConnector]
-               extPosition = PositionSelection(usedExternalConnector, map(res2user, internalResolutions), map(res2user, externalResolutions))
-               extPosition.exec_()
-               if not extPosition.result(): sys.exit(1) # the user canceled
-               extResolution = res2xrandr(externalResolutions[extPosition.extResolutions.currentIndex()])
-               intResolution = res2xrandr(internalResolutions[extPosition.intResolutions.currentIndex()])
+               dialogue = gui.getDialogue(usedExternalConnector, map(res2user, internalResolutions), map(res2user, externalResolutions))
+               if not dialogue.run(): sys.exit(1) # the user canceled
+               extResolution = res2xrandr(externalResolutions[dialogue.getExtResolutionIndex()])
+               intResolution = res2xrandr(internalResolutions[dialogue.getIntResolutionIndex()])
+               relPosition = dialogue.getRelativeScreenPosition()
                # build command-line
                args[usedExternalConnector] = ["--mode", extResolution] # set external screen to desired resolution
-               if extPosition.extOnly.isChecked():
+               if relPosition == RelativeScreenPosition.EXTERNAL_ONLY:
                        args[usedExternalConnector] += ["--primary"]
                else:
                        # there are two screens
                        args[internalConnector] = ["--mode", intResolution] # set internal screen to desired resolution
                        # set position
-                       if extPosition.posLeft.isChecked():
+                       if relPosition == RelativeScreenPosition.LEFT:
                                args[usedExternalConnector] += ["--left-of", internalConnector]
                        else:
                                args[usedExternalConnector] += ["--right-of", internalConnector]
                        # set primary screen
-                       if extPosition.primExt.isChecked():
+                       if dialogue.externalIsPrimary():
                                args[usedExternalConnector] += ["--primary"]
                        else:
                                args[internalConnector] += ["--primary"]
diff --git a/gui.py b/gui.py
index a85f2d52bcb8bd57abe07eb0e303f4a06c5f02aa..b6906e122af59c70f1310c9fa8538894ed15d0eb 100644 (file)
--- a/gui.py
+++ b/gui.py
 # This file bstracts GUI stuff away, so that the actual dsl.py does not have to deal with it
 import sys
 from PyQt4 import QtGui
+from qt_dialogue import PositionSelection
 app = QtGui.QApplication(sys.argv)
 
 def error(message):
+       '''Displays a fatal error to the user'''
        QtGui.QMessageBox.critical(None, 'Fatal error', message)
+
+def getDialogue(externalName, internalResolutions, externalResolutions):
+       '''Returns a class implementing the following functions:
+        * run() opens the dialogue. returns True if it was accepted, False otherwise
+        * getRelativeScreenPosition() returns one of the RelativeScreenPosition values (see dsl.py)
+        * getIntResolutionIndex() returns the index of an element in the internalResolutions list
+        * getExtResolutionIndex() returns the index of an element in the externalResolutions list
+        * externalIsPrimary() returns whether the external screen is the primary one (True) or the internal one (False)
+       '''
+       return PositionSelection(externalName, internalResolutions, externalResolutions)
similarity index 86%
rename from selector_window.py
rename to qt_dialogue.py
index 556158c2c108c4f8b18769decc63604218c9684d..4ebcd62dfb309150221d427d93de9dc3b73a026c 100644 (file)
@@ -14,6 +14,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program (gpl.txt); if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+from dsl import RelativeScreenPosition
 from PyQt4 import QtCore, QtGui
 
 def makeLayout(layout, members):
@@ -25,10 +26,6 @@ def makeLayout(layout, members):
        return layout
 
 class PositionSelection(QtGui.QDialog):
-       LEFT = 10
-       RIGHT = 20
-       EXTERNAL_ONLY = 30
-       
        def __init__(self, externalName, internalResolutions, externalResolutions):
                # set up main window
                super(PositionSelection, self).__init__()
@@ -76,3 +73,24 @@ class PositionSelection(QtGui.QDialog):
                
                # add them all to the window
                self.setLayout(makeLayout(QtGui.QVBoxLayout(), [posBox, primBox, resBox, buttons]))
+       
+       def run(self):
+               self.exec_()
+               return True if self.result() else False
+       
+       def getRelativeScreenPosition(self):
+               if self.posLeft.isChecked():
+                       return RelativeScreenPosition.LEFT
+               elif self.posRight.isChecked():
+                       return RelativeScreenPosition.RIGHT
+               else:
+                       return RelativeScreenPosition.EXTERNAL_ONLY
+       
+       def getIntResolutionIndex(self):
+               return self.intResolutions.currentIndex()
+       
+       def getExtResolutionIndex(self):
+               return self.extResolutions.currentIndex()
+       
+       def externalIsPrimary(self):
+               return self.primExt.isChecked()