eric6/MicroPython/MicroPythonWidget.py

changeset 8104
96e9348ff55f
parent 8099
522946e53835
child 8117
aaa5e0eacd4e
--- 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.

eric ide

mercurial