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)