EditorHighlightingStylesPage: added support for sub-styles and adjusted code to today's Qt. sub_styles

Thu, 14 Mar 2019 19:43:40 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 14 Mar 2019 19:43:40 +0100
branch
sub_styles
changeset 6860
50069cc0ee49
parent 6859
951aa89d367d
child 6861
20899dc18e59

EditorHighlightingStylesPage: added support for sub-styles and adjusted code to today's Qt.

Preferences/ConfigurationPages/EditorHighlightingStylesPage.py file | annotate | diff | comparison | revisions
--- a/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Thu Mar 14 19:42:25 2019 +0100
+++ b/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Thu Mar 14 19:43:40 2019 +0100
@@ -130,23 +130,9 @@
             itm = QListWidgetItem(description, self.styleElementList)
             itm.setData(self.StyleRole, styleNo)
             itm.setData(self.SubstyleRole, subStyleNo)
-            # TODO: add substyle handling
         self.__styleAllItems()
         self.styleElementList.setCurrentRow(0)
     
-    # TODO: remove this once done
-    def __styleForRow(self, row):
-        """
-        Private method to get the style number of the item of a given row.
-        
-        @param row row number
-        @type int
-        @return style number
-        @rtype int
-        """
-        itm = self.styleElementList.item(row)
-        return itm.data(self.StyleRole)
-    
     def __stylesForRow(self, row):
         """
         Private method to get the style and sub-style number of the item of
@@ -155,13 +141,63 @@
         @param row row number
         @type int
         @return tuple containing the style and sub-style numbers
-        @rtype tuple of (int,int)
+        @rtype tuple of (int, int)
         """
         itm = self.styleElementList.item(row)
+        return self.__stylesForItem(itm)
+
+    def __stylesForItem(self, itm):
+        """
+        Private method to get the style and sub-style number of the given item.
+        
+        @param itm reference to the item to extract the styles from
+        @type QListWidgetItem
+        @return tuple containing the style and sub-style numbers
+        @rtype tuple of (int, int)
+        """
         style = itm.data(self.StyleRole)
         substyle = itm.data(self.SubstyleRole)
+
+        return (style, substyle)
+    
+    def __currentStyles(self):
+        """
+        Private method to get the styles of the current item.
         
-        return (style, substyle)
+        @return tuple containing the style and sub-style numbers
+        @rtype tuple of (int, int)
+        """
+        itm =  self.styleElementList.currentItem()
+        if itm is None:
+            styles = (0, -1)    # return default style
+        else:
+            styles = self.__stylesForItem(itm)
+        
+        return styles
+    
+    def __styleOneItem(self, item, style, substyle):
+        """
+        Private method to style one item of the style element list.
+        
+        @param item reference to the item to be styled
+        @type QListWidgetItem
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        colour = self.lexer.color(style, substyle)
+        paper = self.lexer.paper(style, substyle)
+        font = self.lexer.font(style, substyle)
+        eolfill = self.lexer.eolFill(style, substyle)
+        
+        item.setFont(font)
+        item.setBackground(paper)
+        item.setForeground(colour)
+        if eolfill:
+            item.setCheckState(Qt.Checked)
+        else:
+            item.setCheckState(Qt.Unchecked)
     
     def __styleAllItems(self):
         """
@@ -169,35 +205,26 @@
         """
         for row in range(self.styleElementList.count()):
             style, substyle = self.__stylesForRow(row)
-            colour = self.lexer.color(style, substyle)
-            paper = self.lexer.paper(style, substyle)
-            font = self.lexer.font(style, substyle)
-            eolfill = self.lexer.eolFill(style, substyle)
-            
             itm = self.styleElementList.item(row)
-            itm.setFont(font)
-            itm.setBackground(paper)
-            itm.setForeground(colour)
-            if eolfill:
-                itm.setCheckState(Qt.Checked)
-            else:
-                itm.setCheckState(Qt.Unchecked)
-        
-    def on_styleElementList_currentRowChanged(self, row):
+            self.__styleOneItem(itm, style, substyle)
+    
+    def on_styleElementList_currentItemChanged(self, current, previous):
         """
         Private method to handle a change of the current row.
         
-        @param row current row number
-        @type int
+        @param current reference to the current item
+        @type QListWidgetItem
+        @param previous reference to the previous item
+        @type QListWidgetItem
         """
-        if row < 0:
+        if current is None:
             return
         
-        self.style = self.__styleForRow(row)    # TODO: get rid of self.style
-        colour = self.lexer.color(self.style)
-        paper = self.lexer.paper(self.style)
-        eolfill = self.lexer.eolFill(self.style)
-        font = self.lexer.font(self.style)
+        style, substyle = self.__stylesForItem(current)
+        colour = self.lexer.color(style, substyle)
+        paper = self.lexer.paper(style, substyle)
+        eolfill = self.lexer.eolFill(style, substyle)
+        font = self.lexer.font(style, substyle)
         
         self.sampleText.setFont(font)
         pl = self.sampleText.palette()
@@ -213,21 +240,17 @@
         Private method used to select the foreground colour of the selected
         style and lexer.
         """
-        colour = QColorDialog.getColor(self.lexer.color(self.style))
+        style, substyle = self.__currentStyles()
+        colour = QColorDialog.getColor(self.lexer.color(style, substyle))
         if colour.isValid():
             pl = self.sampleText.palette()
             pl.setColor(QPalette.Text, colour)
             self.sampleText.setPalette(pl)
             self.sampleText.repaint()
-            if len(self.styleElementList.selectedItems()) > 1:
-                for selItem in self.styleElementList.selectedItems():
-                    style = self.__styleForRow(
-                        self.styleElementList.row(selItem))
-                    self.lexer.setColor(colour, style)
-                    selItem.setForeground(colour)
-            else:
-                self.lexer.setColor(colour, self.style)
-                self.styleElementList.currentItem().setForeground(colour)
+            for selItem in self.styleElementList.selectedItems():
+                style, substyle = self.__stylesForItem(selItem)
+                self.lexer.setColor(colour, style, substyle)
+                selItem.setForeground(colour)
         
     @pyqtSlot()
     def on_backgroundButton_clicked(self):
@@ -235,21 +258,17 @@
         Private method used to select the background colour of the selected
         style and lexer.
         """
-        colour = QColorDialog.getColor(self.lexer.paper(self.style))
+        style, substyle = self.__currentStyles()
+        colour = QColorDialog.getColor(self.lexer.paper(style, substyle))
         if colour.isValid():
             pl = self.sampleText.palette()
             pl.setColor(QPalette.Base, colour)
             self.sampleText.setPalette(pl)
             self.sampleText.repaint()
-            if len(self.styleElementList.selectedItems()) > 1:
-                for selItem in self.styleElementList.selectedItems():
-                    style = self.__styleForRow(
-                        self.styleElementList.row(selItem))
-                    self.lexer.setPaper(colour, style)
-                    selItem.setBackground(colour)
-            else:
-                self.lexer.setPaper(colour, self.style)
-                self.styleElementList.currentItem().setBackground(colour)
+            for selItem in self.styleElementList.selectedItems():
+                style, substyle = self.__stylesForItem(selItem)
+                self.lexer.setPaper(colour, style, substyle)
+                selItem.setBackground(colour)
         
     @pyqtSlot()
     def on_allBackgroundColoursButton_clicked(self):
@@ -257,15 +276,16 @@
         Private method used to select the background colour of all styles of a
         selected lexer.
         """
-        colour = QColorDialog.getColor(self.lexer.paper(self.style))
+        style, substyle = self.__currentStyles()
+        colour = QColorDialog.getColor(self.lexer.paper(style, substyle))
         if colour.isValid():
             pl = self.sampleText.palette()
             pl.setColor(QPalette.Base, colour)
             self.sampleText.setPalette(pl)
             self.sampleText.repaint()
             for row in range(self.styleElementList.count()):
-                style = self.__styleForRow(row)
-                self.lexer.setPaper(colour, style)
+                style, substyle = self.__stylesForRow(row)
+                self.lexer.setPaper(colour, style, substyle)
             self.__styleAllItems()
         
     def __changeFont(self, doAll, familyOnly, sizeOnly):
@@ -277,15 +297,20 @@
         @param familyOnly flag indicating to set the font family only (boolean)
         @param sizeOnly flag indicating to set the font size only (boolean
         """
-        def setFont(font, style, familyOnly, sizeOnly):
+        def setFont(font, style, substyle, familyOnly, sizeOnly):
             """
             Local function to set the font.
             
-            @param font font to be set (QFont)
-            @param style style to set the font for (integer)
+            @param font font to be set
+            @type QFont
+            @param style style number
+            @type int
+            @param substyle sub-style number
+            @type int
             @param familyOnly flag indicating to set the font family only
-                (boolean)
-            @param sizeOnly flag indicating to set the font size only (boolean
+            @type bool
+            @param sizeOnly flag indicating to set the font size only
+            @type bool
             """
             if familyOnly or sizeOnly:
                 newFont = QFont(self.lexer.font(style))
@@ -293,9 +318,9 @@
                     newFont.setFamily(font.family())
                 if sizeOnly:
                     newFont.setPointSize(font.pointSize())
-                self.lexer.setFont(newFont, style)
+                self.lexer.setFont(newFont, style, substyle)
             else:
-                self.lexer.setFont(font, style)
+                self.lexer.setFont(font, style, substyle)
         
         def setSampleFont(font, familyOnly, sizeOnly):
             """
@@ -307,7 +332,8 @@
             @param sizeOnly flag indicating to set the font size only (boolean
             """
             if familyOnly or sizeOnly:
-                newFont = QFont(self.lexer.font(self.style))
+                style, substyle = self.__currentStyles()
+                newFont = QFont(self.lexer.font(style, substyle))
                 if familyOnly:
                     newFont.setFamily(font.family())
                 if sizeOnly:
@@ -316,30 +342,26 @@
             else:
                 self.sampleText.setFont(font)
         
+        style, substyle = self.__currentStyles()
         if self.monospacedButton.isChecked():
             options = MonospacedFontsOption
         else:
             options = NoFontsOption
-        font, ok = QFontDialog.getFont(self.lexer.font(self.style), self,
+        font, ok = QFontDialog.getFont(self.lexer.font(style, substyle), self,
                                        "", options)
         if ok:
             setSampleFont(font, familyOnly, sizeOnly)
             if doAll:
                 for row in range(self.styleElementList.count()):
-                    style = self.__styleForRow(row)
-                    setFont(font, style, familyOnly, sizeOnly)
+                    style, substyle = self.__stylesForRow(row)
+                    setFont(font, style, substyle, familyOnly, sizeOnly)
                 self.__styleAllItems()
-            elif len(self.styleElementList.selectedItems()) > 1:
+            else:
                 for selItem in self.styleElementList.selectedItems():
-                    style = self.__styleForRow(
-                        self.styleElementList.row(selItem))
-                    setFont(font, style, familyOnly, sizeOnly)
-                    itmFont = self.lexer.font(style)
+                    style, substyle = self.__stylesForItem(selItem)
+                    setFont(font, style, substyle, familyOnly, sizeOnly)
+                    itmFont = self.lexer.font(style, substyle)
                     selItem.setFont(itmFont)
-            else:
-                setFont(font, self.style, familyOnly, sizeOnly)
-                itmFont = self.lexer.font(self.style)
-                self.styleElementList.currentItem().setFont(itmFont)
         
     def __fontButtonMenuTriggered(self, act):
         """
@@ -374,16 +396,12 @@
         
         @param on flag indicating enabled or disabled state (boolean)
         """
+        style, substyle = self.__currentStyles()
         checkState = Qt.Checked if on else Qt.Unchecked
-        if len(self.styleElementList.selectedItems()) > 1:
-            for selItem in self.styleElementList.selectedItems():
-                style = self.__styleForRow(
-                    self.styleElementList.row(selItem))
-                self.lexer.setEolFill(on, style)
-                selItem.setCheckState(checkState)
-        else:
-            self.lexer.setEolFill(on, self.style)
-            self.styleElementList.currentItem().setCheckState(checkState)
+        for selItem in self.styleElementList.selectedItems():
+            style, substyle = self.__stylesForItem(selItem)
+            self.lexer.setEolFill(on, style, substyle)
+            selItem.setCheckState(checkState)
         
     @pyqtSlot()
     def on_allEolFillButton_clicked(self):
@@ -403,8 +421,8 @@
             enabled = selection == on
             self.eolfillCheckBox.setChecked(enabled)
             for row in range(self.styleElementList.count()):
-                style = self.__styleForRow(row)
-                self.lexer.setEolFill(enabled, style)
+                style, substyle = self.__stylesForRow(row)
+                self.lexer.setEolFill(enabled, style, substyle)
             self.__styleAllItems()
         
     @pyqtSlot()
@@ -412,15 +430,11 @@
         """
         Private method to set the current style to its default values.
         """
-        if len(self.styleElementList.selectedItems()) > 1:
-            for selItem in self.styleElementList.selectedItems():
-                style = self.__styleForRow(
-                    self.styleElementList.row(selItem))
-                self.__setToDefault(style)
-        else:
-            self.__setToDefault(self.style)
-        self.on_styleElementList_currentRowChanged(
-            self.styleElementList.currentRow())
+        for selItem in self.styleElementList.selectedItems():
+            style, substyle = self.__stylesForItem(selItem)
+            self.__setToDefault(style, substyle)
+        self.on_styleElementList_currentItemChanged(
+            self.styleElementList.currentItem(), None)
         self.__styleAllItems()
         
     @pyqtSlot()
@@ -429,22 +443,29 @@
         Private method to set all styles to their default values.
         """
         for row in range(self.styleElementList.count()):
-            style = self.__styleForRow(row)
-            self.__setToDefault(style)
-        self.on_styleElementList_currentRowChanged(
-            self.styleElementList.currentRow())
+            style, substyle = self.__stylesForRow(row)
+            self.__setToDefault(style, substyle)
+        self.on_styleElementList_currentItemChanged(
+            self.styleElementList.currentItem(), None)
         self.__styleAllItems()
         
-    def __setToDefault(self, style):
+    def __setToDefault(self, style, substyle):
         """
         Private method to set a specific style to its default values.
         
-        @param style style to be reset (integer)
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
-        self.lexer.setColor(self.lexer.defaultColor(style), style)
-        self.lexer.setPaper(self.lexer.defaultPaper(style), style)
-        self.lexer.setFont(self.lexer.defaultFont(style), style)
-        self.lexer.setEolFill(self.lexer.defaultEolFill(style), style)
+        self.lexer.setColor(self.lexer.defaultColor(style, substyle),
+                            style, substyle)
+        self.lexer.setPaper(self.lexer.defaultPaper(style, substyle),
+                            style, substyle)
+        self.lexer.setFont(self.lexer.defaultFont(style, substyle),
+                           style, substyle)
+        self.lexer.setEolFill(self.lexer.defaultEolFill(style, substyle),
+                              style, substyle)
         
     @pyqtSlot()
     def on_importCurrentButton_clicked(self):
@@ -500,6 +521,7 @@
         f = QFile(fn)
         if f.open(QIODevice.WriteOnly):
             from E5XML.HighlightingStylesWriter import HighlightingStylesWriter
+            # TODO: sub-styles
             HighlightingStylesWriter(f, lexers).writeXML()
             f.close()
         else:
@@ -534,6 +556,7 @@
         f = QFile(fn)
         if f.open(QIODevice.ReadOnly):
             from E5XML.HighlightingStylesReader import HighlightingStylesReader
+            # TODO: sub-styles
             reader = HighlightingStylesReader(f, lexers)
             reader.readXML()
             f.close()
@@ -549,10 +572,11 @@
             return
         
         if self.lexer:
-            colour = self.lexer.color(self.style)
-            paper = self.lexer.paper(self.style)
-            eolfill = self.lexer.eolFill(self.style)
-            font = self.lexer.font(self.style)
+            style, substyle = self.__currentStyles()
+            colour = self.lexer.color(style, substyle)
+            paper = self.lexer.paper(style, substyle)
+            eolfill = self.lexer.eolFill(style, substyle)
+            font = self.lexer.font(style, substyle)
             
             self.sampleText.setFont(font)
             pl = self.sampleText.palette()

eric ide

mercurial