165 lines
5.4 KiB
Python
165 lines
5.4 KiB
Python
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
|
|
QLabel, QScrollArea, QSplitter, QTabWidget)
|
|
from PySide6.QtCore import Qt, Signal
|
|
from PySide6.QtGui import QImage, QPixmap
|
|
import fitz
|
|
from database import get_session
|
|
from models import Document
|
|
from comments import CommentsList
|
|
from preferences import Preferences
|
|
|
|
class DocumentViewer(QWidget):
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.current_document = None
|
|
self.current_page = 0
|
|
self.preferences = Preferences()
|
|
self.setup_ui()
|
|
|
|
def setup_ui(self):
|
|
layout = QVBoxLayout(self)
|
|
|
|
# Toolbar
|
|
toolbar = QHBoxLayout()
|
|
|
|
self.prev_btn = QPushButton("Anterior")
|
|
self.prev_btn.clicked.connect(self.prev_page)
|
|
toolbar.addWidget(self.prev_btn)
|
|
|
|
self.page_label = QLabel("Página 0 de 0")
|
|
toolbar.addWidget(self.page_label)
|
|
|
|
self.next_btn = QPushButton("Próxima")
|
|
self.next_btn.clicked.connect(self.next_page)
|
|
toolbar.addWidget(self.next_btn)
|
|
|
|
toolbar.addStretch()
|
|
|
|
self.zoom_in_btn = QPushButton("Zoom +")
|
|
self.zoom_in_btn.clicked.connect(self.zoom_in)
|
|
toolbar.addWidget(self.zoom_in_btn)
|
|
|
|
self.zoom_out_btn = QPushButton("Zoom -")
|
|
self.zoom_out_btn.clicked.connect(self.zoom_out)
|
|
toolbar.addWidget(self.zoom_out_btn)
|
|
|
|
layout.addLayout(toolbar)
|
|
|
|
# Main content area
|
|
splitter = QSplitter(Qt.Horizontal)
|
|
|
|
# Document view
|
|
self.scroll_area = QScrollArea()
|
|
self.scroll_area.setWidgetResizable(True)
|
|
self.document_label = QLabel()
|
|
self.document_label.setAlignment(Qt.AlignCenter)
|
|
self.scroll_area.setWidget(self.document_label)
|
|
splitter.addWidget(self.scroll_area)
|
|
|
|
# Side panel with tabs
|
|
side_panel = QTabWidget()
|
|
|
|
# Comments tab
|
|
self.comments_list = CommentsList()
|
|
side_panel.addTab(self.comments_list, "Comentários")
|
|
|
|
splitter.addWidget(side_panel)
|
|
|
|
# Set initial splitter sizes
|
|
splitter.setSizes([int(self.width() * 0.7), int(self.width() * 0.3)])
|
|
|
|
layout.addWidget(splitter)
|
|
|
|
self.zoom_level = 1.0
|
|
self.doc = None
|
|
self.update_navigation()
|
|
|
|
def load_document(self, doc_id):
|
|
try:
|
|
session = get_session()
|
|
document = session.query(Document).get(doc_id)
|
|
|
|
if document and document.file_path:
|
|
self.current_document = doc_id
|
|
self.doc = fitz.open(document.file_path)
|
|
self.current_page = 0
|
|
self.zoom_level = 1.0
|
|
self.update_page()
|
|
self.update_navigation()
|
|
|
|
# Load comments
|
|
self.comments_list.load_document(doc_id)
|
|
|
|
# Add to recent documents if auto_preview is enabled
|
|
if self.preferences.get("auto_preview"):
|
|
from preferences import RecentDocuments
|
|
recent = RecentDocuments(self.preferences)
|
|
recent.add_document(doc_id, document.file_name)
|
|
|
|
session.close()
|
|
except Exception as e:
|
|
print(f"Error loading document: {str(e)}")
|
|
|
|
def update_page(self):
|
|
if not self.doc:
|
|
return
|
|
|
|
try:
|
|
page = self.doc[self.current_page]
|
|
zoom = self.zoom_level
|
|
|
|
# Adjust zoom based on preview size preference
|
|
preview_size = self.preferences.get("preview_size")
|
|
if preview_size == "small":
|
|
zoom *= 0.8
|
|
elif preview_size == "large":
|
|
zoom *= 1.2
|
|
|
|
mat = fitz.Matrix(zoom, zoom)
|
|
pix = page.get_pixmap(matrix=mat)
|
|
|
|
img = QImage(pix.samples, pix.width, pix.height,
|
|
pix.stride, QImage.Format_RGB888)
|
|
|
|
pixmap = QPixmap.fromImage(img)
|
|
self.document_label.setPixmap(pixmap)
|
|
|
|
self.page_label.setText(f"Página {self.current_page + 1} de {len(self.doc)}")
|
|
except Exception as e:
|
|
print(f"Error updating page: {str(e)}")
|
|
|
|
def update_navigation(self):
|
|
has_doc = self.doc is not None
|
|
has_prev = has_doc and self.current_page > 0
|
|
has_next = has_doc and self.current_page < len(self.doc) - 1
|
|
|
|
self.prev_btn.setEnabled(has_prev)
|
|
self.next_btn.setEnabled(has_next)
|
|
self.zoom_in_btn.setEnabled(has_doc)
|
|
self.zoom_out_btn.setEnabled(has_doc)
|
|
|
|
def prev_page(self):
|
|
if self.doc and self.current_page > 0:
|
|
self.current_page -= 1
|
|
self.update_page()
|
|
self.update_navigation()
|
|
|
|
def next_page(self):
|
|
if self.doc and self.current_page < len(self.doc) - 1:
|
|
self.current_page += 1
|
|
self.update_page()
|
|
self.update_navigation()
|
|
|
|
def zoom_in(self):
|
|
self.zoom_level *= 1.2
|
|
self.update_page()
|
|
|
|
def zoom_out(self):
|
|
self.zoom_level /= 1.2
|
|
self.update_page()
|
|
|
|
def closeEvent(self, event):
|
|
if self.doc:
|
|
self.doc.close()
|
|
super().closeEvent(event)
|