--- a/eric6/MicroPython/MicroPythonWidget.py Sat Feb 13 20:07:45 2021 +0100 +++ b/eric6/MicroPython/MicroPythonWidget.py Sun Feb 14 18:23:56 2021 +0100 @@ -13,7 +13,7 @@ import functools from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QPoint, QEvent -from PyQt5.QtGui import QColor, QKeySequence, QTextCursor, QBrush +from PyQt5.QtGui import QColor, QKeySequence, QTextCursor, QBrush, QClipboard from PyQt5.QtWidgets import ( QWidget, QMenu, QApplication, QHBoxLayout, QSpacerItem, QSizePolicy, QTextEdit, QToolButton, QDialog @@ -279,6 +279,9 @@ self.__populateDeviceTypeComboBox() self.replEdit.installEventFilter(self) + # Hack to intercept middle button paste + self.__origReplEditMouseReleaseEvent = self.replEdit.mouseReleaseEvent + self.replEdit.mouseReleaseEvent = self.__replEditMouseReleaseEvent self.replEdit.customContextMenuRequested.connect( self.__showContextMenu) @@ -629,14 +632,17 @@ self.__interface.isConnected() and self.__interface.write(b"\r") @pyqtSlot() - def __paste(self): + def __paste(self, mode=QClipboard.Mode.Clipboard): """ Private slot to perform a paste operation. + + @param mode paste mode (defaults to QClipboard.Mode.Clipboard) + @type QClipboard.Mode (optional) """ # add support for paste by mouse middle button clipboard = QApplication.clipboard() if clipboard: - pasteText = clipboard.text() + pasteText = clipboard.text(mode=mode) if pasteText: pasteText = pasteText.replace('\n\r', '\r') pasteText = pasteText.replace('\n', '\r') @@ -681,9 +687,11 @@ if Qt.Key_A <= key <= Qt.Key_Z: # devices treat an input of \x01 as Ctrl+A, etc. msg = bytes([1 + key - Qt.Key_A]) - elif (evt.modifiers() == Qt.ControlModifier | Qt.ShiftModifier or - (Globals.isMacPlatform() and - evt.modifiers() == Qt.ControlModifier)): + elif ( + evt.modifiers() == (Qt.ControlModifier | Qt.ShiftModifier) or + (Globals.isMacPlatform() and + evt.modifiers() == Qt.ControlModifier) + ): if key == Qt.Key_C: self.replEdit.copy() msg = b'' @@ -696,11 +704,31 @@ self.replEdit.setTextCursor(tc) self.__interface.isConnected() and self.__interface.write(msg) return True - else: # standard event processing return super(MicroPythonWidget, self).eventFilter(obj, evt) + def __replEditMouseReleaseEvent(self, evt): + """ + Private method handling mouse release events for the replEdit widget. + + Note: this is a hack because QTextEdit does not allow filtering of + QEvent.MouseButtonRelease. To make middle button paste work, we had + to intercept the protected event method (some kind of reimplementing + it). + + @param evt reference to the event object + @type QMouseEvent + """ + if evt.button() == Qt.MiddleButton: + self.__paste(mode=QClipboard.Mode.Selection) + msg = b'' + if self.__interface.isConnected(): + self.__interface.write(msg) + evt.accept() + else: + self.__origReplEditMouseReleaseEvent(evt) + def __processData(self, data): """ Private slot to process bytes received from the device.