88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
from PySide6.QtCore import QEvent, QObject, QPointF, QRect, QRectF, Qt
|
|
from PySide6.QtGui import QColor, QMouseEvent, QPaintEvent, QPainter, QPen
|
|
from PySide6.QtPdfWidgets import QPdfView
|
|
from PySide6.QtWidgets import QApplication, QWidget
|
|
|
|
def printParentHierarchy(obj: QObject, indent: int = 0):
|
|
if obj:
|
|
indentStr = ' ' * indent * 2
|
|
print(f"{indentStr}{obj.metaObject().className()}:{obj.objectName()}")
|
|
printParentHierarchy(obj.parent(), indent + 1)
|
|
return
|
|
|
|
class scotusPdfView(QPdfView):
|
|
|
|
drawing: bool
|
|
start_point: QPointF
|
|
end_point: QPointF
|
|
|
|
def formatRect(self, rect: QRectF|QRect) -> str:
|
|
return f"({rect.left()},{rect.top()}):({rect.right()},{rect.bottom()})"
|
|
|
|
def __init__(self, parent: QWidget) -> None:
|
|
self.drawing = False
|
|
super(scotusPdfView, self).__init__(parent)
|
|
print(self.viewport())
|
|
return
|
|
|
|
def paintEvent(self, event: QPaintEvent) -> None:
|
|
super(scotusPdfView,self).paintEvent(event)
|
|
if self.drawing:
|
|
page = self.pageNavigator().currentPage()
|
|
viewport = self.viewport()
|
|
painter = QPainter(viewport)
|
|
doc = self.document()
|
|
dpi = QApplication.primaryScreen().logicalDotsPerInch()
|
|
#
|
|
# XXX: Our mouse events are storing coordinates in the "self"
|
|
# coordinate system. We need them in the viewport system
|
|
#
|
|
|
|
rect = QRectF(viewport.mapFrom(self, self.start_point),
|
|
viewport.mapFrom(self, self.end_point))
|
|
redSolid = QPen(Qt.GlobalColor.red, 2, Qt.PenStyle.SolidLine)
|
|
blueDash = QPen(Qt.GlobalColor.blue, 2, Qt.PenStyle.DashLine)
|
|
greenDash = QPen(Qt.GlobalColor.green, 2, Qt.PenStyle.DashLine)
|
|
painter.setPen(redSolid)
|
|
painter.drawRect(rect) # Mouse drag box
|
|
|
|
selectRect = QRectF(rect.left()/dpi*72,
|
|
rect.top()/dpi*72,
|
|
rect.right()/dpi*72,
|
|
rect.bottom()/dpi*72)
|
|
painter.setPen(blueDash)
|
|
selection = doc.getSelectionAtIndex(page, 10, 50)
|
|
selection = doc.getSelection(page, selectRect.topLeft(), selectRect.bottomRight())
|
|
bb = selection.boundingRectangle()
|
|
painter.drawRect(bb) # Selection bounding box
|
|
print(selection.text())
|
|
print()
|
|
|
|
painter.setPen(greenDash)
|
|
bb.setLeft(bb.left()/72*dpi)
|
|
bb.setTop(bb.top()/72*dpi)
|
|
bb.setRight(bb.right()/72*dpi)
|
|
bb.setBottom(bb.bottom()/72*dpi)
|
|
painter.drawRect(bb) # Selection translated into viewport coordinates?
|
|
return
|
|
|
|
def mousePressEvent(self, event: QMouseEvent) -> None:
|
|
if event.button() == Qt.MouseButton.LeftButton:
|
|
self.start_point = event.pos()
|
|
self.drawing = True
|
|
return
|
|
|
|
def mouseMoveEvent(self, event: QMouseEvent) -> None:
|
|
if self.drawing:
|
|
pos = event.pos()
|
|
self.end_point = pos
|
|
viewport = self.viewport()
|
|
viewport.update()
|
|
return
|
|
|
|
def mouseReleaseEvent(self, event: QMouseEvent) -> None:
|
|
if event.button() == Qt.MouseButton.LeftButton:
|
|
self.drawing = False
|
|
self.viewport().update()
|
|
return
|