Thu, 14 Mar 2019 19:43:40 +0100
EditorHighlightingStylesPage: added support for sub-styles and adjusted code to today's Qt.
Preferences/ConfigurationPages/EditorHighlightingStylesPage.py | file | annotate | diff | comparison | revisions |
--- a/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py Thu Mar 14 19:42:25 2019 +0100 +++ b/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py Thu Mar 14 19:43:40 2019 +0100 @@ -130,23 +130,9 @@ itm = QListWidgetItem(description, self.styleElementList) itm.setData(self.StyleRole, styleNo) itm.setData(self.SubstyleRole, subStyleNo) - # TODO: add substyle handling self.__styleAllItems() self.styleElementList.setCurrentRow(0) - # TODO: remove this once done - def __styleForRow(self, row): - """ - Private method to get the style number of the item of a given row. - - @param row row number - @type int - @return style number - @rtype int - """ - itm = self.styleElementList.item(row) - return itm.data(self.StyleRole) - def __stylesForRow(self, row): """ Private method to get the style and sub-style number of the item of @@ -155,13 +141,63 @@ @param row row number @type int @return tuple containing the style and sub-style numbers - @rtype tuple of (int,int) + @rtype tuple of (int, int) """ itm = self.styleElementList.item(row) + return self.__stylesForItem(itm) + + def __stylesForItem(self, itm): + """ + Private method to get the style and sub-style number of the given item. + + @param itm reference to the item to extract the styles from + @type QListWidgetItem + @return tuple containing the style and sub-style numbers + @rtype tuple of (int, int) + """ style = itm.data(self.StyleRole) substyle = itm.data(self.SubstyleRole) + + return (style, substyle) + + def __currentStyles(self): + """ + Private method to get the styles of the current item. - return (style, substyle) + @return tuple containing the style and sub-style numbers + @rtype tuple of (int, int) + """ + itm = self.styleElementList.currentItem() + if itm is None: + styles = (0, -1) # return default style + else: + styles = self.__stylesForItem(itm) + + return styles + + def __styleOneItem(self, item, style, substyle): + """ + Private method to style one item of the style element list. + + @param item reference to the item to be styled + @type QListWidgetItem + @param style base style number + @type int + @param substyle sub-style number + @type int + """ + colour = self.lexer.color(style, substyle) + paper = self.lexer.paper(style, substyle) + font = self.lexer.font(style, substyle) + eolfill = self.lexer.eolFill(style, substyle) + + item.setFont(font) + item.setBackground(paper) + item.setForeground(colour) + if eolfill: + item.setCheckState(Qt.Checked) + else: + item.setCheckState(Qt.Unchecked) def __styleAllItems(self): """ @@ -169,35 +205,26 @@ """ for row in range(self.styleElementList.count()): style, substyle = self.__stylesForRow(row) - colour = self.lexer.color(style, substyle) - paper = self.lexer.paper(style, substyle) - font = self.lexer.font(style, substyle) - eolfill = self.lexer.eolFill(style, substyle) - itm = self.styleElementList.item(row) - itm.setFont(font) - itm.setBackground(paper) - itm.setForeground(colour) - if eolfill: - itm.setCheckState(Qt.Checked) - else: - itm.setCheckState(Qt.Unchecked) - - def on_styleElementList_currentRowChanged(self, row): + self.__styleOneItem(itm, style, substyle) + + def on_styleElementList_currentItemChanged(self, current, previous): """ Private method to handle a change of the current row. - @param row current row number - @type int + @param current reference to the current item + @type QListWidgetItem + @param previous reference to the previous item + @type QListWidgetItem """ - if row < 0: + if current is None: return - self.style = self.__styleForRow(row) # TODO: get rid of self.style - colour = self.lexer.color(self.style) - paper = self.lexer.paper(self.style) - eolfill = self.lexer.eolFill(self.style) - font = self.lexer.font(self.style) + style, substyle = self.__stylesForItem(current) + colour = self.lexer.color(style, substyle) + paper = self.lexer.paper(style, substyle) + eolfill = self.lexer.eolFill(style, substyle) + font = self.lexer.font(style, substyle) self.sampleText.setFont(font) pl = self.sampleText.palette() @@ -213,21 +240,17 @@ Private method used to select the foreground colour of the selected style and lexer. """ - colour = QColorDialog.getColor(self.lexer.color(self.style)) + style, substyle = self.__currentStyles() + colour = QColorDialog.getColor(self.lexer.color(style, substyle)) if colour.isValid(): pl = self.sampleText.palette() pl.setColor(QPalette.Text, colour) self.sampleText.setPalette(pl) self.sampleText.repaint() - if len(self.styleElementList.selectedItems()) > 1: - for selItem in self.styleElementList.selectedItems(): - style = self.__styleForRow( - self.styleElementList.row(selItem)) - self.lexer.setColor(colour, style) - selItem.setForeground(colour) - else: - self.lexer.setColor(colour, self.style) - self.styleElementList.currentItem().setForeground(colour) + for selItem in self.styleElementList.selectedItems(): + style, substyle = self.__stylesForItem(selItem) + self.lexer.setColor(colour, style, substyle) + selItem.setForeground(colour) @pyqtSlot() def on_backgroundButton_clicked(self): @@ -235,21 +258,17 @@ Private method used to select the background colour of the selected style and lexer. """ - colour = QColorDialog.getColor(self.lexer.paper(self.style)) + style, substyle = self.__currentStyles() + colour = QColorDialog.getColor(self.lexer.paper(style, substyle)) if colour.isValid(): pl = self.sampleText.palette() pl.setColor(QPalette.Base, colour) self.sampleText.setPalette(pl) self.sampleText.repaint() - if len(self.styleElementList.selectedItems()) > 1: - for selItem in self.styleElementList.selectedItems(): - style = self.__styleForRow( - self.styleElementList.row(selItem)) - self.lexer.setPaper(colour, style) - selItem.setBackground(colour) - else: - self.lexer.setPaper(colour, self.style) - self.styleElementList.currentItem().setBackground(colour) + for selItem in self.styleElementList.selectedItems(): + style, substyle = self.__stylesForItem(selItem) + self.lexer.setPaper(colour, style, substyle) + selItem.setBackground(colour) @pyqtSlot() def on_allBackgroundColoursButton_clicked(self): @@ -257,15 +276,16 @@ Private method used to select the background colour of all styles of a selected lexer. """ - colour = QColorDialog.getColor(self.lexer.paper(self.style)) + style, substyle = self.__currentStyles() + colour = QColorDialog.getColor(self.lexer.paper(style, substyle)) if colour.isValid(): pl = self.sampleText.palette() pl.setColor(QPalette.Base, colour) self.sampleText.setPalette(pl) self.sampleText.repaint() for row in range(self.styleElementList.count()): - style = self.__styleForRow(row) - self.lexer.setPaper(colour, style) + style, substyle = self.__stylesForRow(row) + self.lexer.setPaper(colour, style, substyle) self.__styleAllItems() def __changeFont(self, doAll, familyOnly, sizeOnly): @@ -277,15 +297,20 @@ @param familyOnly flag indicating to set the font family only (boolean) @param sizeOnly flag indicating to set the font size only (boolean """ - def setFont(font, style, familyOnly, sizeOnly): + def setFont(font, style, substyle, familyOnly, sizeOnly): """ Local function to set the font. - @param font font to be set (QFont) - @param style style to set the font for (integer) + @param font font to be set + @type QFont + @param style style number + @type int + @param substyle sub-style number + @type int @param familyOnly flag indicating to set the font family only - (boolean) - @param sizeOnly flag indicating to set the font size only (boolean + @type bool + @param sizeOnly flag indicating to set the font size only + @type bool """ if familyOnly or sizeOnly: newFont = QFont(self.lexer.font(style)) @@ -293,9 +318,9 @@ newFont.setFamily(font.family()) if sizeOnly: newFont.setPointSize(font.pointSize()) - self.lexer.setFont(newFont, style) + self.lexer.setFont(newFont, style, substyle) else: - self.lexer.setFont(font, style) + self.lexer.setFont(font, style, substyle) def setSampleFont(font, familyOnly, sizeOnly): """ @@ -307,7 +332,8 @@ @param sizeOnly flag indicating to set the font size only (boolean """ if familyOnly or sizeOnly: - newFont = QFont(self.lexer.font(self.style)) + style, substyle = self.__currentStyles() + newFont = QFont(self.lexer.font(style, substyle)) if familyOnly: newFont.setFamily(font.family()) if sizeOnly: @@ -316,30 +342,26 @@ else: self.sampleText.setFont(font) + style, substyle = self.__currentStyles() if self.monospacedButton.isChecked(): options = MonospacedFontsOption else: options = NoFontsOption - font, ok = QFontDialog.getFont(self.lexer.font(self.style), self, + font, ok = QFontDialog.getFont(self.lexer.font(style, substyle), self, "", options) if ok: setSampleFont(font, familyOnly, sizeOnly) if doAll: for row in range(self.styleElementList.count()): - style = self.__styleForRow(row) - setFont(font, style, familyOnly, sizeOnly) + style, substyle = self.__stylesForRow(row) + setFont(font, style, substyle, familyOnly, sizeOnly) self.__styleAllItems() - elif len(self.styleElementList.selectedItems()) > 1: + else: for selItem in self.styleElementList.selectedItems(): - style = self.__styleForRow( - self.styleElementList.row(selItem)) - setFont(font, style, familyOnly, sizeOnly) - itmFont = self.lexer.font(style) + style, substyle = self.__stylesForItem(selItem) + setFont(font, style, substyle, familyOnly, sizeOnly) + itmFont = self.lexer.font(style, substyle) selItem.setFont(itmFont) - else: - setFont(font, self.style, familyOnly, sizeOnly) - itmFont = self.lexer.font(self.style) - self.styleElementList.currentItem().setFont(itmFont) def __fontButtonMenuTriggered(self, act): """ @@ -374,16 +396,12 @@ @param on flag indicating enabled or disabled state (boolean) """ + style, substyle = self.__currentStyles() checkState = Qt.Checked if on else Qt.Unchecked - if len(self.styleElementList.selectedItems()) > 1: - for selItem in self.styleElementList.selectedItems(): - style = self.__styleForRow( - self.styleElementList.row(selItem)) - self.lexer.setEolFill(on, style) - selItem.setCheckState(checkState) - else: - self.lexer.setEolFill(on, self.style) - self.styleElementList.currentItem().setCheckState(checkState) + for selItem in self.styleElementList.selectedItems(): + style, substyle = self.__stylesForItem(selItem) + self.lexer.setEolFill(on, style, substyle) + selItem.setCheckState(checkState) @pyqtSlot() def on_allEolFillButton_clicked(self): @@ -403,8 +421,8 @@ enabled = selection == on self.eolfillCheckBox.setChecked(enabled) for row in range(self.styleElementList.count()): - style = self.__styleForRow(row) - self.lexer.setEolFill(enabled, style) + style, substyle = self.__stylesForRow(row) + self.lexer.setEolFill(enabled, style, substyle) self.__styleAllItems() @pyqtSlot() @@ -412,15 +430,11 @@ """ Private method to set the current style to its default values. """ - if len(self.styleElementList.selectedItems()) > 1: - for selItem in self.styleElementList.selectedItems(): - style = self.__styleForRow( - self.styleElementList.row(selItem)) - self.__setToDefault(style) - else: - self.__setToDefault(self.style) - self.on_styleElementList_currentRowChanged( - self.styleElementList.currentRow()) + for selItem in self.styleElementList.selectedItems(): + style, substyle = self.__stylesForItem(selItem) + self.__setToDefault(style, substyle) + self.on_styleElementList_currentItemChanged( + self.styleElementList.currentItem(), None) self.__styleAllItems() @pyqtSlot() @@ -429,22 +443,29 @@ Private method to set all styles to their default values. """ for row in range(self.styleElementList.count()): - style = self.__styleForRow(row) - self.__setToDefault(style) - self.on_styleElementList_currentRowChanged( - self.styleElementList.currentRow()) + style, substyle = self.__stylesForRow(row) + self.__setToDefault(style, substyle) + self.on_styleElementList_currentItemChanged( + self.styleElementList.currentItem(), None) self.__styleAllItems() - def __setToDefault(self, style): + def __setToDefault(self, style, substyle): """ Private method to set a specific style to its default values. - @param style style to be reset (integer) + @param style style number + @type int + @param substyle sub-style number + @type int """ - self.lexer.setColor(self.lexer.defaultColor(style), style) - self.lexer.setPaper(self.lexer.defaultPaper(style), style) - self.lexer.setFont(self.lexer.defaultFont(style), style) - self.lexer.setEolFill(self.lexer.defaultEolFill(style), style) + self.lexer.setColor(self.lexer.defaultColor(style, substyle), + style, substyle) + self.lexer.setPaper(self.lexer.defaultPaper(style, substyle), + style, substyle) + self.lexer.setFont(self.lexer.defaultFont(style, substyle), + style, substyle) + self.lexer.setEolFill(self.lexer.defaultEolFill(style, substyle), + style, substyle) @pyqtSlot() def on_importCurrentButton_clicked(self): @@ -500,6 +521,7 @@ f = QFile(fn) if f.open(QIODevice.WriteOnly): from E5XML.HighlightingStylesWriter import HighlightingStylesWriter + # TODO: sub-styles HighlightingStylesWriter(f, lexers).writeXML() f.close() else: @@ -534,6 +556,7 @@ f = QFile(fn) if f.open(QIODevice.ReadOnly): from E5XML.HighlightingStylesReader import HighlightingStylesReader + # TODO: sub-styles reader = HighlightingStylesReader(f, lexers) reader.readXML() f.close() @@ -549,10 +572,11 @@ return if self.lexer: - colour = self.lexer.color(self.style) - paper = self.lexer.paper(self.style) - eolfill = self.lexer.eolFill(self.style) - font = self.lexer.font(self.style) + style, substyle = self.__currentStyles() + colour = self.lexer.color(style, substyle) + paper = self.lexer.paper(style, substyle) + eolfill = self.lexer.eolFill(style, substyle) + font = self.lexer.font(style, substyle) self.sampleText.setFont(font) pl = self.sampleText.palette()