--- a/eric6/MicroPython/MicroPythonReplWidget.py Tue Jul 16 20:12:53 2019 +0200 +++ b/eric6/MicroPython/MicroPythonReplWidget.py Wed Jul 17 20:31:47 2019 +0200 @@ -14,7 +14,7 @@ from PyQt5.QtCore import ( pyqtSlot, pyqtSignal, Qt, QPoint, QEvent, QIODevice, QTimer ) -from PyQt5.QtGui import QColor, QKeySequence, QTextCursor +from PyQt5.QtGui import QColor, QKeySequence, QTextCursor, QBrush from PyQt5.QtWidgets import ( QWidget, QMenu, QApplication, QHBoxLayout, QSpacerItem, QSizePolicy) try: @@ -55,6 +55,26 @@ dataReceived = pyqtSignal(bytes) + # ANSI Colors + AnsiColors = { + (1, 30): QBrush(Qt.darkGray), + (1, 31): QBrush(Qt.red), + (1, 32): QBrush(Qt.green), + (1, 33): QBrush(Qt.yellow), + (1, 34): QBrush(Qt.blue), + (1, 35): QBrush(Qt.magenta), + (1, 36): QBrush(Qt.cyan), + (1, 37): QBrush(Qt.white), + (2, 30): QBrush(Qt.black), + (2, 31): QBrush(Qt.darkRed), + (2, 32): QBrush(Qt.darkGreen), + (2, 33): QBrush(Qt.darkYellow), + (2, 34): QBrush(Qt.darkBlue), + (2, 35): QBrush(Qt.darkMagenta), + (2, 36): QBrush(Qt.darkCyan), + (2, 37): QBrush(Qt.lightGray), + } + def __init__(self, parent=None): """ Constructor @@ -115,7 +135,7 @@ return self.__vt100Re = re.compile( - r'(?P<count>[\d]*)(;?[\d]*)*(?P<action>[ABCDKm])') + r'(?P<count>\d*);?(?P<color>\d*)(?P<action>[ABCDKm])') self.__populateDeviceTypeComboBox() @@ -127,6 +147,10 @@ self.replEdit.customContextMenuRequested.connect( self.__showContextMenu) + + defaultCharFormat = self.replEdit.textCursor().charFormat() + self.DefaultForeground = defaultCharFormat.foreground() + self.DefaultBackground = defaultCharFormat.background() def __populateDeviceTypeComboBox(self): """ @@ -218,6 +242,7 @@ menu = QMenu(self) menu.addAction(self.tr("Copy"), self.replEdit.copy, copyKeys) menu.addAction(self.tr("Paste"), self.__paste, pasteKeys) + menu.addSeparator() menu.exec_(self.replEdit.mapToGlobal(pos)) def setConnected(self, connected): @@ -310,18 +335,6 @@ self.__closeSerialLink() self.setConnected(False) - def __activatePlotter(self): - """ - Private method to activate a data plotter widget. - """ - # TODO: not implemented yet - - def __deactivatePlotter(self): - """ - Private method to deactivate the plotter widget. - """ - # TODO: not implemented yet - @pyqtSlot() def __paste(self): """ @@ -441,7 +454,26 @@ mode=QTextCursor.KeepAnchor) tc.removeSelectedText() self.replEdit.setTextCursor(tc) - # TODO: add handling of 'm' (colors) + elif action == "m": + print(match.group("count"), match.group("color")) + charFormat = tc.charFormat() + if count == 0 and match.group("color") == "": + # reset color + charFormat.setForeground(self.DefaultForeground) + charFormat.setBackground(self.DefaultBackground) + elif count in (0, 1, 2): + if match.group("color") != "": + color = int(match.group("color")) + if count == 0: + count = 1 + if 30 <= color <= 37: + charFormat.setForeground( + self.AnsiColors[(count, color)]) + elif 40 <= color <= 47: + charFormat.setBackground( + self.AnsiColors[(count, color - 10)]) + tc.setCharFormat(charFormat) + self.replEdit.setTextCursor(tc) elif data[index] == 10: # \n tc.movePosition(QTextCursor.End) self.replEdit.setTextCursor(tc) @@ -633,7 +665,7 @@ self.__ui = e5App().getObject("UserInterface") if self.__plotterRunning: - if self.__chartWidget.hasData(): + if self.__chartWidget.isDirty(): res = E5MessageBox.okToClearData( self, self.tr("Unsaved Chart Data"), @@ -668,7 +700,7 @@ self.__ui.addSideWidget(self.__ui.BottomSide, self.__chartWidget, UI.PixmapCache.getIcon("chart"), - self.tr("Chart")) + self.tr("μPy Chart")) self.__ui.showSideWidget(self.__chartWidget) if not self.__serial: