Preferences/ConfigurationPages/DiffColoursPage.py

changeset 5765
39d8b26ff557
child 6048
82ad8ec9548c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Preferences/ConfigurationPages/DiffColoursPage.py	Sat Jun 24 12:15:03 2017 +0200
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Diff colours configuration page.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot
+from PyQt5.QtGui import QPalette
+from PyQt5.QtWidgets import QColorDialog
+
+from .ConfigurationPageBase import ConfigurationPageBase
+from .Ui_DiffColoursPage import Ui_DiffColoursPage
+
+import Preferences
+
+
+class DiffColoursPage(ConfigurationPageBase, Ui_DiffColoursPage):
+    """
+    Class implementing the Diff colours configuration page.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        super(DiffColoursPage, self).__init__()
+        self.setupUi(self)
+        self.setObjectName("DiffColoursPage")
+        
+        self.__coloursDict = {}
+        
+        monospacedFont = Preferences.getEditorOtherFonts("MonospacedFont")
+        self.__allSamples = (
+            self.textSample, self.addedSample, self.removedSample,
+            self.replacedSample, self.contextSample, self.headerSample,
+            self.whitespaceSample)
+        for sample in self.__allSamples:
+            sample.setFont(monospacedFont)
+        
+        # set initial values
+        self.__initColour("TextColor", self.textButton,
+                          self.__updateSampleTextColour,
+                          self.__selectTextColour, self.textSample)
+        self.__initColour("AddedColor", self.addedButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.addedSample)
+        self.__initColour("RemovedColor", self.removedButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.removedSample)
+        self.__initColour("ReplacedColor", self.replacedButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.replacedSample)
+        self.__initColour("ContextColor", self.contextButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.contextSample)
+        self.__initColour("HeaderColor", self.headerButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.headerSample)
+        self.__initColour("BadWhitespaceColor", self.whitespaceButton,
+                          self.__updateSampleBackgroundColour,
+                          self.__selectBackgroundColour, self.whitespaceSample)
+    
+    def save(self):
+        """
+        Public slot to save the Diff colours configuration.
+        """
+        for key in self.__coloursDict:
+            Preferences.setDiffColour(key, self.__coloursDict[key][0])
+    
+    def __initColour(self, colourKey, button, initSlot, selectSlot,
+                     sampleWidget):
+        """
+        Private method to initialize a colour selection button.
+        
+        @param colourKey key of the diff colour
+        @type str
+        @param button reference to the button
+        @type QPushButton
+        @param initSlot slot to be called to initialize the sample
+        @type func
+        @param selectSlot slot to be called to select the colour
+        @type func
+        @param sampleWidget reference to the sample widget
+        @type QLineEdit
+        """
+        colour = Preferences.getDiffColour(colourKey)
+        button.setProperty("colorKey", colourKey)
+        button.clicked.connect(selectSlot)
+        self.__coloursDict[colourKey] = [colour, sampleWidget]
+        if initSlot:
+            initSlot(colourKey)
+    
+    @pyqtSlot()
+    def __selectTextColour(self):
+        """
+        Private slot to select the text colour.
+        """
+        button = self.sender()
+        colorKey = button.property("colorKey")
+        
+        colour = QColorDialog.getColor(self.__coloursDict[colorKey][0], self)
+        if colour.isValid():
+            self.__coloursDict[colorKey][0] = colour
+            self.__updateSampleTextColour(colorKey)
+    
+    @pyqtSlot()
+    def __selectBackgroundColour(self):
+        """
+        Private slot to select a background colour.
+        """
+        button = self.sender()
+        colorKey = button.property("colorKey")
+        
+        colour = QColorDialog.getColor(self.__coloursDict[colorKey][0], self,
+                                       "", QColorDialog.ShowAlphaChannel)
+        if colour.isValid():
+            self.__coloursDict[colorKey][0] = colour
+            self.__updateSampleBackgroundColour(colorKey)
+    
+    @pyqtSlot()
+    def __updateSampleTextColour(self, colourKey):
+        """
+        Private slot to update the text colour of all samples.
+        
+        @param colourKey key of the diff colour
+        @type str
+        """
+        colour = self.__coloursDict[colourKey][0]
+        for sample in self.__allSamples:
+            pl = sample.palette()
+            pl.setColor(QPalette.Text, colour)
+            sample.setPalette(pl)
+            sample.repaint()
+    
+    def __updateSampleBackgroundColour(self, colourKey):
+        """
+        Private slot to update the background colour of a sample.
+        
+        @param colourKey key of the diff colour
+        @type str
+        """
+        sample = self.__coloursDict[colourKey][1]
+        if sample:
+            colour = self.__coloursDict[colourKey][0]
+            pl = sample.palette()
+            pl.setColor(QPalette.Base, colour)
+            sample.setPalette(pl)
+            sample.repaint()
+
+
+def create(dlg):
+    """
+    Module function to create the configuration page.
+    
+    @param dlg reference to the configuration dialog
+    @return reference to the instantiated page (ConfigurationPageBase)
+    """
+    page = DiffColoursPage()
+    return page

eric ide

mercurial