This commit is contained in:
Christopher T. Johnson
2025-02-20 10:14:42 -05:00
parent a48e39d9ac
commit eaaa00890e
5 changed files with 75 additions and 34 deletions

View File

@@ -4,35 +4,54 @@ from PySide6.QtCore import QFile, QModelIndex, QPoint, Signal, Slot
from PySide6.QtPdf import QPdfBookmarkModel, QPdfDocument
from PySide6.QtPdfWidgets import QPdfView
from PySide6.QtWidgets import QComboBox, QDialog, QMenuBar, QSpinBox, QWidget
from ui.pdfViewer import Ui_pdfViewer
ZOOM_MULTIPLIER = math.sqrt(2.0)
class ZoomSelector(QComboBox):
zoom_mode_changed = Signal(QPdfView.ZoomMode)
zoom_factor_changed = Signal(float)
def __init__(self, parent: QWidget|None = None) -> None:
def __init__(self, parent: QWidget | None = None) -> None:
super(ZoomSelector, self).__init__(parent)
self.setEditable(True)
for text in [ 'Fit Width', 'Fit Page', '12%', '25%', '33%', '50%', '66%', '75%', '100%', '125%', '150%', '200%', '400%']:
for text in [
"Fit Width",
"Fit Page",
"12%",
"25%",
"33%",
"50%",
"66%",
"75%",
"100%",
"125%",
"150%",
"200%",
"400%",
]:
self.addItem(text)
self.currentTextChanged.connect(self.on_current_text_changed)
lineEdit = self.lineEdit()
assert lineEdit is not None
lineEdit.editingFinished.connect(self._editing_finished)
return
@Slot(float) # type: ignore
@Slot(float) # type: ignore
def set_zoom_factor(self, zoomFactor: float) -> None:
percent = int(zoomFactor * 100)
self.setCurrentText(f"{percent}%")
return
@Slot()
def reset(self) -> None:
self.setCurrentIndex(8) # 100%
self.setCurrentIndex(8) # 100%
return
@Slot(str) # type: ignore
@Slot(str) # type: ignore
def on_current_text_changed(self, text: str) -> None:
if text == "Fit Width":
self.zoom_mode_changed.emit(QPdfView.ZoomMode.FitToWidth)
@@ -44,13 +63,14 @@ class ZoomSelector(QComboBox):
self.zoom_mode_changed.emit(QPdfView.ZoomMode.Custom)
self.zoom_factor_changed.emit(factor)
return
@Slot()
def _editing_finished(self) -> None:
lineEdit = self.lineEdit()
assert lineEdit is not None
self.on_current_text_changed(lineEdit.text())
return
class PDFViewer(QDialog, Ui_pdfViewer):
menubar: QMenuBar
@@ -75,7 +95,9 @@ class PDFViewer(QDialog, Ui_pdfViewer):
nav.backAvailableChanged.connect(self.actionBack.setEnabled)
nav.forwardAvailableChanged.connect(self.actionForward.setEnabled)
self.zoomSelector.zoom_mode_changed.connect(self.pdfView.setZoomMode)
self.zoomSelector.zoom_factor_changed.connect(self.pdfView.setZoomFactor)
self.zoomSelector.zoom_factor_changed.connect(
self.pdfView.setZoomFactor
)
self.zoomSelector.reset()
bookmark_model = QPdfBookmarkModel(self)
@@ -84,25 +106,29 @@ class PDFViewer(QDialog, Ui_pdfViewer):
self.bookmarkView.setModel(bookmark_model)
self.bookmarkView.activated.connect(self.bookmark_selected)
self.tabWidget.setTabEnabled(1, False) # disable pages tabwidget
self.tabWidget.setTabEnabled(1, False) # disable pages tabwidget
self.pdfView.setDocument(self.document)
self.pdfView.zoomFactorChanged.connect(self.zoomSelector.set_zoom_factor)
self.pdfView.zoomFactorChanged.connect(
self.zoomSelector.set_zoom_factor
)
return
@Slot(QFile) # type: ignore
@Slot(QFile) # type: ignore
def open(self, file: QFile) -> None:
#assert file.exists()
#if not file.isOpen():
#file.open(QFile.OpenModeFlag.ReadOnly)
#self.document.load(file)
# assert file.exists()
# if not file.isOpen():
# file.open(QFile.OpenModeFlag.ReadOnly)
# self.document.load(file)
self.document.load(file.fileName())
document_title = self.document.metaData(QPdfDocument.MetaDataField.Title)
document_title = self.document.metaData(
QPdfDocument.MetaDataField.Title
)
self.setWindowTitle(document_title if document_title else "PDF Viewer")
self.page_selected(0)
self.pageSelector.setMaximum(self.document.pageCount() -1 )
self.pageSelector.setMaximum(self.document.pageCount() - 1)
return
@Slot(QModelIndex) # type: ignore
@Slot(QModelIndex) # type: ignore
def bookmark_selected(self, index: QModelIndex) -> None:
if not index.isValid():
return
@@ -114,7 +140,7 @@ class PDFViewer(QDialog, Ui_pdfViewer):
nav.jump(page, QPoint(), zoom_level)
return
@Slot(int) # type: ignore
@Slot(int) # type: ignore
def page_selected(self, page: int) -> None:
nav = self.pdfView.pageNavigator()
nav.jump(page, QPoint(), nav.currentZoom())
@@ -157,7 +183,11 @@ class PDFViewer(QDialog, Ui_pdfViewer):
@Slot()
def on_actionContinuous_triggered(self) -> None:
cont_checked = self.actionContinuous.isChecked()
mode = QPdfView.PageMode.MultiPage if cont_checked else QPdfView.PageMode.SinglePage
mode = (
QPdfView.PageMode.MultiPage
if cont_checked
else QPdfView.PageMode.SinglePage
)
self.pdfView.setPageMode(mode)
return
@@ -170,4 +200,3 @@ class PDFViewer(QDialog, Ui_pdfViewer):
def on_actionForward_triggered(self) -> None:
self.pdfView.pageNavigator().forward()
return