Skip to content

Commit eb03f8c

Browse files
committed
新对话按钮效果优化-11
1 parent cf462ac commit eb03f8c

2 files changed

Lines changed: 117 additions & 1 deletion

File tree

devel/1019.md

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# [1019] 优化 New chat 按钮及浮球按钮 UI
2+
3+
## 1 相关文档
4+
- [dddd.md](dddd.md) - 任务文档模板
5+
- [1018.md](1018.md) - 优化 LLM Chat 侧边栏开关按钮 UI
6+
7+
## 2 任务相关的代码文件
8+
- `src/Plugins/Qt/qt_chat_tab_widget.cpp`
9+
- `src/Plugins/Qt/qt_chat_tab_widget.hpp`
10+
- `TeXmacs/misc/images/llm-chat/addchat.svg`
11+
- `TeXmacs/misc/images/images.qrc`
12+
13+
## 3 如何测试
14+
15+
### 3.1 确定性测试(单元测试)
16+
```bash
17+
xmake b qt_chat_tab_widget_test
18+
xmake r qt_chat_tab_widget_test
19+
```
20+
21+
### 3.2 非确定性测试(文档验证)
22+
```bash
23+
xmake b stem
24+
```
25+
运行后打开 LLM Chat 标签页,验证:
26+
27+
1. **New chat 按钮样式**
28+
- 文本左侧有 addchat.svg 图标(18px)
29+
- 按钮居中显示在侧边栏
30+
- 固定尺寸 140x36px,pill 形状(圆角 18px)
31+
- 无边框,白色背景,无 hover 背景色变化
32+
- 有柔和阴影(blur=3, alpha=25, offset=1px)
33+
- 鼠标悬停时阴影加深(blur=6, alpha=50, offset=2px)
34+
35+
2. **收起态浮球按钮**
36+
- 点击收缩按钮后侧边栏隐藏
37+
- 内容区左上角出现胶囊形容器,包含两个圆球按钮:
38+
- 左侧:展开按钮(sidebar.svg)
39+
- 右侧:新建聊天按钮(addchat.svg)
40+
- 胶囊容器有 4px 内边距和圆角背景
41+
- 点击新建聊天按钮可创建新会话
42+
43+
3. **常量提取**:文件顶部所有魔法数字均已提取为 `constexpr` 常量
44+
45+
## 4 如何提交
46+
47+
提交前执行以下最少步骤:
48+
49+
```bash
50+
xmake b qt_chat_tab_widget_test
51+
xmake r qt_chat_tab_widget_test
52+
xmake b stem
53+
```
54+
55+
## 5 What
56+
57+
优化 LLM Chat 标签页的 New chat 按钮及收起态浮球按钮 UI。
58+
59+
1. **New chat 按钮视觉升级**
60+
- 添加 addchat.svg 图标到文本左侧
61+
- 固定尺寸 140x36px,pill 圆角(高度的一半)
62+
- 去掉边框和 hover 背景色
63+
- 添加 `QGraphicsDropShadowEffect` 阴影效果
64+
- 悬停时通过 eventFilter 动态加深阴影(替代背景色变化)
65+
- 按钮在侧边栏水平居中
66+
67+
2. **收起态添加浮球新建聊天按钮**
68+
- 在内容区左上角添加圆球新建聊天按钮(与展开按钮并排)
69+
- 两个浮球按钮放入统一的胶囊形容器中
70+
- 容器有灰色背景、4px 内边距、4px 按钮间距和圆角
71+
72+
3. **提取魔法数字为常量**
73+
- 新增 17 个 `constexpr` 常量:按钮尺寸、阴影参数、间距、圆角等
74+
- 删除 7 个不再使用的无用常量
75+
- 所有 `DpiUtils::scaled()` 调用均使用命名常量
76+
77+
## 6 Why
78+
79+
1. New chat 按钮原为纯文本且无样式,视觉上不够突出,缺乏现代感
80+
2. 收起态只有展开按钮,用户需要展开侧边栏才能新建聊天,操作路径长
81+
3. 代码中存在大量裸魔法数字,不利于维护和 DPI 适配
82+
83+
## 7 How
84+
85+
### 7.1 New chat 按钮
86+
`setup_left_sidebar()` 中:
87+
- `setIcon(QIcon(":llm-chat/addchat.svg"))` 添加图标
88+
- `setFixedSize(QSize(140, 36))` 固定尺寸
89+
- QSS 中 `border: none` 去掉边框,`border-radius: 18px` 形成 pill 形状
90+
- 去掉 `QPushButton:hover` 背景色规则
91+
- 创建 `QGraphicsDropShadowEffect`,设置 blur=3、alpha=25、offset_y=1
92+
- `installEventFilter` 监听 `HoverEnter`/`HoverLeave`,动态调整阴影参数
93+
- `normalLayout->addWidget(newChatButton_, 0, Qt::AlignHCenter)` 居中
94+
95+
### 7.2 浮球胶囊容器
96+
`setup_right_content()` 中:
97+
- 创建 `QWidget` 作为容器,使用 `QHBoxLayout` 水平排列两个按钮
98+
- 容器设置 `#e8e8e8` 背景色和圆角(按钮半径 + 内边距)
99+
- 两个按钮通过 `setup_floating_button()` 统一创建(透明背景,由容器提供底色)
100+
- 容器统一显示/隐藏,通过 `move()` 定位到内容区左上角
101+
102+
### 7.3 常量提取
103+
新增常量示例:
104+
- `kNewChatButtonHeight = 36`, `kNewChatButtonWidth = 140`
105+
- `kNewChatShadowBlur = 3`, `kNewChatShadowAlpha = 25`
106+
- `kNewChatHoverShadowBlur = 6`, `kNewChatHoverShadowAlpha = 50`
107+
- `kSendButtonSize = 36`, `kSendButtonRadius = 18`
108+
- `kConversationBtnRadius = 6`, `kModelLabelMinHeight = 20`
109+
- 等 17 个常量
110+
111+
删除无用常量:
112+
- `kSendButtonPadY`, `kSendButtonPadX`, `kSendButtonFontPx`
113+
- `kContentMarginX`, `kTopPanelMaxWidth`, `kInputFrameBorder`
114+
- `kFloatingNewChatBtnMarginX`

src/Plugins/Qt/qt_chat_tab_widget.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ constexpr int kFloatingBtnMarginX= 12;
164164
constexpr int kFloatingBtnMarginY= 130;
165165
/// 浮球容器内边距(像素)。
166166
constexpr int kFloatingContainerPad= 4;
167+
/// 浮球按钮间距(像素)。
168+
constexpr int kFloatingBtnSpacing= 4;
167169
/// New chat 按钮图标尺寸(像素)。
168170
constexpr int kNewChatIconSize= 18;
169171
/// New chat 按钮固定高度(像素)。
@@ -628,7 +630,7 @@ QTChatTabWidget::setup_right_content (QHBoxLayout* mainLayout) {
628630
DpiUtils::scaled (kFloatingContainerPad),
629631
DpiUtils::scaled (kFloatingContainerPad),
630632
DpiUtils::scaled (kFloatingContainerPad));
631-
floatingLayout->setSpacing (0);
633+
floatingLayout->setSpacing (DpiUtils::scaled (kFloatingBtnSpacing));
632634
floatingContainer->setStyleSheet (
633635
QString ("QWidget#chat-tab-floating-container { "
634636
"background-color: #e8e8e8; border-radius: %1px; }")

0 commit comments

Comments
 (0)