Files
Inf_Tec_Auto/document_viewer.py
2024-12-19 09:03:36 -08:00

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)