""" 配置分类选择组件 """ from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QPushButton, QMessageBox ) from PySide6.QtCore import Signal, Qt from pathlib import Path from typing import Optional, Callable from config_category import ConfigCategoryManager, ConfigCategory class ConfigCategoryWidget(QWidget): """配置分类选择组件""" # 信号:分类改变时触发 (category_name, config_path, template_path) category_changed = Signal(str, Path, object) def __init__(self, parent: Optional[QWidget] = None, on_change: Optional[Callable] = None): super().__init__(parent) self._on_change = on_change self.manager = ConfigCategoryManager() self._current_category: Optional[ConfigCategory] = None self._init_ui() self._load_categories() def _init_ui(self): """初始化UI""" layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) # 标签 label = QLabel("配置分类:") label.setStyleSheet("font-weight: bold; font-size: 13px;") layout.addWidget(label) # 分类下拉框 self.category_combo = QComboBox() self.category_combo.setMinimumWidth(150) self.category_combo.currentIndexChanged.connect(self._on_category_selected) layout.addWidget(self.category_combo) # 刷新按钮 refresh_btn = QPushButton("刷新") refresh_btn.setMaximumWidth(60) refresh_btn.clicked.connect(self._load_categories) layout.addWidget(refresh_btn) # 信息标签 self.info_label = QLabel("") self.info_label.setStyleSheet("color: #666; font-size: 11px;") layout.addWidget(self.info_label) layout.addStretch() self.setLayout(layout) def _load_categories(self): """加载配置分类列表""" # 保存当前选择 current_name = self.get_current_category_name() # 清空并重新加载 self.category_combo.clear() categories = self.manager.scan_categories() if not categories: self.category_combo.addItem("(无可用分类)", None) self.info_label.setText("请在 configs/ 目录下创建分类") self.info_label.setStyleSheet("color: #f57c00; font-size: 11px;") return # 添加分类到下拉框 for category in categories: self.category_combo.addItem(category.name, category) # 恢复之前的选择 if current_name: index = self.category_combo.findText(current_name) if index >= 0: self.category_combo.setCurrentIndex(index) # 更新信息 self._update_info() def _on_category_selected(self, index: int): """分类选择改变""" if index < 0: return category = self.category_combo.itemData(index) if category is None: return self._current_category = category self._update_info() # 触发信号 template_path = category.template_path if category.template_path else None self.category_changed.emit( category.name, category.config_path, template_path ) # 调用回调 if self._on_change: self._on_change() def _update_info(self): """更新信息标签""" if self._current_category is None: self.info_label.setText("") return cat = self._current_category has_template = cat.template_path is not None if has_template: template_name = cat.template_path.name self.info_label.setText(f"✓ 配置和模板已就绪 ({template_name})") self.info_label.setStyleSheet("color: #2e7d32; font-size: 11px;") else: self.info_label.setText("⚠ 未找到模板文件") self.info_label.setStyleSheet("color: #f57c00; font-size: 11px;") def get_current_category(self) -> Optional[ConfigCategory]: """获取当前选择的分类""" return self._current_category def get_current_category_name(self) -> Optional[str]: """获取当前分类名称""" if self._current_category: return self._current_category.name return None def set_category(self, name: str) -> bool: """ 设置当前分类 Args: name: 分类名称 Returns: 是否成功设置 """ index = self.category_combo.findText(name) if index >= 0: self.category_combo.setCurrentIndex(index) return True return False def has_categories(self) -> bool: """是否有可用的分类""" return self.category_combo.count() > 0 and \ self.category_combo.itemData(0) is not None