Checkpoint

This commit is contained in:
Christopher T. Johnson
2025-03-10 11:21:14 -04:00
parent b2d67f7aea
commit 86ccee18fb
3 changed files with 94 additions and 6 deletions

87
scotusPdfView.py Normal file
View File

@@ -0,0 +1,87 @@
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