Skip to content

Commit 2d44f5e

Browse files
PinkMagicFlyclaude
andauthored
[0976] 侧边栏联网搜索和深度思考按钮改为纯图标样式 (#4540)
Co-authored-by: Claude Code <noreply@anthropic.com>
1 parent 5e8259a commit 2d44f5e

4 files changed

Lines changed: 132 additions & 7 deletions

File tree

devel/0976.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# [0976] 侧边栏的联网搜索和深度思考按钮改为纯图标样式
2+
3+
## 1 任务描述
4+
5+
AI 聊天**侧边栏(dock)**中的「深度思考」「联网搜索」两个开关按钮,样式改为:
6+
没有按钮边框,也没有文字显示,只有图标。**Chat 标签页(全屏)中的按钮保持
7+
原样**(主题边框 + 图标 + 文字)。
8+
9+
## 2 任务相关的代码文件
10+
11+
- `src/Plugins/Qt/qt_chat_tab_widget.hpp/.cpp`
12+
- `toggle_btn_qss (iconOnly, btnH)`:开关按钮内联样式助手。纯图标模式显式
13+
`border: none`(内联样式优先级高于主题 CSS,覆盖主题边框);文字模式
14+
不声明 border,沿用主题 CSS。
15+
- `ChatConversationPanel::setToggleButtonsIconOnly`:切换两个按钮的
16+
`ToolButtonStyle`(IconOnly / TextBesideIcon)与内联样式。
17+
- `QTChatTabWidget::setDockMode` + `dockMode_`:对已有面板立即生效,
18+
`createPanel` 对新建面板沿用当前模式。
19+
- `make_toggle_btn`:默认仍为文字模式;文字同时设为 tooltip(纯图标模式
20+
下供悬停辨认)。
21+
- `src/Plugins/Qt/qt_tm_widget.cpp``sync_chat_sidebar_mode` 进入侧边栏时
22+
`setDockMode (true)``sync_chat_tab_mode` 及侧边栏隐藏路径把控件移出
23+
dock 时 `setDockMode (false)`
24+
25+
按钮图标本身由主题 CSS 的 `qproperty-iconNormal/iconChecked` 提供
26+
`QTMStateToolButton`),勾选态仍通过背景色/图标切换表达,不受影响。
27+
28+
## 3 如何测试
29+
30+
### 3.1 格式化与基础校验
31+
32+
```bash
33+
gf fmt --changed-since=main
34+
xmake b stem
35+
```
36+
37+
### 3.2 手动测试(GUI)
38+
39+
1. 编译并启动 Mogan STEM:
40+
```bash
41+
xmake b stem
42+
xmake r stem
43+
```
44+
2. 打开 AI 聊天**侧边栏**(dock):「深度思考」「联网搜索」按钮无边框、
45+
无文字、只显示图标;悬停有 tooltip;点击切换勾选态后图标/背景正常变化。
46+
3. 打开 Chat **标签页**(全屏会话):两按钮保持原样(边框 + 图标 + 文字)。
47+
4. 在侧边栏 ↔ 标签页之间来回切换(含「关闭侧边栏后再打开标签页」路径),
48+
两种形态样式各自正确;新建会话面板同样遵循当前模式。
49+
5. 浅色(liii)与深色(liii-night)主题下分别验证。
50+
51+
## 4 What / Why / How
52+
53+
- **What**:仅侧边栏的深度思考、联网搜索按钮改为纯图标;标签页保持原样。
54+
- **Why**:侧边栏宽度有限,纯图标按钮更紧凑;标签页空间充裕,保留文字更易读。
55+
- **How**:同一 `QTChatTabWidget` 在两种模式间复用并被 reparent,故在
56+
模式切换点(`sync_chat_sidebar_mode` / `sync_chat_tab_mode`)调用
57+
`setDockMode`,由 View 层统一切换按钮样式;`border` 用按钮内联样式
58+
覆盖主题 CSS,不改动主题文件。
59+
60+
## 5 如何提交
61+
62+
```bash
63+
gf fmt --changed-since=main
64+
git add devel/0976.md
65+
git commit -m "[0976] 补充任务文档"
66+
git add src/Plugins/Qt/qt_chat_tab_widget.cpp src/Plugins/Qt/qt_chat_tab_widget.hpp src/Plugins/Qt/qt_tm_widget.cpp
67+
git commit -m "[0976] 侧边栏联网搜索和深度思考按钮改为纯图标样式"
68+
```

src/Plugins/Qt/qt_chat_tab_widget.cpp

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,26 @@ ChatConversationPanel::ChatConversationPanel (const string& sessionId,
189189
setup_ui ();
190190
}
191191

192+
/**
193+
* @brief 思考/搜索开关按钮的内联样式。
194+
*
195+
* 纯图标模式(dock 侧边栏)需显式 border: none 覆盖主题 CSS 中的边框;
196+
* 文字模式(Chat 标签页)不声明 border,由主题 CSS 提供。
197+
*/
198+
static QString
199+
toggle_btn_qss (bool iconOnly, int btnH) {
200+
if (iconOnly) {
201+
return QString ("QToolButton { border: none; border-radius: %1px; "
202+
"padding: 2px; margin: 0px; }")
203+
.arg (btnH / 2);
204+
}
205+
int fontPx= DpiUtils::scaled (12);
206+
return QString ("QToolButton { border-radius: %1px; padding: 2px 2px 2px "
207+
"6px; margin: 0px; font-size: %2px; }")
208+
.arg (btnH / 2)
209+
.arg (fontPx);
210+
}
211+
192212
QTMStateToolButton*
193213
make_toggle_btn (QWidget* parent, const char* objName, const QString& text) {
194214
int btnH= DpiUtils::scaled (kSendButtonSize);
@@ -201,18 +221,26 @@ make_toggle_btn (QWidget* parent, const char* objName, const QString& text) {
201221
btn->setIconSize (QSize (DpiUtils::scaled (kSendIconSize),
202222
DpiUtils::scaled (kSendIconSize)));
203223
btn->setText (text);
224+
// 纯图标模式(dock 侧边栏)下文字不显示,靠 tooltip 辨认按钮含义
225+
btn->setToolTip (text);
204226
btn->setToolButtonStyle (Qt::ToolButtonTextBesideIcon);
205227
btn->setFixedHeight (btnH);
206228
btn->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Fixed);
207-
int fontPx= DpiUtils::scaled (12);
208-
btn->setStyleSheet (
209-
QString ("QToolButton { border-radius: %1px; padding: 2px 2px 2px 6px; "
210-
"margin: 0px; font-size: %2px; }")
211-
.arg (btnH / 2)
212-
.arg (fontPx));
229+
btn->setStyleSheet (toggle_btn_qss (false, btnH));
213230
return btn;
214231
}
215232

233+
void
234+
ChatConversationPanel::setToggleButtonsIconOnly (bool iconOnly) {
235+
Qt::ToolButtonStyle style=
236+
iconOnly ? Qt::ToolButtonIconOnly : Qt::ToolButtonTextBesideIcon;
237+
int btnH= DpiUtils::scaled (kSendButtonSize);
238+
thinkingButton_->setToolButtonStyle (style);
239+
thinkingButton_->setStyleSheet (toggle_btn_qss (iconOnly, btnH));
240+
searchButton_->setToolButtonStyle (style);
241+
searchButton_->setStyleSheet (toggle_btn_qss (iconOnly, btnH));
242+
}
243+
216244
void
217245
ChatConversationPanel::setup_ui () {
218246
QVBoxLayout* contentLayout= new QVBoxLayout (this);
@@ -1667,6 +1695,7 @@ QTChatTabWidget::createPanel (const string& sessionId) {
16671695
sessionId, msgBufUrl, inBufUrl, conversationStack_);
16681696
conversationStack_->addWidget (panel);
16691697
conversations_.append (panel);
1698+
panel->setToggleButtonsIconOnly (dockMode_);
16701699
return panel;
16711700
}
16721701

@@ -1915,6 +1944,13 @@ QTChatTabWidget::setSidebarVisible (bool visible) {
19151944
if (floatingBtnContainer_) floatingBtnContainer_->hide ();
19161945
}
19171946

1947+
void
1948+
QTChatTabWidget::setDockMode (bool dock) {
1949+
dockMode_= dock;
1950+
for (int i= 0; i < conversations_.size (); i++)
1951+
conversations_[i]->setToggleButtonsIconOnly (dock);
1952+
}
1953+
19181954
void
19191955
QTChatTabWidget::setCloseSidebarButtonVisible (bool visible) {
19201956
if (closeSidebarBtn_) closeSidebarBtn_->setVisible (visible);

src/Plugins/Qt/qt_chat_tab_widget.hpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ class ChatConversationPanel : public QWidget {
112112
*/
113113
tree readInputMessage () const;
114114

115+
/**
116+
* @brief 切换思考/搜索按钮为纯图标样式(无边框、无文字)。
117+
*
118+
* dock 侧边栏模式为纯图标;Chat 标签页模式恢复主题边框 + 图标 + 文字。
119+
* @param iconOnly 是否纯图标
120+
*/
121+
void setToggleButtonsIconOnly (bool iconOnly);
122+
115123
QToolButton* sendButton () const { return sendButton_; }
116124
QToolButton* thinkingButton () const { return thinkingButton_; }
117125
QToolButton* searchButton () const { return searchButton_; }
@@ -445,6 +453,15 @@ class QTChatTabWidget : public QWidget {
445453
void setSidebarVisible (bool visible);
446454
void setCloseSidebarButtonVisible (bool visible);
447455

456+
/**
457+
* @brief 设置 dock 侧边栏模式。
458+
*
459+
* dock 模式下思考/搜索按钮为纯图标(无边框、无文字);标签页模式
460+
* 恢复主题边框 + 文字。对已有面板立即生效,后续 createPanel 沿用。
461+
* @param dock 是否 dock 侧边栏模式
462+
*/
463+
void setDockMode (bool dock);
464+
448465
// ---- 供外部组件访问 ----
449466
QWidget* contentWidget () const { return contentWidget_; }
450467

@@ -497,7 +514,8 @@ class QTChatTabWidget : public QWidget {
497514
QList<ChatConversationPanel*> conversations_; ///< 所有会话面板
498515
ChatConversationPanel* activeConversation_ = nullptr; ///< 当前激活的面板
499516
bool sidebarCollapsed_ = false; ///< 侧边栏是否折叠
500-
int sidebarExpandedWidth_= 0; ///< 侧边栏展开时宽度
517+
bool dockMode_ = false; ///< 是否 dock 侧边栏模式
518+
int sidebarExpandedWidth_= 0; ///< 侧边栏展开时宽度
501519
qt_tm_widget_rep* parentTmWidget_= nullptr; ///< 关联的 TeXmacs widget
502520

503521
static bool globalSidebarCollapsed_; ///< 全局记忆的侧边栏折叠状态

src/Plugins/Qt/qt_tm_widget.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,7 @@ qt_tm_widget_rep::sync_chat_tab_mode () {
13241324
chatWidget->setSidebarCollapsed (
13251325
QTChatTabWidget::globalSidebarCollapsed ());
13261326
chatWidget->setCloseSidebarButtonVisible (false);
1327+
chatWidget->setDockMode (false);
13271328
}
13281329
}
13291330
if (chatSideDock) chatSideDock->hide ();
@@ -1452,6 +1453,7 @@ qt_tm_widget_rep::sync_chat_sidebar_mode () {
14521453
if (chatWidget) {
14531454
chatWidget->setSidebarVisible (false);
14541455
chatWidget->setCloseSidebarButtonVisible (true);
1456+
chatWidget->setDockMode (true);
14551457
// 连接关闭按钮信号(先断开所有旧连接,避免重复触发)
14561458
QObject::disconnect (chatWidget, &QTChatTabWidget::closeSidebarRequested,
14571459
nullptr, nullptr);
@@ -1521,6 +1523,7 @@ qt_tm_widget_rep::sync_chat_sidebar_mode () {
15211523
chatWidget->setSidebarCollapsed (
15221524
QTChatTabWidget::globalSidebarCollapsed ());
15231525
chatWidget->setCloseSidebarButtonVisible (false);
1526+
chatWidget->setDockMode (false);
15241527
}
15251528
}
15261529

0 commit comments

Comments
 (0)