from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QFormLayout, QLineEdit, QComboBox, QPushButton, QTableWidget, QTableWidgetItem, QSpinBox, QHeaderView, QMenu, QMessageBox) from PySide6.QtCore import Qt, Signal from database import get_session from models import Document import os from sqlalchemy import or_ from PySide6.QtGui import QColor class SearchView(QWidget): document_selected = Signal(int) # Signal emitted when document is selected def __init__(self, parent=None): super().__init__(parent) self.setup_ui() def setup_ui(self): layout = QVBoxLayout(self) # Search form form_layout = QFormLayout() # Search fields self.marca_edit = QLineEdit() self.modelo_edit = QLineEdit() self.ano_spin = QSpinBox() self.ano_spin.setRange(1900, 2100) self.ano_spin.setSpecialValueText(" ") # Empty string for no filter self.tipo_combo = QComboBox() self.tipo_combo.addItems(["", "Elétrico", "Mecânico"]) self.variante_combo = QComboBox() self.variante_combo.addItems([ "", "Esquema", "Esquema OEM", "TSB", "Esquemas Varios", "Documentação de Instruções" ]) self.observacoes_edit = QLineEdit() self.observacoes_edit.setPlaceholderText("Digite sua busca...") form_layout.addRow("Marca:", self.marca_edit) form_layout.addRow("Modelo:", self.modelo_edit) form_layout.addRow("Ano:", self.ano_spin) form_layout.addRow("Tipo:", self.tipo_combo) form_layout.addRow("Variante:", self.variante_combo) form_layout.addRow("Observações:", self.observacoes_edit) # Search button button_layout = QHBoxLayout() self.search_button = QPushButton("Pesquisar") self.search_button.clicked.connect(self.perform_search) self.clear_button = QPushButton("Limpar") self.clear_button.clicked.connect(self.clear_search) button_layout.addWidget(self.search_button) button_layout.addWidget(self.clear_button) # Add layouts to main layout layout.addLayout(form_layout) layout.addLayout(button_layout) # Results table self.results_table = QTableWidget() self.results_table.setColumnCount(7) self.results_table.setHorizontalHeaderLabels([ "Marca", "Modelo", "Ano", "Tipo", "Variante", "Nome do Arquivo", "Observações" ]) self.results_table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.results_table.setContextMenuPolicy(Qt.CustomContextMenu) self.results_table.customContextMenuRequested.connect( self.show_context_menu) layout.addWidget(self.results_table) def perform_search(self): session = get_session() query = session.query(Document) # Apply filters if self.marca_edit.text(): query = query.filter(Document.marca.ilike(f"%{self.marca_edit.text()}%")) if self.modelo_edit.text(): query = query.filter(Document.modelo.ilike(f"%{self.modelo_edit.text()}%")) if self.ano_spin.value() != self.ano_spin.minimum(): query = query.filter(Document.ano == self.ano_spin.value()) if self.tipo_combo.currentText(): query = query.filter(Document.tipo_documento == self.tipo_combo.currentText()) if self.variante_combo.currentText(): query = query.filter(Document.variante == self.variante_combo.currentText()) if self.observacoes_edit.text(): query = query.filter(Document.observacoes.ilike(f"%{self.observacoes_edit.text()}%")) # Get results documents = query.all() # Update table valid_documents = [] for doc in documents: if os.path.exists(doc.file_path): valid_documents.append(doc) else: # Optional: Remove documents with missing files session.delete(doc) if len(documents) != len(valid_documents): session.commit() documents = valid_documents self.results_table.setRowCount(len(documents)) for row, doc in enumerate(documents): self.results_table.setItem(row, 0, QTableWidgetItem(doc.marca)) self.results_table.setItem(row, 1, QTableWidgetItem(doc.modelo)) self.results_table.setItem(row, 2, QTableWidgetItem(str(doc.ano))) self.results_table.setItem(row, 3, QTableWidgetItem(doc.tipo_documento)) self.results_table.setItem(row, 4, QTableWidgetItem(doc.variante)) self.results_table.setItem(row, 5, QTableWidgetItem(doc.file_name)) self.results_table.setItem(row, 6, QTableWidgetItem(doc.observacoes)) # Store document ID in the first column self.results_table.item(row, 0).setData(Qt.UserRole, doc.id) session.close() def clear_search(self): self.marca_edit.clear() self.modelo_edit.clear() self.ano_spin.setValue(self.ano_spin.minimum()) self.tipo_combo.setCurrentIndex(0) self.variante_combo.setCurrentIndex(0) self.observacoes_edit.clear() self.results_table.setRowCount(0) def show_context_menu(self, position): menu = QMenu() open_action = menu.addAction("Abrir Documento") open_folder_action = menu.addAction("Abrir Pasta") action = menu.exec_(self.results_table.mapToGlobal(position)) current_row = self.results_table.currentRow() if current_row >= 0: doc_id = self.results_table.item(current_row, 0).data(Qt.UserRole) if action == open_action: self.open_document(doc_id) elif action == open_folder_action: self.open_document_folder(doc_id) def open_document(self, doc_id): session = get_session() document = session.query(Document).get(doc_id) if document and os.path.exists(document.file_path): self.document_selected.emit(doc_id) else: QMessageBox.warning(self, "Erro", "Não foi possível abrir o documento.") session.close() def open_document_folder(self, doc_id): session = get_session() document = session.query(Document).get(doc_id) if document and os.path.exists(document.file_path): folder_path = os.path.dirname(document.file_path) os.startfile(folder_path) else: QMessageBox.warning(self, "Erro", "Não foi possível abrir a pasta do documento.") session.close()