diff --git a/src/calibre/gui2/tweak_book/widgets.py b/src/calibre/gui2/tweak_book/widgets.py index ddd97578b3..8a23acd078 100644 --- a/src/calibre/gui2/tweak_book/widgets.py +++ b/src/calibre/gui2/tweak_book/widgets.py @@ -14,7 +14,7 @@ from qt.core import ( QDialogButtonBox, QEvent, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, QItemSelectionModel, QLabel, QLineEdit, QListView, QMimeData, QModelIndex, QPainter, QPalette, QPixmap, QPlainTextEdit, QPoint, QRect, QSize, - QSizePolicy, QSplitter, QStaticText, QStyle, QStyledItemDelegate, Qt, + QSizePolicy, QSplitter, QStaticText, QStyle, QStyledItemDelegate, Qt, QTextCursor, QTextDocument, QTextOption, QToolButton, QVBoxLayout, QWidget, pyqtSignal ) @@ -1287,6 +1287,31 @@ class PlainTextEdit(QPlainTextEdit): # {{{ return True return QPlainTextEdit.event(self, ev) + def mouseDoubleClickEvent(self, ev): + super().mouseDoubleClickEvent(ev) + c = self.textCursor() + # Workaround for QTextCursor considering smart quotes as word + # characters https://bugreports.qt.io/browse/QTBUG-101372 + changed = False + while True: + q = c.selectedText() + if not q: + break + left = min(c.anchor(), c.position()) + right = max(c.anchor(), c.position()) + if q[0] in '“‘': + changed = True + c.setPosition(left + 1) + c.setPosition(right, QTextCursor.MoveMode.KeepAnchor) + elif q[-1] in '’”': + changed = True + c.setPosition(left) + c.setPosition(right - 1, QTextCursor.MoveMode.KeepAnchor) + else: + break + if changed: + self.setTextCursor(c) + # }}}