@@ -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