#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试待删除项目功能 """ import sys import os import tempfile import shutil from datetime import datetime # 添加MetaCore目录到Python路径 current_dir = os.path.dirname(os.path.abspath(__file__)) metacore_dir = os.path.join(current_dir, '..', 'MetaCore') sys.path.insert(0, metacore_dir) from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * from data.project_manager import ProjectManager, Project from ui.project_card import ProjectCard from ui.styles import StyleSheet class PendingDeleteTestWindow(QMainWindow): """待删除功能测试窗口""" def __init__(self): super().__init__() self.setWindowTitle("待删除项目功能测试") self.setGeometry(100, 100, 1000, 700) # 应用深色主题样式 self.setStyleSheet(StyleSheet.get_main_style()) # 创建临时目录用于测试 self.temp_dir = tempfile.mkdtemp(prefix="metacore_test_") # 创建测试项目 self.create_test_projects() # 设置UI self.setup_ui() def create_test_projects(self): """创建测试项目""" self.project_manager = ProjectManager() # 创建一个真实的项目目录 self.test_project_dir = os.path.join(self.temp_dir, "测试项目") os.makedirs(self.test_project_dir, exist_ok=True) # 创建一些测试文件 with open(os.path.join(self.test_project_dir, "README.md"), 'w', encoding='utf-8') as f: f.write("# 测试项目\n这是一个用于测试待删除功能的项目。") # 创建测试项目 test_project = Project( id=999, title="测试项目", date=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), type="test", image="🧪", path=self.temp_dir, project_dir=self.test_project_dir, description="用于测试待删除功能的项目", status="normal" ) self.project_manager.projects.append(test_project) self.test_project = test_project def setup_ui(self): """设置用户界面""" central_widget = QWidget() self.setCentralWidget(central_widget) # 主布局 main_layout = QVBoxLayout(central_widget) main_layout.setContentsMargins(20, 20, 20, 20) main_layout.setSpacing(20) # 标题 title_label = QLabel("待删除项目功能测试") title_label.setStyleSheet(""" font-size: 24px; font-weight: bold; color: #ffffff; margin-bottom: 10px; """) main_layout.addWidget(title_label) # 说明文字 desc_label = QLabel( "测试流程:\n" "1. 点击「删除项目目录」按钮模拟项目目录被删除\n" "2. 等待5秒,系统会检测到项目目录不存在\n" "3. 在弹出的对话框中点击「No」保留项目\n" "4. 观察项目卡片变浅,菜单按钮变成叉号\n" "5. 重要:系统不会再次弹窗提示(已修复)\n" "6. 点击「恢复项目目录」按钮恢复项目目录\n" "7. 🆕 系统会自动检测并恢复项目(无需点击)\n" "8. 或者点击叉号按钮永久删除项目" ) desc_label.setStyleSheet(""" font-size: 14px; color: #cccccc; margin-bottom: 20px; padding: 15px; background-color: rgba(60, 60, 60, 0.5); border-radius: 8px; """) main_layout.addWidget(desc_label) # 控制按钮 button_layout = QHBoxLayout() self.delete_dir_btn = QPushButton("删除项目目录") self.delete_dir_btn.setStyleSheet(""" QPushButton { background-color: #ff6b6b; color: white; border: none; padding: 10px 20px; border-radius: 6px; font-size: 14px; font-weight: bold; } QPushButton:hover { background-color: #ff5252; } """) self.delete_dir_btn.clicked.connect(self.delete_project_directory) button_layout.addWidget(self.delete_dir_btn) self.restore_dir_btn = QPushButton("恢复项目目录") self.restore_dir_btn.setStyleSheet(""" QPushButton { background-color: #4caf50; color: white; border: none; padding: 10px 20px; border-radius: 6px; font-size: 14px; font-weight: bold; } QPushButton:hover { background-color: #45a049; } """) self.restore_dir_btn.clicked.connect(self.restore_project_directory) self.restore_dir_btn.setEnabled(False) button_layout.addWidget(self.restore_dir_btn) button_layout.addStretch() main_layout.addLayout(button_layout) # 项目卡片容器 card_container = QWidget() card_layout = QHBoxLayout(card_container) card_layout.setContentsMargins(10, 10, 10, 10) # 创建项目卡片 self.project_card = ProjectCard(self.test_project, self.project_manager, "grid") card_layout.addWidget(self.project_card) card_layout.addStretch() main_layout.addWidget(card_container) main_layout.addStretch() # 状态显示 self.status_label = QLabel("状态:项目目录存在,项目状态正常") self.status_label.setStyleSheet(""" font-size: 12px; color: #4caf50; padding: 10px; background-color: rgba(76, 175, 80, 0.1); border-radius: 6px; border: 1px solid #4caf50; """) main_layout.addWidget(self.status_label) # 连接项目管理器信号 self.project_manager.project_updated.connect(self.on_project_updated) def delete_project_directory(self): """删除项目目录""" if os.path.exists(self.test_project_dir): shutil.rmtree(self.test_project_dir) self.delete_dir_btn.setEnabled(False) self.restore_dir_btn.setEnabled(True) self.status_label.setText("状态:项目目录已删除,等待系统检测...") self.status_label.setStyleSheet(""" font-size: 12px; color: #ff9800; padding: 10px; background-color: rgba(255, 152, 0, 0.1); border-radius: 6px; border: 1px solid #ff9800; """) def restore_project_directory(self): """恢复项目目录""" if not os.path.exists(self.test_project_dir): os.makedirs(self.test_project_dir, exist_ok=True) # 重新创建测试文件 with open(os.path.join(self.test_project_dir, "README.md"), 'w', encoding='utf-8') as f: f.write("# 测试项目\n这是一个用于测试待删除功能的项目。\n\n项目目录已恢复!") self.delete_dir_btn.setEnabled(True) self.restore_dir_btn.setEnabled(False) self.status_label.setText("状态:项目目录已恢复,等待系统自动检测恢复...") self.status_label.setStyleSheet(""" font-size: 12px; color: #4caf50; padding: 10px; background-color: rgba(76, 175, 80, 0.1); border-radius: 6px; border: 1px solid #4caf50; """) def on_project_updated(self, project: Project): """项目更新事件""" if project.id == self.test_project.id: self.test_project = project self.project_card.project = project self.project_card.update_display() if project.status == 'pending_delete': self.status_label.setText("状态:项目处于待删除状态(卡片变浅,显示叉号)") self.status_label.setStyleSheet(""" font-size: 12px; color: #f44336; padding: 10px; background-color: rgba(244, 67, 54, 0.1); border-radius: 6px; border: 1px solid #f44336; """) elif project.status == 'normal': self.status_label.setText("状态:项目已恢复正常状态") self.status_label.setStyleSheet(""" font-size: 12px; color: #4caf50; padding: 10px; background-color: rgba(76, 175, 80, 0.1); border-radius: 6px; border: 1px solid #4caf50; """) def closeEvent(self, event): """窗口关闭事件""" # 清理临时目录 if os.path.exists(self.temp_dir): shutil.rmtree(self.temp_dir) event.accept() def main(): """主函数""" app = QApplication(sys.argv) # 设置应用程序信息 app.setApplicationName("待删除功能测试") app.setApplicationVersion("1.0.0") # 创建并显示测试窗口 window = PendingDeleteTestWindow() window.show() # 运行应用程序 sys.exit(app.exec_()) if __name__ == "__main__": main()