import sys from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QMenuBar, QStackedWidget, QSplitter, QMessageBox, QTableWidgetItem, QTabWidget from PySide6.QtCore import Qt, QMimeData from PySide6.QtGui import QDragEnterEvent, QDropEvent from database import init_db from folder_view import FolderTreeView from document_form import DocumentForm from search_view import SearchView from document_viewer import DocumentViewer from batch_upload import BatchUploadWidget from document_list import DocumentListView from version_control import VersionControl from backup_manager import BackupManager from tag_manager import TagManager, DocumentTags from statistics_view import StatisticsView from preferences import PreferencesDialog, Preferences, RecentDocuments from document_compare import DocumentCompare from document_collections import CollectionsWidget, CollectionDocuments import os class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Informação Técnica Automóvel") self.setMinimumSize(1200, 800) self.setAcceptDrops(True) self.current_folder_id = None # Create central widget and layout central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QVBoxLayout(central_widget) # Create splitter for main layout main_splitter = QSplitter(Qt.Horizontal) main_layout.addWidget(main_splitter) # Left panel with folder tree and collections left_panel = QTabWidget() # Folder tree self.folder_view = FolderTreeView() self.folder_view.folder_selected.connect(self.on_folder_selected) left_panel.addTab(self.folder_view, "Pastas") # Collections self.collections_widget = CollectionsWidget() self.collections_widget.collection_selected.connect(self.show_collection) left_panel.addTab(self.collections_widget, "Coleções") main_splitter.addWidget(left_panel) # Center panel with document list and collection documents self.center_panel = QStackedWidget() # Document list self.doc_list = DocumentListView() self.doc_list.document_selected.connect(self.show_document) self.center_panel.addWidget(self.doc_list) # Collection documents self.collection_docs = CollectionDocuments() self.collection_docs.document_selected.connect(self.show_document) self.center_panel.addWidget(self.collection_docs) main_splitter.addWidget(self.center_panel) # Right panel with operations self.right_panel = QStackedWidget() # Add document form self.document_form = DocumentForm() self.right_panel.addWidget(self.document_form) # Add batch upload widget self.batch_upload = BatchUploadWidget() self.batch_upload.upload_completed.connect(self.refresh_views) self.right_panel.addWidget(self.batch_upload) # Add search view self.search_view = SearchView() self.search_view.document_selected.connect(self.show_document) self.right_panel.addWidget(self.search_view) # Add document viewer with tags viewer_widget = QWidget() viewer_layout = QVBoxLayout(viewer_widget) self.document_viewer = DocumentViewer() viewer_layout.addWidget(self.document_viewer) self.document_tags = DocumentTags() viewer_layout.addWidget(self.document_tags) self.right_panel.addWidget(viewer_widget) # Add version control self.version_control = VersionControl() self.right_panel.addWidget(self.version_control) # Add backup manager self.backup_manager = BackupManager() self.right_panel.addWidget(self.backup_manager) # Add tag manager self.tag_manager = TagManager() self.tag_manager.tags_updated.connect(self.refresh_views) self.right_panel.addWidget(self.tag_manager) # Add statistics view self.statistics_view = StatisticsView() self.right_panel.addWidget(self.statistics_view) # Add document compare self.document_compare = DocumentCompare() self.right_panel.addWidget(self.document_compare) main_splitter.addWidget(self.right_panel) # Set splitter proportions main_splitter.setSizes([ int(self.width() * 0.2), # Left panel int(self.width() * 0.3), # Center panel int(self.width() * 0.5) # Right panel ]) # Create menu bar self.create_menu_bar() def create_menu_bar(self): menubar = self.menuBar() # File menu file_menu = menubar.addMenu("Arquivo") new_folder_action = file_menu.addAction("Nova Pasta") new_folder_action.triggered.connect(self.folder_view.add_folder) upload_action = file_menu.addAction("Upload Documento") upload_action.triggered.connect(self.show_upload_form) batch_upload_action = file_menu.addAction("Upload em Lote") batch_upload_action.triggered.connect(self.show_batch_upload) file_menu.addSeparator() # Recent documents submenu self.recent_menu = file_menu.addMenu("Documentos Recentes") self.recent_menu.aboutToShow.connect(self.update_recent_menu) file_menu.addSeparator() backup_menu = file_menu.addMenu("Backup") backup_menu.addAction("Exportar").triggered.connect( lambda: self.right_panel.setCurrentWidget(self.backup_manager)) file_menu.addSeparator() exit_action = file_menu.addAction("Sair") exit_action.triggered.connect(self.close) # Search menu search_menu = menubar.addMenu("Pesquisar") advanced_search_action = search_menu.addAction("Busca Avançada") advanced_search_action.triggered.connect(self.show_search) # Tools menu tools_menu = menubar.addMenu("Ferramentas") tools_menu.addAction("Gerenciar Tags").triggered.connect( lambda: self.right_panel.setCurrentWidget(self.tag_manager)) tools_menu.addAction("Comparar Documentos").triggered.connect( lambda: self.right_panel.setCurrentWidget(self.document_compare)) tools_menu.addAction("Estatísticas").triggered.connect( lambda: self.right_panel.setCurrentWidget(self.statistics_view)) # Settings menu settings_menu = menubar.addMenu("Configurações") preferences_action = settings_menu.addAction("Preferências") preferences_action.triggered.connect(self.show_preferences) def dragEnterEvent(self, event: QDragEnterEvent): if event.mimeData().hasUrls(): event.acceptProposedAction() def dropEvent(self, event: QDropEvent): files = [url.toLocalFile() for url in event.mimeData().urls()] if files: current_index = self.folder_view.currentIndex() if current_index.isValid(): folder_id = self.folder_view.model.itemFromIndex(current_index).data() self.batch_upload.folder_id = folder_id # Add files to batch upload for file in files: row = self.batch_upload.files_table.rowCount() self.batch_upload.files_table.insertRow(row) self.batch_upload.files_table.setItem( row, 0, QTableWidgetItem(os.path.basename(file))) self.batch_upload.files_table.setItem( row, 1, QTableWidgetItem(file)) self.right_panel.setCurrentWidget(self.batch_upload) else: QMessageBox.warning( self, "Aviso", "Selecione uma pasta antes de arrastar arquivos." ) def show_upload_form(self): print(f"Showing document form for folder ID: {self.current_folder_id}") self.document_form = DocumentForm(folder_id=self.current_folder_id) self.right_panel.addWidget(self.document_form) self.right_panel.setCurrentWidget(self.document_form) def show_batch_upload(self): current_index = self.folder_view.currentIndex() folder_id = None if current_index.isValid(): folder_id = self.folder_view.model.itemFromIndex(current_index).data() self.batch_upload.folder_id = folder_id self.right_panel.setCurrentWidget(self.batch_upload) def show_search(self): self.right_panel.setCurrentWidget(self.search_view) def show_document(self, doc_id): self.document_viewer.load_document(doc_id) self.document_tags.load_document(doc_id) self.version_control.load_document(doc_id) self.right_panel.setCurrentWidget(self.version_control) def on_folder_selected(self, folder_id): """Handle folder selection""" print(f"Main window received folder selection: ID={folder_id}") self.current_folder_id = folder_id self.doc_list.set_folder(folder_id) self.center_panel.setCurrentWidget(self.doc_list) # Update document form with current folder self.document_form.folder_id = folder_id print(f"Updated document form folder ID to: {folder_id}") def refresh_views(self): self.doc_list.refresh_documents() self.collections_widget.refresh_collections() self.collection_docs.refresh_documents() self.document_compare.refresh_documents() def show_preferences(self): dialog = PreferencesDialog(Preferences(), self) dialog.show() def update_recent_menu(self): self.recent_menu.clear() recent = RecentDocuments(Preferences()) documents = recent.get_recent_docs() if documents: for doc in documents: action = self.recent_menu.addAction(doc['name']) action.triggered.connect( lambda checked, doc_id=doc['id']: self.show_document(doc_id) ) self.recent_menu.addSeparator() clear_action = self.recent_menu.addAction("Limpar Lista") clear_action.triggered.connect(self.clear_recent_documents) else: no_docs_action = self.recent_menu.addAction("Nenhum documento recente") no_docs_action.setEnabled(False) def clear_recent_documents(self): recent = RecentDocuments(Preferences()) recent.clear_recent_docs() self.update_recent_menu() def show_collection(self, collection_id): self.collection_docs.load_collection(collection_id) self.center_panel.setCurrentWidget(self.collection_docs) def main(): # Initialize database engine = init_db() # Start application app = QApplication(sys.argv) # Ensure preferences are initialized preferences = Preferences() if not preferences.get_save_path(): # Ask for initial save path if not set default_docs_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documentos") preferences.set("default_save_path", default_docs_path) if not os.path.exists(default_docs_path): os.makedirs(default_docs_path) window = MainWindow() window.show() sys.exit(app.exec()) if __name__ == "__main__": main()