Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions TeXmacs/misc/images/images.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<file>llm-chat/addchat.svg</file>
<file>llm-chat/cancel.svg</file>
<file>llm-chat/ellipsis.svg</file>
<file>llm-chat/search.svg</file>

<!-- dark theme -->
<file>ocr-button/left-align-white.svg</file>
Expand Down
7 changes: 7 additions & 0 deletions TeXmacs/misc/images/llm-chat/search.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 13 additions & 3 deletions TeXmacs/misc/themes/liii-night.css
Original file line number Diff line number Diff line change
Expand Up @@ -1335,9 +1335,17 @@ QLabel#chat-tab-nav-title {
color: #ffffff;
}

/* 搜索按钮 */
QWidget#centralWidget QPushButton#chat-tab-search-btn {
background-color: transparent;
}
QWidget#centralWidget QPushButton#chat-tab-search-btn:hover {
background-color: #999999;
}

/* 收缩按钮 */
QWidget#centralWidget QPushButton#chat-tab-collapse-btn {
background-color: #bababa;
background-color: transparent;
}
QWidget#centralWidget QPushButton#chat-tab-collapse-btn:hover {
background-color: #999999;
Expand Down Expand Up @@ -1391,11 +1399,13 @@ QWidget#centralWidget QWidget#chat-tab-floating-container {

/* 浮球按钮 */
QWidget#centralWidget QPushButton#chat-tab-floating-expand-btn,
QWidget#centralWidget QPushButton#chat-tab-floating-new-btn {
QWidget#centralWidget QPushButton#chat-tab-floating-new-btn,
QWidget#centralWidget QPushButton#chat-tab-floating-search-btn {
background-color: transparent;
}
QWidget#centralWidget QPushButton#chat-tab-floating-expand-btn:hover,
QWidget#centralWidget QPushButton#chat-tab-floating-new-btn:hover {
QWidget#centralWidget QPushButton#chat-tab-floating-new-btn:hover,
QWidget#centralWidget QPushButton#chat-tab-floating-search-btn:hover {
background-color: #999999;
}

Expand Down
16 changes: 13 additions & 3 deletions TeXmacs/misc/themes/liii.css
Original file line number Diff line number Diff line change
Expand Up @@ -1260,9 +1260,17 @@ QLabel#chat-tab-nav-title {
color: #000000;
}

/* 搜索按钮 */
QPushButton#chat-tab-search-btn {
background-color: transparent;
}
QPushButton#chat-tab-search-btn:hover {
background-color: #d0d0d0;
}

/* 收缩按钮 */
QPushButton#chat-tab-collapse-btn {
background-color: #e8e8e8;
background-color: transparent;
}
QPushButton#chat-tab-collapse-btn:hover {
background-color: #d0d0d0;
Expand Down Expand Up @@ -1313,11 +1321,13 @@ QWidget#chat-tab-floating-container {

/* 浮球按钮 */
QPushButton#chat-tab-floating-expand-btn,
QPushButton#chat-tab-floating-new-btn {
QPushButton#chat-tab-floating-new-btn,
QPushButton#chat-tab-floating-search-btn {
background-color: transparent;
}
QPushButton#chat-tab-floating-expand-btn:hover,
QPushButton#chat-tab-floating-new-btn:hover {
QPushButton#chat-tab-floating-new-btn:hover,
QPushButton#chat-tab-floating-search-btn:hover {
background-color: #d0d0d0;
}

Expand Down
54 changes: 54 additions & 0 deletions devel/1040.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# [1040] Chat 侧边栏搜索按钮

## 1 相关文档
- [dddd.md](dddd.md) - 任务文档模板

## 2 任务相关的代码文件
- src/Plugins/Qt/qt_chat_tab_widget.cpp - 搜索按钮创建、浮球搜索按钮、搜索框显隐逻辑
- src/Plugins/Qt/qt_chat_tab_widget.hpp - ChatSidebar::focusSearch()、QTChatTabWidget 成员变量
- TeXmacs/misc/images/llm-chat/search.svg - 搜索图标
- TeXmacs/misc/images/images.qrc - 资源注册
- TeXmacs/misc/themes/liii.css - 亮色主题样式
- TeXmacs/misc/themes/liii-night.css - 暗色主题样式

## 3 如何测试

### 3.1 确定性测试(单元测试)
无单元测试。

### 3.2 非确定性测试(文档验证)
```
xmake b stem
```
手动验证:
1. 打开 Chat Tab,确认侧边栏标题栏折叠按钮左侧出现搜索按钮
2. 点击搜索按钮,搜索框出现并获得焦点
3. 输入文本进行搜索过滤
4. 清空文本后点击其他区域,搜索框自动隐藏
5. 折叠侧边栏,确认浮球区域中间出现搜索按钮
6. 点击浮球搜索按钮,侧边栏展开并聚焦搜索框

## 4 如何提交

提交前执行以下最少步骤:

```bash
xmake b stem
```

## 5 What
在 Chat 侧边栏添加搜索按钮,点击后显示搜索框,支持会话搜索过滤。

1. 侧边栏标题栏折叠按钮左侧添加搜索按钮,大小与折叠按钮一致
2. 折叠后浮球容器中间添加搜索按钮(展开按钮和新建按钮之间)
3. 搜索框改为点击按钮才出现,失焦且内容为空时自动隐藏
4. 添加 search.svg 图标及 CSS 样式(liii / liii-night 两套主题)

## 6 Why
搜索框常驻占用侧边栏纵向空间,改为按钮触发显隐可以节省空间、简化视觉。

## 7 How
- 在 `setup_left_sidebar()` 中折叠按钮前创建搜索按钮,点击调用 `ChatSidebar::focusSearch()`
- 在 `setup_right_content()` 中浮球容器展开按钮后创建搜索按钮,点击先 `toggle_sidebar()` 展开侧边栏,再用 `QTimer::singleShot` 延迟聚焦搜索框
- 搜索框默认 `hide()`,`focusSearch()` 中 `show()` 并聚焦
- 在 `ChatSidebar::eventFilter` 中监听 `FocusOut` 事件,文本为空时隐藏搜索框
46 changes: 45 additions & 1 deletion src/Plugins/Qt/qt_chat_tab_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ constexpr int kFloatingBtnMarginX = 12;
constexpr int kFloatingBtnMarginY = 12;
constexpr int kFloatingContainerPad = 4;
constexpr int kFloatingBtnSpacing = 4;
constexpr int kHeaderBtnSpacing = 4;
constexpr int kNewChatIconSize = 18;
constexpr int kNewChatButtonHeight = 36;
constexpr int kNewChatButtonWidth = 140;
Expand Down Expand Up @@ -448,6 +449,8 @@ ChatSidebar::ChatSidebar (const QList<SessionDisplayInfo>& sessions,
.arg (DpiUtils::scaled (kCollapsePadX)));
connect (searchEdit_, &QLineEdit::textChanged, this,
[this] () { applySearchFilter (); });
searchEdit_->hide ();
searchEdit_->installEventFilter (this);
mainLayout->addWidget (searchEdit_);

// 多选模式批量操作栏(默认隐藏)
Expand Down Expand Up @@ -728,6 +731,15 @@ ChatSidebar::applySearchFilter () {
updateCountLabels ();
}

void
ChatSidebar::focusSearch () {
if (searchEdit_) {
searchEdit_->show ();
searchEdit_->setFocus ();
searchEdit_->selectAll ();
}
}

void
ChatSidebar::updateCountLabels () {
int activeCount = 0;
Expand Down Expand Up @@ -946,7 +958,10 @@ ChatSidebar::activeSessionId () const {

bool
ChatSidebar::eventFilter (QObject* watched, QEvent* event) {
if (event->type () == QEvent::Resize) {
if (watched == searchEdit_ && event->type () == QEvent::FocusOut) {
if (searchEdit_->text ().isEmpty ()) searchEdit_->hide ();
}
else if (event->type () == QEvent::Resize) {
for (auto it= items_.constBegin (); it != items_.constEnd (); ++it) {
if (it->sidebarButton == watched && it->moreButton) {
QRect cr= it->sidebarButton->contentsRect ();
Expand Down Expand Up @@ -1103,6 +1118,25 @@ QTChatTabWidget::setup_left_sidebar (QVBoxLayout* sidebarLayout,

headerLayout->addStretch ();

QPushButton* searchBtn= new QPushButton (headerWidget);
searchBtn->setObjectName ("chat-tab-search-btn");
searchBtn->setFocusPolicy (Qt::NoFocus);
searchBtn->setCursor (Qt::PointingHandCursor);
searchBtn->setIcon (QIcon (":llm-chat/search.svg"));
searchBtn->setIconSize (QSize (DpiUtils::scaled (kToggleIconSize),
DpiUtils::scaled (kToggleIconSize)));
searchBtn->setFixedSize (DpiUtils::scaled (kToggleBtnSize),
DpiUtils::scaled (kToggleBtnSize));
searchBtn->setStyleSheet (
QString ("QPushButton { border: none; border-radius: %1px; }")
.arg (DpiUtils::scaled (kToggleBtnSize / 2)));
connect (searchBtn, &QPushButton::clicked, this,
[this] () { sidebar_->focusSearch (); });
searchButton_= searchBtn;
headerLayout->addWidget (searchBtn);

headerLayout->addSpacing (DpiUtils::scaled (kHeaderBtnSpacing));

QPushButton* collapseBtn= new QPushButton (headerWidget);
collapseBtn->setObjectName ("chat-tab-collapse-btn");
collapseBtn->setFocusPolicy (Qt::NoFocus);
Expand Down Expand Up @@ -1214,6 +1248,16 @@ QTChatTabWidget::setup_right_content (QHBoxLayout* mainLayout) {
floatingLayout->addWidget (floatingBtn);
floatingExpandBtn_= floatingBtn;

QPushButton* floatingSearchBtn=
make_floating_btn (floatingContainer, "chat-tab-floating-search-btn",
":llm-chat/search.svg");
connect (floatingSearchBtn, &QPushButton::clicked, this, [this] () {
toggle_sidebar ();
QTimer::singleShot (0, this, [this] () { sidebar_->focusSearch (); });
});
floatingSearchBtn_= floatingSearchBtn;
floatingLayout->addWidget (floatingSearchBtn);

QPushButton* floatingNewBtn= make_floating_btn (
floatingContainer, "chat-tab-floating-new-btn", ":llm-chat/addchat.svg");
floatingNewChatBtn_= floatingNewBtn;
Expand Down
7 changes: 7 additions & 0 deletions src/Plugins/Qt/qt_chat_tab_widget.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,11 @@ class ChatSidebar : public QWidget {
*/
void applySearchFilter ();

/**
* @brief 聚焦搜索框。
*/
void focusSearch ();

// ---- 其他公共方法 ----

/**
Expand Down Expand Up @@ -333,7 +338,9 @@ class QTChatTabWidget : public QWidget {
QWidget* sidebarWidget_ = nullptr; ///< 侧边栏容器
QWidget* contentWidget_ = nullptr; ///< 右侧内容区容器
QPushButton* collapseButton_ = nullptr; ///< 折叠按钮
QPushButton* searchButton_ = nullptr; ///< 搜索按钮
QPushButton* floatingExpandBtn_ = nullptr; ///< 浮动展开按钮
QPushButton* floatingSearchBtn_ = nullptr; ///< 浮动搜索按钮
QPushButton* floatingNewChatBtn_ = nullptr; ///< 浮动新建按钮
QWidget* floatingBtnContainer_= nullptr; ///< 浮动按钮容器
QPushButton* newChatButton_ = nullptr; ///< 侧边栏新建按钮
Expand Down
Loading