Compare commits

...

2 Commits

Author SHA1 Message Date
Christopher T. Johnson
86ccee18fb Checkpoint 2025-03-10 11:21:14 -04:00
Christopher T. Johnson
b2d67f7aea Case Load is working better. #22 2025-02-27 16:01:13 -05:00
4 changed files with 113 additions and 8 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

View File

@@ -16,11 +16,12 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
QIcon, QImage, QKeySequence, QLinearGradient, QIcon, QImage, QKeySequence, QLinearGradient,
QPainter, QPalette, QPixmap, QRadialGradient, QPainter, QPalette, QPixmap, QRadialGradient,
QTransform) QTransform)
from PySide6.QtPdfWidgets import QPdfView
from PySide6.QtWidgets import (QApplication, QDialog, QHeaderView, QSizePolicy, from PySide6.QtWidgets import (QApplication, QDialog, QHeaderView, QSizePolicy,
QSplitter, QTabWidget, QToolBar, QTreeView, QSplitter, QTabWidget, QToolBar, QTreeView,
QVBoxLayout, QWidget) QVBoxLayout, QWidget)
import ui.resources_rc
from scotusPdfView import scotusPdfView
import resources_rc
class Ui_pdfViewer(object): class Ui_pdfViewer(object):
def setupUi(self, pdfViewer): def setupUi(self, pdfViewer):
@@ -107,7 +108,7 @@ class Ui_pdfViewer(object):
self.pagesTab.setObjectName(u"pagesTab") self.pagesTab.setObjectName(u"pagesTab")
self.tabWidget.addTab(self.pagesTab, "") self.tabWidget.addTab(self.pagesTab, "")
self.splitter.addWidget(self.tabWidget) self.splitter.addWidget(self.tabWidget)
self.pdfView = QPdfView(self.splitter) self.pdfView = scotusPdfView(self.splitter)
self.pdfView.setObjectName(u"pdfView") self.pdfView.setObjectName(u"pdfView")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
sizePolicy1.setHorizontalStretch(10) sizePolicy1.setHorizontalStretch(10)

View File

@@ -99,7 +99,7 @@
</attribute> </attribute>
</widget> </widget>
</widget> </widget>
<widget class="QPdfView" name="pdfView" native="true"> <widget class="scotusPdfView" name="pdfView" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>10</horstretch> <horstretch>10</horstretch>
@@ -215,9 +215,9 @@
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>QPdfView</class> <class>scotusPdfView</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>qpdfview.h</header> <header>scotusPdfView.h</header>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources> <resources>

View File

@@ -106,7 +106,6 @@ def update_db(case_id: str, db: QSqlDatabase) -> int:
# #
# We assume that case_id == docket_id at this point. If it does not, # We assume that case_id == docket_id at this point. If it does not,
# then we will build out from the request we get # then we will build out from the request we get
print(f"Updating {case_id}")
matches = re.match(r"(\d\d)[-A](\d+)(.*)$", case_id) matches = re.match(r"(\d\d)[-A](\d+)(.*)$", case_id)
if matches is None: if matches is None:
raise Exception(f"Not a match {case_id}") raise Exception(f"Not a match {case_id}")
@@ -301,7 +300,7 @@ class updateThread(QThread):
print(db.lastError()) print(db.lastError())
raise Exception("db.open()") raise Exception("db.open()")
case_id = update_db(str(self.docket_id), db) update_db(str(self.docket_id), db)
db.close() db.close()
del db del db
QSqlDatabase.removeDatabase("update") QSqlDatabase.removeDatabase("update")
@@ -312,6 +311,7 @@ class loadCases(QThread):
caseLoaded = Signal(int) caseLoaded = Signal(int)
year = QDateTime.currentDateTime().toString("yy") year = QDateTime.currentDateTime().toString("yy")
number = 0 number = 0
edocket = 0
def run(self) -> None: def run(self) -> None:
db = QSqlDatabase.cloneDatabase("qt_sql_default_connection", "load") db = QSqlDatabase.cloneDatabase("qt_sql_default_connection", "load")
@@ -348,15 +348,31 @@ class loadCases(QThread):
docket_id = f"{self.year}A{self.number}" docket_id = f"{self.year}A{self.number}"
else: else:
docket_id = f"{self.year}-{self.number}" docket_id = f"{self.year}-{self.number}"
print(f"Updating: {docket_id} ", end='')
query.bindValue(":did", docket_id) query.bindValue(":did", docket_id)
if not query.exec(): if not query.exec():
query_error(query) query_error(query)
if query.next(): if query.next():
if query.value("active") == 0: if query.value("active") == 0:
self.number += 1 self.number += 1
print("INACTIVE")
continue continue
print()
result = update_db(docket_id, db) result = update_db(docket_id, db)
if result < 0: if result < 0:
if edocket == 0:
edocket = 1
self.number = 1
query.prepare("UPDATE history SET number = :number, "
"edocket=:edocket "
"WHERE history_id=:hid")
query.bindValue(':number', 1)
query.bindValue(':edocket', 1)
query.bindValue(':hid', history_id)
if not query.exec():
query_error(query)
continue
edocket = 0
self.year = f"{int(self.year) - 1:02d}" self.year = f"{int(self.year) - 1:02d}"
if self.number > 1: if self.number > 1:
query.prepare( query.prepare(
@@ -391,6 +407,7 @@ class loadCases(QThread):
self.number += 1 self.number += 1
count += 1 count += 1
self.number -= 1
if self.number > 1: if self.number > 1:
query.prepare( query.prepare(
"UPDATE history SET number= :number WHERE year = :year" "UPDATE history SET number= :number WHERE year = :year"