QScintilla/Lexers/SubstyledLexer.py

branch
sub_styles
changeset 6846
6ca9ef2c0907
parent 6845
4680adb641e0
child 6855
4d80c8cc99a1
--- a/QScintilla/Lexers/SubstyledLexer.py	Sat Mar 09 17:36:44 2019 +0100
+++ b/QScintilla/Lexers/SubstyledLexer.py	Sat Mar 09 18:44:13 2019 +0100
@@ -32,9 +32,7 @@
                                         # sub-styling
         self.defaultSubStyles = {}
         # dictionary with sub-styling data
-        # main key: base style number, value : dictionary with
-        #   'SubStyleLength': int
-        #   'SubStyles': list of dict with
+        # 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
@@ -65,49 +63,53 @@
             if settings.contains(key):
                 subStyleLength = int(settings.value(key), 0)
                 self.subStyles[baseStyle] = {}
-                self.subStyles[baseStyle]["SubStyleLength"] = subStyleLength
                 if subStyleLength:
-                    self.subStyles[baseStyle]["SubStyles"] = []
+                    self.subStyles[baseStyle] = []
                     for subStyle in range(subStyleLength):
                         baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
                             self.language(), baseStyle, subStyle)
-                        subStyleData = {}
-                        subStyleData["Description"] = settings.value(
-                            baseKey + "Description", "")
-                        subStyleData["Words"] = settings.value(
-                            baseKey + "Words", "")
-                        style = {}
-                        
-                        key = baseKey + "fore"
-                        if settings.contains(key):
-                            style["fore"] = int(settings.value(key))
-                        key = baseKey + "paper"
-                        if settings.contains(key):
-                            style["paper"] = int(settings.value(key))
-                        key = baseKey + "eolfill"
-                        if settings.contains(key):
-                            style["eolfill"] = Preferences.toBool(
-                                settings.value(key))
-                        key = baseKey + "font_family"
-                        if settings.contains(key):
-                            style["font_family"] = settings.value(key)
-                        key = baseKey + "font_size"
-                        if settings.contains(key):
-                            style["font_size"] = int(settings.value(key))
-                        key = baseKey + "font_bold"
-                        if settings.contains(key):
-                            style["font_bold"] = Preferences.toBool(
-                                settings.value(key))
-                        key = baseKey + "font_italic"
-                        if settings.contains(key):
-                            style["font_italic"] = Preferences.toBool(
-                                settings.value(key))
-                        key = baseKey + "font_underline"
-                        if settings.contains(key):
-                            style["font_underline"] = Preferences.toBool(
-                                settings.value(key))
-                        
-                        subStyleData["Style"] = style
+                        if settings.contains(baseKey):
+                            subStyleData = {}
+                            subStyleData["Description"] = settings.value(
+                                baseKey + "Description", "")
+                            subStyleData["Words"] = settings.value(
+                                baseKey + "Words", "")
+                            style = {}
+                            
+                            key = baseKey + "fore"
+                            if settings.contains(key):
+                                style["fore"] = int(settings.value(key))
+                            key = baseKey + "paper"
+                            if settings.contains(key):
+                                style["paper"] = int(settings.value(key))
+                            key = baseKey + "eolfill"
+                            if settings.contains(key):
+                                style["eolfill"] = Preferences.toBool(
+                                    settings.value(key))
+                            key = baseKey + "font_family"
+                            if settings.contains(key):
+                                style["font_family"] = settings.value(key)
+                            key = baseKey + "font_size"
+                            if settings.contains(key):
+                                style["font_size"] = int(settings.value(key))
+                            key = baseKey + "font_bold"
+                            if settings.contains(key):
+                                style["font_bold"] = Preferences.toBool(
+                                    settings.value(key))
+                            key = baseKey + "font_italic"
+                            if settings.contains(key):
+                                style["font_italic"] = Preferences.toBool(
+                                    settings.value(key))
+                            key = baseKey + "font_underline"
+                            if settings.contains(key):
+                                style["font_underline"] = Preferences.toBool(
+                                    settings.value(key))
+                            
+                            subStyleData["Style"] = style
+                            
+                            self.subStyles[baseStyle].append(subStyleData)
+        
+        self.__subStylesInitialized = True
     
     def loadDefaultSubStyles(self):
         """
@@ -139,25 +141,26 @@
         
         subStyleBases = [b for b in bytearray(subStyleBases[:-1])]
         if distanceToSecondary:
-            subStyleBases.extend(b + distanceToSecondary for b in subStyleBases[:])
+            subStyleBases.extend(b + distanceToSecondary
+                                 for b in subStyleBases[:])
         for baseStyleNo in subStyleBases:
             if baseStyleNo in self.subStyles:
                 subStylesData = self.subStyles[baseStyleNo]
-                subStyleLength = subStylesData["SubStyleLength"]
+                subStyleLength = len(subStylesData)
                 subStyleStart = editor.SendScintilla(
                     editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength)
                 if subStyleStart < 0:
                     subStyleLength = 0
                 for subStyleIndex in range(subStyleLength):
-                    subStyle = subStylesData["SubStyles"][subStyleIndex]
+                    styleNo = subStyleStart + subStyleIndex
+                    subStyle = subStylesData[subStyleIndex]
                     # set the words
                     editor.SendScintilla(
                         editor.SCI_SETIDENTIFIERS,
-                        subStyleStart + subStyleIndex,
+                        styleNo,
                         subStyle["Words"].encode())
                     
                     # set the style
-                    styleNo = subStyleStart + subStyleIndex
                     style = subStyle["Style"]
                     if "fore" in style:
                         color = QColor(
@@ -168,6 +171,7 @@
                     else:
                         color = self.color(baseStyleNo)
                     self.setColor(color, styleNo)
+                    
                     if "paper" in style:
                         color = QColor(
                             style["paper"] >> 16 & 0xff,
@@ -177,11 +181,13 @@
                     else:
                         color = self.paper(baseStyleNo)
                     self.setPaper(color, styleNo)
+                    
                     if "eolfill" in style:
                         eolFill = style["eolFill"]
                     else:
                         eolFill = self.eolFill(baseStyleNo)
                     self.setEolFill(eolFill, styleNo)
+                    
                     font = self.font(baseStyleNo)
                     if "font_family" in style:
                         font.setFamily(style["font_family"])
@@ -199,6 +205,70 @@
         """
         Public method to save the sub-styles.
         """
+        if not self.__subStylesInitialized:
+            # make sure, the sub-styles have been initialized
+            self.loadSubstyles()
+        
+        settings = Preferences.Prefs.settings
+        
+        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])):
+                baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
+                    self.language(), baseStyle, subStyle)
+                subStyleData = self.subStyles[baseStyle][subStyle]
+                
+                settings.setValue(baseKey + "Description",
+                                  subStyleData["Description"])
+                settings.setValue(baseKey + "Words",
+                                  subStyleData["Words"])
+                
+                style = subStyleData["Style"]
+                if "fore" in style:
+                    color = style["fore"]
+                else:
+                    col = self.color(baseStyle)
+                    color = col.red() << 16 | col.green() << 8 | col.blue()
+                settings.setValue(baseKey + "fore", color)
+                if "paper" in style:
+                    color = style["paper"]
+                else:
+                    col = self.paper(baseStyle)
+                    color = col.red() << 16 | col.green() << 8 | col.blue()
+                settings.setValue(baseKey + "paper", color)
+                if "eolfill" in style:
+                    eolfill = style["eolfill"]
+                else:
+                    eolfill = self.eolFill(baseStyle)
+                settings.setValue(baseKey + "eolfill", eolfill)
+                font = self.font(baseStyle)
+                if "font_family" in style:
+                    family = style["font_family"]
+                else:
+                    family = font.family()
+                settings.setValue(baseKey + "font_family", family)
+                if "font_size" in style:
+                    size = style["font_size"]
+                else:
+                    size = font.pointSize()
+                settings.setValue(baseKey + "font_size", size)
+                if "font_bold" in style:
+                    bold = style["font_bold"]
+                else:
+                    bold = font.bold()
+                settings.setValue(baseKey + "font_bold", bold)
+                if "font_italic" in style:
+                    italic = style["font_italic"]
+                else:
+                    italic = font.italic()
+                settings.setValue(baseKey + "font_italic", italic)
+                if "font_underline" in style:
+                    underline = style["font_underline"]
+                else:
+                    underline = font.underline()
+                settings.setValue(baseKey + "font_underline", underline)
     
     def hasSubStyles(self):
         """

eric ide

mercurial