feat: 改进输入框支持多行文本和发送按钮

1. 将Input组件替换为TextArea,支持多行文本输入和粘贴

2. 添加发送按钮,点击即可发送消息

3. Enter键用于换行,支持多行编辑

4. 在帮助信息中显示配置文件和数据库路径

5. 优化输入框样式和布局

🤖 Generated with CodeArts Agent
This commit is contained in:
JianFeeeee
2026-04-15 08:12:24 +08:00
parent 3b19ebb988
commit 0ee396f8fa
3 changed files with 47 additions and 14 deletions

View File

@ -86,7 +86,16 @@ class GraphMemoryApp(App):
self._backend_client.shutdown() self._backend_client.shutdown()
def action_show_help(self) -> None: def action_show_help(self) -> None:
self.notify("F1-帮助 F2-侧边栏 F3-工具详情 F5-清屏 F6-退出", title="快捷键", timeout=10) from pathlib import Path
config_path = Path.home() / ".trulymem" / "config.json"
db_path = Path.home() / ".trulymem" / "graph_memory.db"
help_text = (
"F1-帮助 F2-侧边栏 F3-工具详情 F5-清屏 F6-退出\n\n"
f"配置文件: {config_path}\n"
f"数据库: {db_path}"
)
self.notify(help_text, title="快捷键 & 配置路径", timeout=15)
def action_toggle_sidebar(self) -> None: def action_toggle_sidebar(self) -> None:
from .widgets.right_panel import RightPanel from .widgets.right_panel import RightPanel

View File

@ -8,13 +8,23 @@ InputBox {
border: solid $primary; border: solid $primary;
} }
InputBox Input { InputBox TextArea {
width: 100%; width: 100%;
height: 5;
background: $surface-lighten-1; background: $surface-lighten-1;
color: $text; color: $text;
border: none; border: none;
} }
InputBox .input-buttons {
height: auto;
margin-top: 1;
}
InputBox Button {
margin: 0;
}
/* Config Section */ /* Config Section */
ConfigSection { ConfigSection {
background: $surface; background: $surface;

View File

@ -1,7 +1,7 @@
"""输入框组件""" """输入框组件"""
from textual.containers import Container from textual.containers import Container, Horizontal
from textual.widgets import Input from textual.widgets import TextArea, Button
from textual.message import Message from textual.message import Message
@ -21,20 +21,34 @@ class InputBox(Container):
def compose(self): def compose(self):
"""构建输入框""" """构建输入框"""
yield Input( yield TextArea(
placeholder="输入消息... (Enter发送)", placeholder="输入消息... (Enter换行)",
id="input-textarea" id="input-textarea"
) )
with Horizontal(classes="input-buttons"):
yield Button("发送", id="send-button", variant="primary")
def on_mount(self) -> None: def on_mount(self) -> None:
"""组件挂载时""" """组件挂载时"""
# 设置焦点 # 设置焦点
input_widget = self.query_one(Input) textarea = self.query_one(TextArea)
input_widget.focus() textarea.focus()
def on_input_submitted(self, event: Input.Submitted) -> None: def on_button_pressed(self, event: Button.Pressed) -> None:
"""处理输入提交事件""" """处理按钮点击"""
content = event.value.strip() if event.button.id == "send-button":
self._send_message()
def on_key(self, event) -> None:
"""处理按键事件"""
if event.key == "enter" and event.ctrl:
self._send_message()
event.stop()
def _send_message(self) -> None:
"""发送消息"""
textarea = self.query_one(TextArea)
content = textarea.text.strip()
if content: if content:
# 保存到历史 # 保存到历史
self._history.append(content) self._history.append(content)
@ -42,9 +56,9 @@ class InputBox(Container):
# 发送消息 # 发送消息
self.post_message(self.SendMessage(content)) self.post_message(self.SendMessage(content))
# 清空输入框 # 清空输入框
event.input.value = "" textarea.clear()
def focus(self) -> None: def focus(self) -> None:
"""聚焦输入框""" """聚焦输入框"""
input_widget = self.query_one(Input) textarea = self.query_one(TextArea)
input_widget.focus() textarea.focus()