[feature] 新增项目管理controller类
This commit is contained in:
parent
6a5702cf91
commit
451086bac8
@ -322,3 +322,34 @@ class DatabaseManager:
|
|||||||
(project_id,)
|
(project_id,)
|
||||||
)
|
)
|
||||||
return [ConfigData(*row) for row in cursor.fetchall()]
|
return [ConfigData(*row) for row in cursor.fetchall()]
|
||||||
|
|
||||||
|
def delete_project(self, project_id: int) -> bool:
|
||||||
|
"""删除项目及其关联数据"""
|
||||||
|
try:
|
||||||
|
with self.get_connection() as conn:
|
||||||
|
# 使用事务确保数据一致性
|
||||||
|
conn.executescript(f"""
|
||||||
|
DELETE FROM filters WHERE config_id IN
|
||||||
|
(SELECT id FROM configs WHERE project_id = {project_id});
|
||||||
|
DELETE FROM params WHERE config_id IN
|
||||||
|
(SELECT id FROM configs WHERE project_id = {project_id});
|
||||||
|
DELETE FROM configs WHERE project_id = {project_id};
|
||||||
|
DELETE FROM projects WHERE id = {project_id};
|
||||||
|
""")
|
||||||
|
conn.commit()
|
||||||
|
return True
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def update_project_description(self, project_id: int, new_description: str) -> bool:
|
||||||
|
"""更新项目描述"""
|
||||||
|
try:
|
||||||
|
with self.get_connection() as conn:
|
||||||
|
cursor = conn.execute(
|
||||||
|
"UPDATE projects SET description = ? WHERE id = ?",
|
||||||
|
(new_description, project_id)
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
return cursor.rowcount > 0
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
124
widgets/project_controller.py
Normal file
124
widgets/project_controller.py
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
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
|
Loading…
Reference in New Issue
Block a user