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