QScintilla/Lexers/SubstyledLexer.py

branch
sub_styles
changeset 6855
4d80c8cc99a1
parent 6846
6ca9ef2c0907
child 6856
cdf13841603c
diff -r f4dd76230eea -r 4d80c8cc99a1 QScintilla/Lexers/SubstyledLexer.py
--- a/QScintilla/Lexers/SubstyledLexer.py	Mon Mar 11 19:50:50 2019 +0100
+++ b/QScintilla/Lexers/SubstyledLexer.py	Tue Mar 12 20:00:30 2019 +0100
@@ -28,25 +28,26 @@
         """
         super(SubstyledLexer, self).__init__()
         
-        self.baseStyles = []            # list of style numbers, that support
-                                        # sub-styling
+        self.baseStyles = []
+        # list of style numbers, that support sub-styling
         self.defaultSubStyles = {}
         # dictionary with sub-styling data
-        # main key: base style number, value : list of dict with
-        #       'Description': string containing a short description
-        #       'Words': string of whitespace separated words to be styled
-        #       'Style': dictionary with styling data (only difference to the
-        #                base style is required
-        #           'fore': foreground color (int containing RGB values)
-        #           'paper': background color (int containing RGB values)
-        #           'eolfill': fill to eol (bool)
-        #           'font_family': font family (str)
-        #           'font_size: point size (int)
-        #           'font_bold: bold font (bool)
-        #           'font_italic: italic font (bool)
-        #           'font_underline: underlined font (bool)
+        # main key: base style number, value : dict with
+        #       key: sub-style number, value: dict with
+        #           'Description': string containing a short description
+        #           'Words': string of whitespace separated words to be styled
+        #           'Style': dictionary with styling data (only difference to
+        #                    the base style is required
+        #               'fore': foreground color (int containing RGB values)
+        #               'paper': background color (int containing RGB values)
+        #               'eolfill': fill to eol (bool)
+        #               'font_family': font family (str)
+        #               'font_size: point size (int)
+        #               'font_bold: bold font (bool)
+        #               'font_italic: italic font (bool)
+        #               'font_underline: underlined font (bool)
         
-        self.subStyles = {}
+        self.__subStyles = {}
         self.__subStylesInitialized = False
     
     def loadSubstyles(self):
@@ -62,9 +63,9 @@
                 self.language(), baseStyle)
             if settings.contains(key):
                 subStyleLength = int(settings.value(key), 0)
-                self.subStyles[baseStyle] = {}
+                self.__subStyles[baseStyle] = {}
                 if subStyleLength:
-                    self.subStyles[baseStyle] = []
+                    self.__subStyles[baseStyle] = []
                     for subStyle in range(subStyleLength):
                         baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
                             self.language(), baseStyle, subStyle)
@@ -107,7 +108,8 @@
                             
                             subStyleData["Style"] = style
                             
-                            self.subStyles[baseStyle].append(subStyleData)
+                            self.__subStyles[baseStyle][subStyle] = \
+                                subStyleData
         
         self.__subStylesInitialized = True
     
@@ -115,7 +117,7 @@
         """
         Public method to load the default sub-style definitions.
         """
-        self.subStyles = copy.deepcopy(self.defaultSubStyles)
+        self.__subStyles = copy.deepcopy(self.defaultSubStyles)
     
     def readSubstyles(self, editor):
         """
@@ -144,8 +146,8 @@
             subStyleBases.extend(b + distanceToSecondary
                                  for b in subStyleBases[:])
         for baseStyleNo in subStyleBases:
-            if baseStyleNo in self.subStyles:
-                subStylesData = self.subStyles[baseStyleNo]
+            if baseStyleNo in self.__subStyles:
+                subStylesData = self.__subStyles[baseStyleNo]
                 subStyleLength = len(subStylesData)
                 subStyleStart = editor.SendScintilla(
                     editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength)
@@ -183,7 +185,7 @@
                     self.setPaper(color, styleNo)
                     
                     if "eolfill" in style:
-                        eolFill = style["eolFill"]
+                        eolFill = style["eolfill"]
                     else:
                         eolFill = self.eolFill(baseStyleNo)
                     self.setEolFill(eolFill, styleNo)
@@ -214,11 +216,11 @@
         for baseStyle in self.baseStyles:
             key = "Scintilla/{0}/style{1}/SubStyleLength".format(
                 self.language(), baseStyle)
-            settings.setValue(key, len(self.subStyles[baseStyle]))
-            for subStyle in range(len(self.subStyles[baseStyle])):
+            settings.setValue(key, len(self.__subStyles[baseStyle]))
+            for subStyle in self.__subStyles[baseStyle]:
                 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
                     self.language(), baseStyle, subStyle)
-                subStyleData = self.subStyles[baseStyle][subStyle]
+                subStyleData = self.__subStyles[baseStyle][subStyle]
                 
                 settings.setValue(baseKey + "Description",
                                   subStyleData["Description"])
@@ -279,77 +281,424 @@
         """
         return True
     
+    def getBaseStyles(self):
+        """
+        Public method to get the list of supported base styles.
+        
+        @return list of base styles
+        @rtype list of int
+        """
+        return self.baseStyles[:]
+    
+    def substylesCount(self, style):
+        """
+        Public method to get the number of defined sub-styles.
+        
+        @return number of defined sub-styles
+        @rtype int
+        """
+        if style in self.__subStyles:
+            count = len(self.__subStyles[style])
+        else:
+            count = 0
+        
+        return count
+    
     def setSubstyleDescription(self, description, style, substyle):
         """
+        Public method to set the description for a sub-style.
         
+        @param description description to be set
+        @type str
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Description"] = description
     
     def substyleDescription(self, style, substyle):
         """
+        Public method to get the description of a sub-style.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return sub-style description
+        @rtype str
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            desc = self.__subStyles[style][substyle]["Description"]
+        else:
+            desc = ""
+        
+        return desc
+    
+    def setSubstyleWords(self, words, style, substyle):
+        """
+        Public method to set the words for a sub-style.
+        
+        @param words words to be set separated by white-space
+        @type str
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Words"] = words
+    
+    def substyleWords(self, style, substyle):
+        """
+        Public method to get the words of a sub-style.
+        
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return white-space separated word list
+        @rtype str
+        """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            words = self.__subStyles[style][substyle]["Words"]
+        else:
+            words = ""
+        
+        return words
     
     def setSubstyleColor(self, color, style, substyle):
         """
+        Public method to set the foreground color of a sub-style.
         
+        @param color foreground color to be set
+        @type QColor
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Style"]["fore"] = \
+                color.red() << 16 | color.green() << 8 | color.blue()
     
     def substyleColor(self, style, substyle):
         """
+        Public method to get the sub-style foreground color.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return foreground color
+        @rtype QColor
         """
+        color = self.color(style)
+        
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            styleData = self.__subStyles[style][substyle]["Style"]
+            if "fore" in styleData:
+                color = QColor(
+                    styleData["fore"] >> 16 & 0xff,
+                    styleData["fore"] >> 8 & 0xff,
+                    styleData["fore"] & 0xff,
+                )
+        
+        return color
     
     def setSubstylePaper(self, color, style, substyle):
         """
+        Public method to set the background color of a sub-style.
         
+        @param color background color to be set
+        @type QColor
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Style"]["paper"] = \
+                color.red() << 16 | color.green() << 8 | color.blue()
     
     def substylePaper(self, style, substyle):
         """
+        Public method to get the sub-style background color.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return background color
+        @rtype QColor
         """
+        color = self.paper(style)
+        
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            styleData = self.__subStyles[style][substyle]["Style"]
+            if "paper" in styleData:
+                color = QColor(
+                    styleData["paper"] >> 16 & 0xff,
+                    styleData["paper"] >> 8 & 0xff,
+                    styleData["paper"] & 0xff,
+                )
+        
+        return color
     
     def setSubstyleEolFill(self, eolFill, style, substyle):
         """
+        Public method to set the eolfill flag of a sub-style.
         
+        @param eolFill eolfill flag to be set
+        @type bool
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Style"]["eolfill"] = \
+                eolFill
     
     def substyleEolFill(self, style, substyle):
         """
+        Public method to get the eolfill flag.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return eolfill flag
+        @rtype bool
         """
+        eolFill = self.eolFill(style)
+        
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            styleData = self.__subStyles[style][substyle]["Style"]
+            if "eolfill" in styleData:
+                eolFill = styleData["eolfill"]
+        
+        return eolFill
     
     def setSubstyleFont(self, font, style, substyle):
         """
+        Public method to set the font of a sub-style.
         
+        @param font font to be set
+        @type QFont
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
         """
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            self.__subStyles[style][substyle]["Style"]["font_family"] = \
+                font.family()
+            self.__subStyles[style][substyle]["Style"]["font_size"] = \
+                font.pointSize()
+            self.__subStyles[style][substyle]["Style"]["font_bold"] = \
+                font.bold()
+            self.__subStyles[style][substyle]["Style"]["font_italic"] = \
+                font.italic()
+            self.__subStyles[style][substyle]["Style"]["font_underline"] = \
+                font.underline()
     
     def substyleFont(self, style, substyle):
         """
+        Public method to get the sub-style font.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return font
+        @rtype QFont
         """
+        font = self.font(style)
+        
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            styleData = self.__subStyles[style][substyle]["Style"]
+            if "font_family" in styleData:
+                font.setFamily(styleData["font_family"])
+            if "font_size" in styleData:
+                font.setPointSize(styleData["font_size"])
+            if "font_bold" in styleData:
+                font.setBold(styleData["font_bold"])
+            if "font_italic" in styleData:
+                font.setItalic(styleData["font_italic"])
+            if "font_underline" in styleData:
+                font.setUnderline(styleData["font_underline"])
+        
+        return font
     
     def substyleDefaultDescription(self, style, substyle):
         """
+        Public method to get the default description of a sub-style.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return sub-style default description
+        @rtype str
         """
+        description = ""
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            description = styleData["Description"]
+        
+        return description
+    
+    def substyleDefaultWords(self, style, substyle):
+        """
+        Public method to get the default words of a sub-style.
+        
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return white-space separated default word list
+        @rtype str
+        """
+        words = ""
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            words = styleData["Words"]
+        
+        return words
     
     def substyleDefaultColor(self, style, substyle):
         """
+        Public method to get the sub-style default foreground color.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default foreground color
+        @rtype QColor
         """
+        color = self.defaultColor(style)
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            if "fore" in styleData:
+                color = QColor(
+                    styleData["fore"] >> 16 & 0xff,
+                    styleData["fore"] >> 8 & 0xff,
+                    styleData["fore"] & 0xff,
+                )
+        
+        return color
     
     def substyleDefaultPaper(self, style, substyle):
         """
+        Public method to get the sub-style default background color.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default background color
+        @rtype QColor
         """
+        color = self.defaultPaper(style)
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            if "paper" in styleData:
+                color = QColor(
+                    styleData["paper"] >> 16 & 0xff,
+                    styleData["paper"] >> 8 & 0xff,
+                    styleData["paper"] & 0xff,
+                )
+        
+        return color
     
     def substyleDefaultEolFill(self, style, substyle):
         """
+        Public method to get the default eolfill flag.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default eolfill flag
+        @rtype bool
         """
+        eolFill = self.defaultEolFill(style)
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            if "eolfill" in styleData:
+                eolFill = styleData["eolfill"]
+        
+        return eolFill
     
     def substyleDefaultFont(self, style, substyle):
         """
+        Public method to get the default sub-style font.
         
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default font
+        @rtype QFont
         """
+        font = self.defaultFont(style)
+        
+        if style in self.defaultSubStyles and \
+           substyle in self.defaultSubStyles[style]:
+            styleData = self.defaultSubStyles[style][substyle]["Style"]
+            if "font_family" in styleData:
+                font.setFamily(styleData["font_family"])
+            if "font_size" in styleData:
+                font.setPointSize(styleData["font_size"])
+            if "font_bold" in styleData:
+                font.setBold(styleData["font_bold"])
+            if "font_italic" in styleData:
+                font.setItalic(styleData["font_italic"])
+            if "font_underline" in styleData:
+                font.setUnderline(styleData["font_underline"])
+        
+        return font
+    
+    def addSubstyle(self, style):
+        """
+        Public method to add a sub-style to a given base style.
+        
+        @param style base style number
+        @type int
+        @return allocated sub-style number
+        @rtype int
+        """
+        # TODO: implement this
+        # add empty sub-style definition
+    
+    def delSubstyle(self, style, substyle):
+        """
+        Public method to delet a given sub-style definition.
+        
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return flag indicating successful deletion
+        @rtype bool
+        """
+        ok = False
+        
+        if style in self.__subStyles and substyle in self.__subStyles[style]:
+            del self.__subStyles[style][substyle]
+            ok = True
+        
+        return ok

eric ide

mercurial