add a mirror mode
[lilass.git] / qt_dialogue.py
index 879a09aaf46b904b1bb7b6b678d4a8e86268552a..c82b8f9ee6f543aaa5c89dbf0776d55bf8203fea 100644 (file)
@@ -26,47 +26,59 @@ def makeLayout(layout, members):
     return layout
 
 class PositionSelection(QtGui.QDialog):
-    def __init__(self, internalResolutions, externalResolutions):
+    def __init__(self, internalResolutions, externalResolutions, commonResolutions):
         # set up main window
         super(PositionSelection, self).__init__()
         self.setWindowTitle('DSL - easy Display Setup for Laptops')
         
-        # position selection
+        ## position selection
         posBox = QtGui.QGroupBox('Position of external screen', self)
         self.posLeft = QtGui.QRadioButton('Left of internal screen', posBox)
         self.posRight = QtGui.QRadioButton('Right of internal screen', posBox)
         self.posRight.setChecked(True)
         self.posRight.setFocus()
         self.extOnly = QtGui.QRadioButton('Use external screen exclusively', posBox)
-        posBox.setLayout(makeLayout(QtGui.QVBoxLayout(), [self.posLeft, self.posRight, self.extOnly]))
+        self.mirror = QtGui.QRadioButton('Mirror internal screen', posBox)
+        positions = [self.posLeft, self.posRight, self.extOnly, self.mirror]
+        posBox.setLayout(makeLayout(QtGui.QVBoxLayout(), positions))
+        for pos in positions:
+            pos.toggled.connect(self.updateForm)
         
-        # primary screen
-        primBox = QtGui.QGroupBox('Which should be the primary screen?', self)
-        self.extOnly.toggled.connect(primBox.setDisabled) # disable the box if there's just one screen in use
-        self.primExt = QtGui.QRadioButton('The external screen', primBox)
-        self.primInt = QtGui.QRadioButton('The internal screen', primBox)
+        ## primary screen
+        self.primBox = QtGui.QGroupBox('Which should be the primary screen?', self)
+        self.primExt = QtGui.QRadioButton('The external screen', self.primBox)
+        self.primInt = QtGui.QRadioButton('The internal screen', self.primBox)
         self.primInt.setChecked(True)
-        primBox.setLayout(makeLayout(QtGui.QVBoxLayout(), [self.primExt, self.primInt]))
+        self.primBox.setLayout(makeLayout(QtGui.QVBoxLayout(), [self.primExt, self.primInt]))
         
-        # resolution selection
+        ## resolution selection
         resBox = QtGui.QGroupBox('Screen resolutions', self)
-        extResLabel = QtGui.QLabel('Resolution of external screen:', resBox)
+        # external screen
+        self.extResLabel = QtGui.QLabel('Resolution of external screen:', resBox)
         self.extResolutions = externalResolutions
         self.extResolutionsBox = QtGui.QComboBox(resBox)
         for res in externalResolutions:
             self.extResolutionsBox.addItem(res2user(res))
         self.extResolutionsBox.setCurrentIndex(0) # select first resolution
-        extRow = makeLayout(QtGui.QHBoxLayout(), [extResLabel, self.extResolutionsBox])
-        intResLabel = QtGui.QLabel('Resolution of internal screen:', resBox)
-        self.extOnly.toggled.connect(intResLabel.setDisabled) # disable the label if there's just one screen in use
+        self.extRow = makeLayout(QtGui.QHBoxLayout(), [self.extResLabel, self.extResolutionsBox])
+        # internal screen
+        self.intResLabel = QtGui.QLabel('Resolution of internal screen:', resBox)
         self.intResolutions = internalResolutions
         self.intResolutionsBox = QtGui.QComboBox(resBox)
         for res in internalResolutions:
             self.intResolutionsBox.addItem(res2user(res))
         self.intResolutionsBox.setCurrentIndex(0) # select first resolution
-        self.extOnly.toggled.connect(self.intResolutionsBox.setDisabled) # disable the box if there's just one screen in use
-        intRow = makeLayout(QtGui.QHBoxLayout(), [intResLabel, self.intResolutionsBox])
-        resBox.setLayout(makeLayout(QtGui.QVBoxLayout(), [extRow, intRow]))
+        self.intRow = makeLayout(QtGui.QHBoxLayout(), [self.intResLabel, self.intResolutionsBox])
+        # both screens
+        self.mirrorResLabel = QtGui.QLabel('Resolution of both screens:', resBox)
+        self.mirrorResolutions = commonResolutions
+        self.mirrorResolutionsBox = QtGui.QComboBox(resBox)
+        for res in commonResolutions:
+            self.mirrorResolutionsBox.addItem(res2user(res))
+        self.mirrorResolutionsBox.setCurrentIndex(0) # select first resolution
+        self.mirrorRow = makeLayout(QtGui.QHBoxLayout(), [self.mirrorResLabel, self.mirrorResolutionsBox])
+        # show them all
+        resBox.setLayout(makeLayout(QtGui.QVBoxLayout(), [self.extRow, self.intRow, self.mirrorRow]))
         
         # last row: buttons
         buttons = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self)
@@ -74,20 +86,40 @@ class PositionSelection(QtGui.QDialog):
         buttons.rejected.connect(self.reject)
         
         # add them all to the window
-        self.setLayout(makeLayout(QtGui.QVBoxLayout(), [posBox, primBox, resBox, buttons]))
+        self.setLayout(makeLayout(QtGui.QVBoxLayout(), [posBox, self.primBox, resBox, buttons]))
+        
+        # make sure we are consistent
+        self.updateForm()
+    
+    def updateForm(self):
+        self.primBox.setEnabled(self.posLeft.isChecked() or self.posRight.isChecked())
+        self.extResolutionsBox.setEnabled(not self.mirror.isChecked())
+        self.extResLabel.setEnabled(not self.mirror.isChecked())
+        self.intResolutionsBox.setEnabled(self.posLeft.isChecked() or self.posRight.isChecked())
+        self.intResLabel.setEnabled(self.posLeft.isChecked() or self.posRight.isChecked())
+        self.mirrorResolutionsBox.setEnabled(self.mirror.isChecked())
+        self.mirrorResLabel.setEnabled(self.mirror.isChecked())
     
     def run(self):
         self.exec_()
         if not self.result(): return None
-        return ScreenSetup(self.getRelativeScreenPosition(),
-            self.intResolutions[self.intResolutionsBox.currentIndex()],
-            self.extResolutions[self.extResolutionsBox.currentIndex()],
-            self.primExt.isChecked())
+        if self.mirror.isChecked():
+            return ScreenSetup(RelativeScreenPosition.MIRROR,
+                self.mirrorResolutions[self.mirrorResolutionsBox.currentIndex()],
+                self.mirrorResolutions[self.mirrorResolutionsBox.currentIndex()],
+                extIsPrimary = True)
+        else:
+            return ScreenSetup(self.getRelativeScreenPosition(),
+                self.intResolutions[self.intResolutionsBox.currentIndex()],
+                self.extResolutions[self.extResolutionsBox.currentIndex()],
+                self.primExt.isChecked())
     
     def getRelativeScreenPosition(self):
         if self.posLeft.isChecked():
             return RelativeScreenPosition.LEFT
         elif self.posRight.isChecked():
             return RelativeScreenPosition.RIGHT
-        else:
+        elif self.extOnly.isChecked():
             return RelativeScreenPosition.EXTERNAL_ONLY
+        else:
+            raise Exception("Nothing is checked?")