from PySide6.QtCore import QObject, Signal from PySide6.QtWidgets import QMessageBox from database.db_manager import DatabaseManager from database.models import ProjectData from typing import Optional from widgets.project_dialog import AddProjectDialog class ProjectController(QObject): # 定义信号 project_changed = Signal(ProjectData) # 项目变更信号 project_renamed = Signal(str) # 项目重命名信号 project_deleted = Signal() # 项目删除信号 def __init__(self, db_manager: DatabaseManager, view: 'AVAS_WIDGET'): super().__init__() self.db_manager = db_manager self.view = view self.current_project: Optional[ProjectData] = None def _notify_project_changed(self): """通知项目变更""" self.project_changed.emit(self.current_project) if self.current_project: self.project_renamed.emit(self.current_project.name) def create_project(self) -> bool: """创建新项目""" dialog = AddProjectDialog(self.view) if dialog.exec(): name, description = dialog.get_project_data() if not name: QMessageBox.warning(self.view, "警告", "项目名称不能为空!") return False try: project_id = self.db_manager.add_project(name, description) self.current_project = ProjectData( id=project_id, name=name, description=description, created_at=None ) self._notify_project_changed() return True except Exception as e: QMessageBox.critical(self.view, "错误", f"创建项目失败:{str(e)}") return False return False def select_project(self, project_id: int) -> bool: """选择项目""" projects = self.db_manager.get_all_projects() for project in projects: if project.id == project_id: self.current_project = project self._notify_project_changed() return True return False def rename_project(self, new_name: str) -> bool: """重命名项目""" if not self.current_project: QMessageBox.warning(self.view, "警告", "请先选择项目!") return False if not new_name: QMessageBox.warning(self.view, "警告", "项目名称不能为空!") return False try: if self.db_manager.update_project_name(self.current_project.id, new_name): self.current_project.name = new_name self._notify_project_changed() return True else: QMessageBox.warning(self.view, "警告", "项目名称已存在!") return False except Exception as e: QMessageBox.critical(self.view, "错误", f"重命名项目失败:{str(e)}") return False def update_project_description(self, new_description: str) -> bool: """更新项目描述""" if not self.current_project: QMessageBox.warning(self.view, "警告", "请先选择项目!") return False try: if self.db_manager.update_project_description(self.current_project.id, new_description): self.current_project.description = new_description self._notify_project_changed() return True return False except Exception as e: QMessageBox.critical(self.view, "错误", f"更新项目描述失败:{str(e)}") return False def delete_project(self) -> bool: """删除项目""" if not self.current_project: QMessageBox.warning(self.view, "警告", "请先选择项目!") return False reply = QMessageBox.question( self.view, "确认删除", f"确定要删除项目 '{self.current_project.name}' 吗?\n此操作将同时删除项目下的所有配置!", QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if reply == QMessageBox.Yes: try: if self.db_manager.delete_project(self.current_project.id): self.current_project = None self.project_deleted.emit() return True return False except Exception as e: QMessageBox.critical(self.view, "错误", f"删除项目失败:{str(e)}") return False return False