Skip to content

Commit 68b2966

Browse files
committed
feat: 重构终端搜索功能,优化界面和交互体验
- 移除了旧的工具按钮,添加了新的搜索、主题和设置按钮。 - 引入了搜索面板,包含搜索框、匹配按钮和选项设置。 - 改进了搜索功能的布局和样式,增强用户体验。
1 parent 267d62b commit 68b2966

1 file changed

Lines changed: 52 additions & 23 deletions

File tree

src/app/view/workbench/workbench_page_terminal_sections.cpp

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ QWidget *WorkbenchPage::createTerminalSection()
1111
section->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1212

1313
section->headerLayout()->addStretch(1);
14-
auto *themeButton = new TransparentToolButton(icon(FluentIcon::Constract), section);
15-
themeButton->setToolTip(QStringLiteral("切换主题"));
16-
auto *settingsButton = new TransparentToolButton(icon(FluentIcon::Setting), section);
17-
settingsButton->setToolTip(QStringLiteral("设置"));
18-
section->headerLayout()->addWidget(themeButton);
19-
section->headerLayout()->addWidget(settingsButton);
2014
section->headerLayout()->addWidget(new BodyLabel(QStringLiteral("RX"), section));
2115
m_rxCounterLabel = new StrongBodyLabel(QStringLiteral("0 B"), section);
2216
section->headerLayout()->addWidget(m_rxCounterLabel);
@@ -32,49 +26,77 @@ QWidget *WorkbenchPage::createTerminalSection()
3226
m_connectionTimeLabel = new CaptionLabel(QStringLiteral("未连接"), section);
3327
section->headerLayout()->addWidget(m_connectionTimeLabel);
3428

35-
auto *toolsRow = new QHBoxLayout;
36-
toolsRow->setSpacing(8);
37-
m_terminalSearchEdit = new SearchLineEdit(section);
29+
auto *searchButton = new TransparentToolButton(icon(FluentIcon::Search), section);
30+
searchButton->setToolTip(QStringLiteral("搜索"));
31+
auto *themeButton = new TransparentToolButton(icon(FluentIcon::Constract), section);
32+
themeButton->setToolTip(QStringLiteral("切换主题"));
33+
auto *settingsButton = new TransparentToolButton(icon(FluentIcon::Setting), section);
34+
settingsButton->setToolTip(QStringLiteral("设置"));
35+
for (ToolButton *button : {searchButton, themeButton, settingsButton}) {
36+
button->setFixedSize(CompactControlHeight, CompactControlHeight);
37+
button->setIconSize(QSize(16, 16));
38+
}
39+
section->headerLayout()->addSpacing(4);
40+
section->headerLayout()->addWidget(searchButton);
41+
section->headerLayout()->addWidget(themeButton);
42+
section->headerLayout()->addWidget(settingsButton);
43+
44+
auto *searchView = new FlyoutView(QStringLiteral("终端搜索"), QString(), icon(FluentIcon::Search), QPixmap(), true);
45+
auto *searchPanel = new QWidget(searchView);
46+
searchPanel->setFixedWidth(420);
47+
auto *searchLayout = new QVBoxLayout(searchPanel);
48+
searchLayout->setContentsMargins(0, 0, 0, 0);
49+
searchLayout->setSpacing(10);
50+
51+
auto *searchRow = new QHBoxLayout;
52+
searchRow->setSpacing(8);
53+
m_terminalSearchEdit = new SearchLineEdit(searchPanel);
3854
m_terminalSearchEdit->setPlaceholderText(QStringLiteral("搜索终端内容"));
3955
m_terminalSearchEdit->setClearButtonEnabled(true);
4056
m_terminalSearchEdit->setFixedHeight(CompactControlHeight);
4157
m_terminalSearchEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
42-
m_terminalSearchPrevButton = new TransparentToolButton(icon(FluentIcon::Up), section);
58+
m_terminalSearchPrevButton = new TransparentToolButton(icon(FluentIcon::Up), searchPanel);
4359
m_terminalSearchPrevButton->setToolTip(QStringLiteral("上一个匹配"));
44-
m_terminalSearchNextButton = new TransparentToolButton(icon(FluentIcon::Down), section);
60+
m_terminalSearchNextButton = new TransparentToolButton(icon(FluentIcon::Down), searchPanel);
4561
m_terminalSearchNextButton->setToolTip(QStringLiteral("下一个匹配"));
4662
for (ToolButton *button : {m_terminalSearchPrevButton, m_terminalSearchNextButton}) {
4763
button->setEnabled(false);
4864
button->setFixedSize(CompactControlHeight, CompactControlHeight);
4965
button->setIconSize(QSize(16, 16));
5066
}
51-
m_terminalSearchCaseCheck = new CheckBox(QStringLiteral("Aa"), section);
67+
searchRow->addWidget(m_terminalSearchEdit, 1);
68+
searchRow->addWidget(m_terminalSearchPrevButton);
69+
searchRow->addWidget(m_terminalSearchNextButton);
70+
searchLayout->addLayout(searchRow);
71+
72+
auto *searchOptionsRow = new QHBoxLayout;
73+
searchOptionsRow->setSpacing(8);
74+
m_terminalSearchCaseCheck = new CheckBox(QStringLiteral("Aa"), searchPanel);
5275
m_terminalSearchCaseCheck->setToolTip(QStringLiteral("大小写敏感"));
5376
m_terminalSearchCaseCheck->setFixedHeight(CompactControlHeight);
5477
setFixedControlWidth(m_terminalSearchCaseCheck, 54);
55-
m_terminalSearchRegexCheck = new CheckBox(QStringLiteral(".*"), section);
78+
m_terminalSearchRegexCheck = new CheckBox(QStringLiteral(".*"), searchPanel);
5679
m_terminalSearchRegexCheck->setToolTip(QStringLiteral("正则搜索"));
5780
m_terminalSearchRegexCheck->setFixedHeight(CompactControlHeight);
5881
setFixedControlWidth(m_terminalSearchRegexCheck, 54);
59-
m_terminalFilterCombo = new ComboBox(section);
82+
m_terminalFilterCombo = new ComboBox(searchPanel);
6083
m_terminalFilterCombo->addItem(QStringLiteral("全部"), QIcon(), QStringLiteral("all"));
6184
m_terminalFilterCombo->addItem(QStringLiteral("仅接收"), QIcon(), QStringLiteral("rx"));
6285
m_terminalFilterCombo->addItem(QStringLiteral("仅发送"), QIcon(), QStringLiteral("tx"));
6386
m_terminalFilterCombo->setFixedHeight(CompactControlHeight);
6487
setFixedControlWidth(m_terminalFilterCombo, 104);
65-
m_terminalSummaryLabel = new CaptionLabel(QStringLiteral("显示 0 条"), section);
88+
m_terminalSummaryLabel = new CaptionLabel(QStringLiteral("显示 0 条"), searchPanel);
6689
m_terminalSummaryLabel->setTextColor(QColor(96, 96, 96), QColor(180, 180, 180));
6790
m_terminalSummaryLabel->setFixedHeight(CompactControlHeight);
6891
m_terminalSummaryLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
6992
setFixedControlWidth(m_terminalSummaryLabel, 148);
70-
toolsRow->addWidget(m_terminalSearchEdit, 1);
71-
toolsRow->addWidget(m_terminalSearchPrevButton);
72-
toolsRow->addWidget(m_terminalSearchNextButton);
73-
toolsRow->addWidget(m_terminalSearchCaseCheck);
74-
toolsRow->addWidget(m_terminalSearchRegexCheck);
75-
toolsRow->addWidget(m_terminalFilterCombo);
76-
toolsRow->addWidget(m_terminalSummaryLabel);
77-
root->addLayout(toolsRow);
93+
searchOptionsRow->addWidget(m_terminalSearchCaseCheck);
94+
searchOptionsRow->addWidget(m_terminalSearchRegexCheck);
95+
searchOptionsRow->addWidget(m_terminalFilterCombo);
96+
searchOptionsRow->addWidget(m_terminalSummaryLabel, 1);
97+
searchLayout->addLayout(searchOptionsRow);
98+
searchView->addWidget(searchPanel);
99+
auto *searchFlyout = Flyout::make(searchView, nullptr, section, FlyoutAnimationType::DropDown, false);
78100

79101
m_terminalView = new TextBrowser(section);
80102
m_terminalView->setReadOnly(true);
@@ -87,6 +109,13 @@ QWidget *WorkbenchPage::createTerminalSection()
87109

88110
root->addWidget(m_terminalView, 1);
89111

112+
connect(searchButton, &TransparentToolButton::clicked, this, [this, searchButton, searchFlyout]() {
113+
searchFlyout->exec(searchButton);
114+
if (m_terminalSearchEdit) {
115+
m_terminalSearchEdit->setFocus(Qt::PopupFocusReason);
116+
m_terminalSearchEdit->selectAll();
117+
}
118+
});
90119
connect(themeButton, &TransparentToolButton::clicked, this, []() {
91120
const Theme current = ThemeManager::instance()->effectiveTheme();
92121
const Theme next = current == Theme::Dark ? Theme::Light : Theme::Dark;

0 commit comments

Comments
 (0)