diff --git a/CHANGELOG.md b/CHANGELOG.md index cfdf9d6e..1f44a0c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ CHANGELOG for FlatCAM Evo beta ================================================= +12.05.2022 + +- changed the syntax highlighting for the AppTextEditor such that the strings are not color marked +- changed the syntax highlighting such that for a dark theme the colors are inverted +- made sure that in the AppTextEditor, when a line is highlighted then the text foreground color is black such that the writing can be read over the line highlight + 11.05.2022 - fixed a crash when creating a Document object due of changes in Qt6 (missing QtGui.Qt) diff --git a/appEditors/AppTextEditor.py b/appEditors/AppTextEditor.py index fc5df41d..eb1e5d6a 100644 --- a/appEditors/AppTextEditor.py +++ b/appEditors/AppTextEditor.py @@ -54,7 +54,7 @@ class AppTextEditor(QtWidgets.QWidget): # CODE Editor if self.plain_text: - self.editor_class = FCTextAreaLineNumber(color_dict=color_dict) + self.editor_class = FCTextAreaLineNumber(color_dict=color_dict, theme=self.app.options['global_theme']) self.code_editor = self.editor_class.edit sel_color = 'black' diff --git a/appGUI/GUIElements.py b/appGUI/GUIElements.py index a6528d41..1df1869a 100644 --- a/appGUI/GUIElements.py +++ b/appGUI/GUIElements.py @@ -4922,10 +4922,12 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): and from here: https://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html """ - def __init__(self, *args, color_dict=None): + def __init__(self, *args, color_dict=None, theme='default'): FCPlainTextAreaExtended.__init__(self, *args) self.color_storage = color_dict if color_dict else {} + self.theme = theme + # self.setFrameStyle(QFrame.NoFrame) self.setFrameStyle(QtWidgets.QFrame.Shape.NoFrame) @@ -4933,13 +4935,14 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # self.setLineWrapMode(QPlainTextEdit.NoWrap) self.cursorPositionChanged.connect(self.highlight) - self.highlighter = self.MyHighlighter(self.document()) + self.highlighter = self.MyHighlighter(parent=self.document(), theme=self.theme) class MyHighlighter(QtGui.QSyntaxHighlighter): - def __init__(self, parent, highlight_rules=None): + def __init__(self, parent, theme, highlight_rules=None): QtGui.QSyntaxHighlighter.__init__(self, parent) self.parent = parent + self.theme = theme self.highlightingRules = [] if highlight_rules is None: @@ -4953,32 +4956,55 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): singleQuotedString = QtGui.QTextCharFormat() x_chars = QtGui.QTextCharFormat() y_chars = QtGui.QTextCharFormat() - comment = QtGui.QTextCharFormat() + # comment - brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray)) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("\(.*\)") comment.setForeground(brush) rule = (pattern, comment) self.highlightingRules.append(rule) # Marlin comment - brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray)) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("^;\s*.*$") comment.setForeground(brush) rule = (pattern, comment) self.highlightingRules.append(rule) # Python comment - brush = QtGui.QBrush(Qt.GlobalColor.gray, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.gray)) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("^\#\s*.*$") comment.setForeground(brush) rule = (pattern, comment) self.highlightingRules.append(rule) + # string + color = self.get_custom_color(QtGui.QColor("tomato")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) + pattern = QtCore.QRegularExpression("\".*\"") + # pattern.setMinimal + pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) + string.setForeground(brush) + rule = (pattern, string) + self.highlightingRules.append(rule) + + # singleQuotedString + pattern = QtCore.QRegularExpression("\'.*\'") + # pattern.setMinimal(True) + pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) + + singleQuotedString.setForeground(brush) + rule = (pattern, singleQuotedString) + self.highlightingRules.append(rule) + keyword = QtGui.QTextCharFormat() # keyword - brush = QtGui.QBrush(Qt.GlobalColor.blue, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.blue)) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword.setForeground(brush) keyword.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["G", "T"] @@ -4990,7 +5016,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): keyword1 = QtGui.QTextCharFormat() # keyword 1 - brush = QtGui.QBrush(QtGui.QColor("teal"), Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("teal")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword1.setForeground(brush) keyword1.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["F"] @@ -5003,7 +5030,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # keyword 2 keyword2 = QtGui.QTextCharFormat() # SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference - brush = QtGui.QBrush(QtGui.QColor("coral"), Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("coral")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword2.setForeground(brush) keyword2.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["M"] @@ -5016,7 +5044,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # keyword 3 keyword3 = QtGui.QTextCharFormat() # SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference - brush = QtGui.QBrush(QtGui.QColor("purple"), Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("purple")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword3.setForeground(brush) keyword3.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["Z"] @@ -5028,7 +5057,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): keyword4 = QtGui.QTextCharFormat() # keyword 4 - brush = QtGui.QBrush(QtGui.QColor("green"), Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("green")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword4.setForeground(brush) keyword4.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["LPC", "LPD"] @@ -5041,7 +5071,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # keyword 5 keyword5 = QtGui.QTextCharFormat() # SVG colors: https://doc.qt.io/qt-5/qml-color.html#svg-color-reference - brush = QtGui.QBrush(QtGui.QColor("red"), Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("red")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) keyword5.setForeground(brush) keyword5.setFontWeight(QtGui.QFont.Weight.Bold) keywords = ["D"] @@ -5054,15 +5085,19 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # reservedClasses reservedClasses.setForeground(brush) reservedClasses.setFontWeight(QtGui.QFont.Weight.Bold) - keywords = ["array", "character", "complex", "data.frame", "double", "factor", - "function", "integer", "list", "logical", "matrix", "numeric", "vector"] + keywords = [ + "array", "character", "complex", "data.frame", "double", "factor", + "function", "integer", "list", "logical", "matrix", "numeric", "vector", "for", "if", "then", + "elif", "else", "in", "while", "do" + ] for word in keywords: pattern = QtCore.QRegularExpression("\\b" + word + "\\b") rule = (pattern, reservedClasses) self.highlightingRules.append(rule) # parameter - brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor(Qt.GlobalColor.darkBlue)) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("\-[0-9a-zA-Z_]*\s") parameterOperator.setForeground(brush) parameterOperator.setFontWeight(QtGui.QFont.Weight.Bold) @@ -5077,7 +5112,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): self.highlightingRules.append(rule) # specialConstant - brush = QtGui.QBrush(Qt.GlobalColor.green, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("green")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) specialConstant.setForeground(brush) keywords = ["Inf", "NA", "NaN", "NULL"] for word in keywords: @@ -5100,26 +5136,9 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): # rule = (pattern, number) # self.highlightingRules.append(rule) - # string - brush = QtGui.QBrush(Qt.GlobalColor.red, Qt.BrushStyle.SolidPattern) - pattern = QtCore.QRegularExpression("\".*\"") - # pattern.setMinimal - pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) - string.setForeground(brush) - rule = (pattern, string) - self.highlightingRules.append(rule) - - # singleQuotedString - pattern = QtCore.QRegularExpression("\'.*\'") - # pattern.setMinimal(True) - pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) - - singleQuotedString.setForeground(brush) - rule = (pattern, singleQuotedString) - self.highlightingRules.append(rule) - # X coordinate - brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("forestgreen")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("X") # pattern.setMinimal(True) pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) @@ -5130,7 +5149,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): self.highlightingRules.append(rule) # Y coordinate - brush = QtGui.QBrush(Qt.GlobalColor.darkBlue, Qt.BrushStyle.SolidPattern) + color = self.get_custom_color(QtGui.QColor("forestgreen")) + brush = QtGui.QBrush(color, Qt.BrushStyle.SolidPattern) pattern = QtCore.QRegularExpression("Y") # pattern.setMinimal(True) pattern.setPatternOptions(QtCore.QRegularExpression.PatternOption.InvertedGreedinessOption) @@ -5169,6 +5189,33 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): self.setCurrentBlockState(0) + def get_custom_color(self, orig_color): + """ + Invert a given color in hexa format: #RRGGBB + + :param orig_color: color in the format #RRGGBB or QtGui.QColor + :type orig_color: str | QtGui.QColor + :return: inverted color + :rtype: QtGui.QColor + """ + if self.theme in ['default', 'light']: + return orig_color + + if isinstance(orig_color, str): + lowered_color = orig_color.lower() + elif isinstance(orig_color, QtGui.QColor): + lowered_color = str(orig_color.name()).lower() + else: # + return orig_color + + # in the "dark" theme we invert the color + group1 = "#0123456789abcdef" + group2 = "#fedcba9876543210" + # create color dict + color_dict = {group1[i]: group2[i] for i in range(len(group1))} + new_color = ''.join([color_dict[j] for j in lowered_color]) + return QtGui.QColor(new_color) + # def format_text_color(self): # cursor = self.textCursor() # c_format = cursor.charFormat() @@ -5181,6 +5228,8 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): hi_selection = QTextEdit.ExtraSelection() hi_selection.format.setBackground(self.palette().alternateBase()) + if self.theme not in ['default', 'light']: + hi_selection.format.setForeground(QtGui.QColor('black')) hi_selection.format.setProperty(QtGui.QTextFormat.Property.FullWidthSelection, True) hi_selection.cursor = self.textCursor() hi_selection.cursor.clearSelection() @@ -5231,12 +5280,15 @@ class FCTextAreaLineNumber(QtWidgets.QFrame): painter.end() - def __init__(self, *args, color_dict=None): + def __init__(self, *args, color_dict=None, **kwargs): + self.theme = kwargs.pop('theme') + if self.theme is None: + self.theme = 'default' QtWidgets.QFrame.__init__(self, *args) self.setFrameStyle(QtWidgets.QFrame.Shape.StyledPanel | QtWidgets.QFrame.Shadow.Sunken) - self.edit = self.PlainTextEdit(color_dict=color_dict) + self.edit = self.PlainTextEdit(color_dict=color_dict, theme=self.theme) self.number_bar = self.NumberBar(self.edit) hbox = QtWidgets.QHBoxLayout(self)