Carregar ficheiros para "/"
This commit is contained in:
164
document_viewer.py
Normal file
164
document_viewer.py
Normal file
@ -0,0 +1,164 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user