certflow.views.lookup_tables_dialog 源代码

"""基础数据维护(合并对话框)

将「材质牌号 / 口径映射 / 型号→压力」三个基础字典表的维护界面合并到
一个带标签页(``QTabWidget``)的对话框中,仿「校正队列」的二级 UI 模式,
从主窗口导航栏以单个按钮打开,避免导航栏按钮过多。

每个标签页复用通用基类 ``LookupTableManagerView``,本对话框仅负责分页容器
与跨页的资源清理(子管理器各自持有独立会话,关闭时统一释放)。
"""

from __future__ import annotations

import contextlib
from typing import Any, override

from PySide6.QtWidgets import (
    QDialog,
    QTabWidget,
    QVBoxLayout,
    QWidget,
)

from certflow.views.bases.lookup_table_manager_view import LookupTableManagerView
from certflow.views.caliber_mapping_manager_view import CaliberMappingManagerView
from certflow.views.material_grade_manager_view import MaterialGradeManagerView
from certflow.views.model_param_mapping_manager_view import ModelParamMappingManagerView

# 标签页注册表:(标签文本, 管理器类, 标识 key, 字典键名)
# key 用于右键菜单配置驱动时定位到指定标签页(见 config.yaml 的
# ``lookup_tables.context_menu.items[].table``);
# dict_key 用于 DB ↔ CSV 双向同步(对应 dictionaries.yaml 的 dictionary.<dict_key>.csv)。
_TAB_REGISTRY: list[tuple[str, type[LookupTableManagerView], str, str]] = [
    ("🧪 材质牌号", MaterialGradeManagerView, "material_grade", "material_grades"),
    ("📐 口径映射", CaliberMappingManagerView, "caliber_mapping", "caliber_mappings"),
    ("🔧 型号→压力", ModelParamMappingManagerView, "model_param", "model_param_mappings"),
]


[文档] class LookupTablesDialog(QDialog): """基础数据维护合并对话框(标签页容器)""" def __init__( self, db_manager: Any = None, session: Any = None, initial_table: str | None = None, parent: QWidget | None = None, ) -> None: """初始化合并对话框 Args: db_manager: 数据库管理器(优先);传入后各子管理器持有独立会话 session: 外部会话(与 db_manager 二选一) initial_table: 初始选中的标签页标识(见 ``_TAB_REGISTRY`` 的 key) parent: 父窗口 """ super().__init__(parent) self.setWindowTitle("基础数据维护") self.setMinimumSize(1080, 660) self.resize(1180, 740) self._db_manager = db_manager self._session = session self._managers: list[LookupTableManagerView] = [] self._init_ui(initial_table) def _init_ui(self, initial_table: str | None) -> None: layout = QVBoxLayout(self) layout.setContentsMargins(10, 10, 10, 10) layout.setSpacing(8) tabs = QTabWidget() initial_index = 0 for idx, (label, cls, key, dict_key) in enumerate(_TAB_REGISTRY): mgr = cls( db_manager=self._db_manager, session=self._session, dict_key=dict_key, parent=self, ) self._managers.append(mgr) tabs.addTab(mgr, label) if key == initial_table: initial_index = idx tabs.setCurrentIndex(initial_index) layout.addWidget(tabs)
[文档] @override def closeEvent(self, event: Any) -> None: """关闭时统一释放各子管理器的控制器会话。 子管理器作为标签页嵌入本对话框,不会触发自身 ``closeEvent``, 需在此显式清理,避免会话泄漏。 """ for mgr in self._managers: with contextlib.suppress(Exception): # pragma: no cover - 防御性 mgr._controller.close() super().closeEvent(event)