jewelry.py 1.97 KB
"""JewelryBridge — 款式设计 tab 桥层。

QML 需要的能力:
- 拿全部 9 个类别名(categories)
- 按类别拿候选词(getOptions)
- 增删词条 + 重置类别 / 全部
- 用户填完表后预览中文 prompt

后端:core.jewelry.JewelryLibraryManager + PromptAssembler。
"""
import logging
from typing import Any, Dict, List

from PySide6.QtCore import Property, QObject, Signal, Slot

from core.jewelry import PromptAssembler


class JewelryBridge(QObject):
    libraryChanged = Signal(str)  # category

    def __init__(self, library_manager, parent=None):
        super().__init__(parent)
        self._logger = logging.getLogger(__name__)
        self._lib = library_manager

    @Property("QVariantList", constant=True)
    def categories(self) -> List[str]:
        """9 个类别的中文名(顺序固定,与 QML 表单一致)。"""
        return list(self._lib.library.keys())

    @Slot(str, result="QVariantList")
    def getOptions(self, category: str) -> List[str]:
        return list(self._lib.library.get(category, []))

    @Slot(str, str)
    def addItem(self, category: str, value: str) -> None:
        self._lib.add_item(category, value)
        self.libraryChanged.emit(category)

    @Slot(str, str)
    def removeItem(self, category: str, value: str) -> None:
        self._lib.remove_item(category, value)
        self.libraryChanged.emit(category)

    @Slot(str)
    def resetCategory(self, category: str) -> None:
        self._lib.reset_category(category)
        self.libraryChanged.emit(category)

    @Slot()
    def resetAll(self) -> None:
        self._lib.reset_all()
        for c in self._lib.library.keys():
            self.libraryChanged.emit(c)

    @Slot("QVariantMap", result=str)
    def previewPrompt(self, form_data: Dict[str, Any]) -> str:
        """form_data: { "主石形状": "圆形", "金属": "18K黄金", ... } —— 空字段允许。"""
        return PromptAssembler.assemble({k: str(v or "") for k, v in form_data.items()})