from PySide6.QtWidgets import (QTreeView, QFileDialog, QMenu, QInputDialog, QMessageBox) from PySide6.QtCore import Qt, QModelIndex, Signal from PySide6.QtGui import QStandardItemModel, QStandardItem from database import get_session from models import Folder import os from preferences import Preferences class FolderTreeView(QTreeView): folder_selected = Signal(int) # Signal for folder selection def __init__(self, parent=None): super().__init__(parent) self.model = QStandardItemModel() self.model.setHorizontalHeaderLabels(['Pastas']) self.setModel(self.model) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) self.preferences = Preferences() self.load_folders() # Connect selection changed signal self.selectionModel().selectionChanged.connect(self.on_folder_selected) def load_folders(self): self.model.clear() self.model.setHorizontalHeaderLabels(['Pastas']) session = get_session() root_folders = session.query(Folder).filter(Folder.parent_id == None).all() for folder in root_folders: item = QStandardItem(folder.name) item.setData(folder.id) self.model.appendRow(item) self.load_subfolders(folder, item) session.close() def load_subfolders(self, folder, parent_item): session = get_session() subfolders = session.query(Folder).filter(Folder.parent_id == folder.id).all() for subfolder in subfolders: item = QStandardItem(subfolder.name) item.setData(subfolder.id) parent_item.appendRow(item) self.load_subfolders(subfolder, item) session.close() def get_physical_path(self, folder): """Get the physical path for a folder""" base_path = self.preferences.get_save_path() if not base_path: QMessageBox.warning(self, "Erro", "Por favor, configure o diretório de salvamento nas preferências primeiro.") return None path_parts = [] current = folder while current: path_parts.insert(0, current.name) current = current.parent # Make sure we're using forward slashes and the correct base path # Only add 'Root' if it's not already in the path if path_parts and path_parts[0] != "Root": path_parts.insert(0, "Root") full_path = os.path.join(base_path, *path_parts) # Convert to forward slashes for consistency return full_path.replace("\\", "/") def create_physical_folder(self, folder): """Create the physical folder on disk""" physical_path = self.get_physical_path(folder) if physical_path and not os.path.exists(physical_path): try: os.makedirs(physical_path) return True except Exception as e: QMessageBox.warning(self, "Erro", f"Erro ao criar pasta física: {str(e)}") return False return True def show_context_menu(self, position): menu = QMenu() add_action = menu.addAction("Nova Pasta") delete_action = menu.addAction("Excluir Pasta") rename_action = menu.addAction("Renomear") action = menu.exec_(self.mapToGlobal(position)) if action == add_action: self.add_folder() elif action == delete_action: self.delete_folder() elif action == rename_action: self.rename_folder() def on_folder_selected(self, selected, deselected): indexes = selected.indexes() if indexes: current_item = self.model.itemFromIndex(indexes[0]) folder_id = current_item.data() self.folder_selected.emit(folder_id) def add_folder(self): name, ok = QInputDialog.getText(self, "Nova Pasta", "Nome da pasta:") if ok and name: session = get_session() current_index = self.currentIndex() new_folder = Folder(name=name) if current_index.isValid(): parent_id = self.model.itemFromIndex(current_index).data() parent_folder = session.query(Folder).get(parent_id) new_folder.parent_id = parent_id new_folder.parent = parent_folder session.add(new_folder) session.commit() # Create physical folder if not self.create_physical_folder(new_folder): session.delete(new_folder) session.commit() session.close() self.load_folders() def delete_folder(self): current_index = self.currentIndex() if not current_index.isValid(): return reply = QMessageBox.question(self, "Confirmar Exclusão", "Tem certeza que deseja excluir esta pasta?\nIsso também excluirá a pasta física do disco.", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: session = get_session() folder_id = self.model.itemFromIndex(current_index).data() folder = session.query(Folder).get(folder_id) if folder: # Delete physical folder physical_path = self.get_physical_path(folder) if physical_path and os.path.exists(physical_path): try: os.rmdir(physical_path) # Only removes if empty except Exception as e: QMessageBox.warning(self, "Aviso", f"Não foi possível excluir a pasta física: {str(e)}") session.delete(folder) session.commit() session.close() self.load_folders() def rename_folder(self): current_index = self.currentIndex() if not current_index.isValid(): return current_name = self.model.itemFromIndex(current_index).text() name, ok = QInputDialog.getText(self, "Renomear Pasta", "Novo nome:", text=current_name) if ok and name: session = get_session() folder_id = self.model.itemFromIndex(current_index).data() folder = session.query(Folder).get(folder_id) if folder: folder.name = name session.commit() session.close() self.load_folders()