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