--- 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): """