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