diff --git a/scotusPdfView.py b/scotusPdfView.py new file mode 100644 index 0000000..4c27134 --- /dev/null +++ b/scotusPdfView.py @@ -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 diff --git a/ui/pdfViewer.py b/ui/pdfViewer.py index be39c34..836ffbb 100644 --- a/ui/pdfViewer.py +++ b/ui/pdfViewer.py @@ -16,11 +16,12 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, QIcon, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtPdfWidgets import QPdfView from PySide6.QtWidgets import (QApplication, QDialog, QHeaderView, QSizePolicy, QSplitter, QTabWidget, QToolBar, QTreeView, QVBoxLayout, QWidget) -import ui.resources_rc + +from scotusPdfView import scotusPdfView +import resources_rc class Ui_pdfViewer(object): def setupUi(self, pdfViewer): @@ -107,7 +108,7 @@ class Ui_pdfViewer(object): self.pagesTab.setObjectName(u"pagesTab") self.tabWidget.addTab(self.pagesTab, "") self.splitter.addWidget(self.tabWidget) - self.pdfView = QPdfView(self.splitter) + self.pdfView = scotusPdfView(self.splitter) self.pdfView.setObjectName(u"pdfView") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy1.setHorizontalStretch(10) diff --git a/ui/pdfViewer.ui b/ui/pdfViewer.ui index 039408d..9edbf05 100644 --- a/ui/pdfViewer.ui +++ b/ui/pdfViewer.ui @@ -99,7 +99,7 @@ - + 10 @@ -215,9 +215,9 @@ - QPdfView + scotusPdfView QWidget -
qpdfview.h
+
scotusPdfView.h