"""右侧面板""" from textual.containers import Container, ScrollableContainer from textual.css.query import NoMatches from textual.widgets import Static from textual.app import ComposeResult from .config_section import ConfigSection from .operation_log import OperationLog from .cypher_query_box import CypherQueryBox from ..models.config import AppConfig class RightPanel(Container): """右侧边栏""" def __init__(self, config: AppConfig | None = None, use_embedded_db: bool = True, **kwargs): super().__init__(**kwargs) self._is_collapsed = False self._config = config or AppConfig() self._use_embedded_db = use_embedded_db def compose(self) -> ComposeResult: """构建右侧面板""" yield Static("F2:隐藏侧边栏", classes="sidebar-title") with ScrollableContainer(): yield ConfigSection(self._config) yield OperationLog() if not self._use_embedded_db: yield CypherQueryBox() def toggle(self) -> None: """切换折叠/展开""" self._is_collapsed = not self._is_collapsed if self._is_collapsed: self.styles.width = 0 self.styles.display = "none" else: self.styles.width = 35 self.styles.display = "block" def is_collapsed(self) -> bool: """检查是否折叠""" return self._is_collapsed def get_config_section(self) -> ConfigSection: """获取配置区组件""" return self.query_one(ConfigSection) def get_operation_log(self) -> OperationLog: """获取操作日志组件""" return self.query_one(OperationLog) def get_cypher_query_box(self) -> CypherQueryBox | None: """获取Cypher查询框组件(可能不存在)""" try: return self.query_one(CypherQueryBox) except NoMatches: return None def has_cypher_query_box(self) -> bool: """检查是否存在Cypher查询框""" return not self._use_embedded_db def update_title(self) -> None: """更新标题""" title = self.query_one(Static) title.update("F2:展开侧边栏" if self._is_collapsed else "F2:隐藏侧边栏")