QScintilla/Lexers/SubstyledLexer.py

branch
sub_styles
changeset 6856
cdf13841603c
parent 6855
4d80c8cc99a1
child 6859
951aa89d367d
--- a/QScintilla/Lexers/SubstyledLexer.py	Tue Mar 12 20:00:30 2019 +0100
+++ b/QScintilla/Lexers/SubstyledLexer.py	Wed Mar 13 19:40:59 2019 +0100
@@ -52,64 +52,76 @@
     
     def loadSubstyles(self):
         """
-        Public method to load the sub-styles from the settings file
+        Public method to load the sub-styles from the settings file.
         """
         settings = Preferences.Prefs.settings
         
-        self.loadDefaultSubStyles()
-        
+        # Step 1: check if sub-styles were defined and saved
+        subStylesDefined = False
         for baseStyle in self.baseStyles:
             key = "Scintilla/{0}/style{1}/SubStyleLength".format(
                 self.language(), baseStyle)
-            if settings.contains(key):
-                subStyleLength = int(settings.value(key), 0)
-                self.__subStyles[baseStyle] = {}
-                if subStyleLength:
-                    self.__subStyles[baseStyle] = []
-                    for subStyle in range(subStyleLength):
-                        baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
-                            self.language(), baseStyle, subStyle)
-                        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][subStyle] = \
-                                subStyleData
+            subStylesDefined |= settings.contains(key)
+        # Step 2.1: load default sub-styles, if none were defined
+        if not subStylesDefined:
+            self.loadDefaultSubStyles()
+        
+        # Step 2.2: load from settings file
+        else:
+            self.__subStyles = {}
+            for baseStyle in self.baseStyles:
+                key = "Scintilla/{0}/style{1}/SubStyleLength".format(
+                    self.language(), baseStyle)
+                if settings.contains(key):
+                    subStyleLength = int(settings.value(key), 0)
+                    if subStyleLength:
+                        self.__subStyles[baseStyle] = {}
+                        for subStyle in range(subStyleLength):
+                            substyleKey = \
+                                "Scintilla/{0}/style{1}/substyle{2}/"\
+                                .format(self.language(), baseStyle, subStyle)
+                            if settings.contains(substyleKey):
+                                subStyleData = {}
+                                subStyleData["Description"] = settings.value(
+                                    substyleKey + "Description", "")
+                                subStyleData["Words"] = settings.value(
+                                    substyleKey + "Words", "")
+                                style = {}
+                                
+                                key = substyleKey + "fore"
+                                if settings.contains(key):
+                                    style["fore"] = int(settings.value(key))
+                                key = substyleKey + "paper"
+                                if settings.contains(key):
+                                    style["paper"] = int(settings.value(key))
+                                key = substyleKey + "eolfill"
+                                if settings.contains(key):
+                                    style["eolfill"] = Preferences.toBool(
+                                        settings.value(key))
+                                key = substyleKey + "font_family"
+                                if settings.contains(key):
+                                    style["font_family"] = settings.value(key)
+                                key = substyleKey + "font_size"
+                                if settings.contains(key):
+                                    style["font_size"] = \
+                                        int(settings.value(key))
+                                key = substyleKey + "font_bold"
+                                if settings.contains(key):
+                                    style["font_bold"] = Preferences.toBool(
+                                        settings.value(key))
+                                key = substyleKey + "font_italic"
+                                if settings.contains(key):
+                                    style["font_italic"] = Preferences.toBool(
+                                        settings.value(key))
+                                key = substyleKey + "font_underline"
+                                if settings.contains(key):
+                                    style["font_underline"] = \
+                                        Preferences.toBool(settings.value(key))
+                                
+                                subStyleData["Style"] = style
+                                
+                                self.__subStyles[baseStyle][subStyle] = \
+                                    subStyleData
         
         self.__subStylesInitialized = True
     
@@ -153,9 +165,11 @@
                     editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength)
                 if subStyleStart < 0:
                     subStyleLength = 0
-                for subStyleIndex in range(subStyleLength):
+                subStyleIndex = -1
+                for subStyleKey in sorted(subStylesData.keys()):
+                    subStyleIndex += 1
                     styleNo = subStyleStart + subStyleIndex
-                    subStyle = subStylesData[subStyleIndex]
+                    subStyle = subStylesData[subStyleKey]
                     # set the words
                     editor.SendScintilla(
                         editor.SCI_SETIDENTIFIERS,
@@ -208,23 +222,41 @@
         Public method to save the sub-styles.
         """
         if not self.__subStylesInitialized:
-            # make sure, the sub-styles have been initialized
-            self.loadSubstyles()
+            return
         
         settings = Preferences.Prefs.settings
         
+        # Step 1: remove all sub-style definitions first
+        for baseStyle in self.baseStyles:
+            key = "Scintilla/{0}/style{1}/SubStyleLength".format(
+                self.language(), baseStyle)
+            if settings.contains(key):
+                subStyleLength = int(settings.value(key), 0)
+                if subStyleLength:
+                    self.__subStyles[baseStyle] = {}
+                    for subStyle in range(subStyleLength):
+                        substyleKey = "Scintilla/{0}/style{1}/substyle{2}/"\
+                            .format(self.language(), baseStyle, subStyle)
+                        settings.remove(substyleKey)
+        
+        # Step 2: save the defined sub-styles
         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 self.__subStyles[baseStyle]:
-                baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
+                substyleKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
                     self.language(), baseStyle, subStyle)
                 subStyleData = self.__subStyles[baseStyle][subStyle]
                 
-                settings.setValue(baseKey + "Description",
+                if not subStyleData["Description"] and \
+                   not subStyleData["Words"]:
+                    # invalid or incomplete sub-style definition
+                    continue
+                
+                settings.setValue(substyleKey + "Description",
                                   subStyleData["Description"])
-                settings.setValue(baseKey + "Words",
+                settings.setValue(substyleKey + "Words",
                                   subStyleData["Words"])
                 
                 style = subStyleData["Style"]
@@ -233,44 +265,44 @@
                 else:
                     col = self.color(baseStyle)
                     color = col.red() << 16 | col.green() << 8 | col.blue()
-                settings.setValue(baseKey + "fore", color)
+                settings.setValue(substyleKey + "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)
+                settings.setValue(substyleKey + "paper", color)
                 if "eolfill" in style:
                     eolfill = style["eolfill"]
                 else:
                     eolfill = self.eolFill(baseStyle)
-                settings.setValue(baseKey + "eolfill", eolfill)
+                settings.setValue(substyleKey + "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)
+                settings.setValue(substyleKey + "font_family", family)
                 if "font_size" in style:
                     size = style["font_size"]
                 else:
                     size = font.pointSize()
-                settings.setValue(baseKey + "font_size", size)
+                settings.setValue(substyleKey + "font_size", size)
                 if "font_bold" in style:
                     bold = style["font_bold"]
                 else:
                     bold = font.bold()
-                settings.setValue(baseKey + "font_bold", bold)
+                settings.setValue(substyleKey + "font_bold", bold)
                 if "font_italic" in style:
                     italic = style["font_italic"]
                 else:
                     italic = font.italic()
-                settings.setValue(baseKey + "font_italic", italic)
+                settings.setValue(substyleKey + "font_italic", italic)
                 if "font_underline" in style:
                     underline = style["font_underline"]
                 else:
                     underline = font.underline()
-                settings.setValue(baseKey + "font_underline", underline)
+                settings.setValue(substyleKey + "font_underline", underline)
     
     def hasSubStyles(self):
         """
@@ -294,6 +326,8 @@
         """
         Public method to get the number of defined sub-styles.
         
+        @param style base style number
+        @type int
         @return number of defined sub-styles
         @rtype int
         """
@@ -674,15 +708,25 @@
     
     def addSubstyle(self, style):
         """
-        Public method to add a sub-style to a given base style.
+        Public method to add an empty sub-style to a given base style.
         
         @param style base style number
         @type int
-        @return allocated sub-style number
+        @return allocated sub-style number or -1 to indicate an error
         @rtype int
         """
-        # TODO: implement this
-        # add empty sub-style definition
+        if style in self.__subStyles:
+            lastSubStyle = sorted(self.__subStyles[style].keys())[-1]
+            subStyle = lastSubStyle + 1
+            self.__subStyles[style][subStyle] = {
+                "Description": "",
+                "Words": "",
+                "Style": {},
+            }
+        else:
+            subStyle = -1
+        
+        return subStyle
     
     def delSubstyle(self, style, substyle):
         """

eric ide

mercurial