Files
Inf_Tec_Auto/main.py
2024-12-19 09:04:00 -08:00

299 lines
12 KiB
Python

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()