diff --git a/graph_memory_tui/app.py b/graph_memory_tui/app.py index 9b513b2..a5e918c 100644 --- a/graph_memory_tui/app.py +++ b/graph_memory_tui/app.py @@ -26,6 +26,7 @@ from .core.imports import ( NEO4J_USER, NEO4J_PASSWORD, MODEL_NAME, + USE_EMBEDDED_DB, ) from .core.tools.tool_limiter import ToolLimiter @@ -70,7 +71,7 @@ class GraphMemoryApp(App[None]): def compose(self) -> ComposeResult: """构建组件树""" yield LeftPanel() - yield RightPanel(self._config) + yield RightPanel(self._config, use_embedded_db=USE_EMBEDDED_DB) yield StatusBar() def on_mount(self) -> None: @@ -131,7 +132,7 @@ class GraphMemoryApp(App[None]): F1 - 帮助 F2 - 切换侧边栏 F3 - 工具详情 -F4 - 查询框 +F4 - 查询框(仅 Neo4j 模式) F5 - 清屏 F6 - 退出 @@ -151,16 +152,20 @@ F6 - 退出 history.toggle_latest_tool_details() def action_focus_query(self) -> None: - """聚焦查询框""" + """聚焦查询框(仅 Neo4j 模式可用)""" sidebar = self.query_one(RightPanel) + + if not sidebar.has_cypher_query_box(): + self.notify("查询框仅在 Neo4j 模式下可用", title="提示", timeout=3) + return + if sidebar.is_collapsed(): sidebar.toggle() sidebar.update_title() - try: - query_box = sidebar.get_cypher_query_box() + + query_box = sidebar.get_cypher_query_box() + if query_box: query_box.focus() - except: - pass def action_clear_history(self) -> None: """清屏""" diff --git a/graph_memory_tui/widgets/right_panel.py b/graph_memory_tui/widgets/right_panel.py index fc7664e..d2a9591 100644 --- a/graph_memory_tui/widgets/right_panel.py +++ b/graph_memory_tui/widgets/right_panel.py @@ -1,6 +1,7 @@ """右侧面板""" -from textual.containers import Container, Vertical +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 @@ -12,20 +13,20 @@ from ..models.config import AppConfig class RightPanel(Container): """右侧边栏""" - def __init__(self, config: AppConfig | None = None, **kwargs): + 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: """构建右侧面板""" - from textual.containers import ScrollableContainer - yield Static("F2:隐藏侧边栏", classes="sidebar-title") with ScrollableContainer(): yield ConfigSection(self._config) yield OperationLog() - yield CypherQueryBox() + if not self._use_embedded_db: + yield CypherQueryBox() def toggle(self) -> None: """切换折叠/展开""" @@ -49,9 +50,16 @@ class RightPanel(Container): """获取操作日志组件""" return self.query_one(OperationLog) - def get_cypher_query_box(self) -> CypherQueryBox: - """获取Cypher查询框组件""" - return self.query_one(CypherQueryBox) + 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: """更新标题"""