Skip to content

Commit fa71060

Browse files
committed
feat: 增加侧边面板的滚轮事件处理功能
1 parent f9b14e7 commit fa71060

4 files changed

Lines changed: 66 additions & 10 deletions

File tree

src/app/view/workbench/workbench_page_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <FluentQtWidgets/StyleSheet.h>
1414
#include <FluentQtWidgets/Theme.h>
1515

16+
#include <QtCore/QCoreApplication>
1617
#include <QtCore/QDir>
1718
#include <QtCore/QEvent>
1819
#include <QtCore/QFile>
@@ -31,6 +32,7 @@
3132
#include <QtGui/QTextCharFormat>
3233
#include <QtGui/QTextCursor>
3334
#include <QtGui/QTextOption>
35+
#include <QtGui/QWheelEvent>
3436
#include <QtSerialPort/QSerialPortInfo>
3537
#include <QtWidgets/QAbstractItemView>
3638
#include <QtWidgets/QFileDialog>
@@ -39,6 +41,7 @@
3941
#include <QtWidgets/QLabel>
4042
#include <QtWidgets/QListWidgetItem>
4143
#include <QtWidgets/QPlainTextEdit>
44+
#include <QtWidgets/QScrollBar>
4245
#include <QtWidgets/QSizePolicy>
4346
#include <QtWidgets/QTextEdit>
4447
#include <QtWidgets/QVBoxLayout>

src/app/view/workbench/workbench_page_layout.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ QWidget *WorkbenchPage::createWorkbench()
1010
root->setContentsMargins(0, 0, 0, 0);
1111
root->setSpacing(10);
1212

13-
auto *sideScroll = new ScrollArea(workbench);
14-
sideScroll->setFixedWidth(SidePanelWidth);
15-
sideScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
16-
if (sideScroll->horizontalFluentScrollBar()) {
17-
sideScroll->horizontalFluentScrollBar()->setForceHidden(true);
13+
m_sideScroll = new ScrollArea(workbench);
14+
m_sideScroll->setFixedWidth(SidePanelWidth);
15+
m_sideScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
16+
if (m_sideScroll->horizontalFluentScrollBar()) {
17+
m_sideScroll->horizontalFluentScrollBar()->setForceHidden(true);
1818
}
1919

20-
auto *sidePanel = new QWidget(sideScroll);
21-
auto *sideLayout = new QVBoxLayout(sidePanel);
20+
m_sidePanel = new QWidget(m_sideScroll);
21+
auto *sideLayout = new QVBoxLayout(m_sidePanel);
2222
sideLayout->setContentsMargins(0, 0, 0, 0);
2323
sideLayout->setSpacing(10);
2424
sideLayout->addWidget(createConnectionSection());
@@ -29,8 +29,9 @@ QWidget *WorkbenchPage::createWorkbench()
2929
sideLayout->addWidget(createMacroSection());
3030
sideLayout->addWidget(createFileSendSection());
3131
sideLayout->addStretch(1);
32-
sideScroll->setWidget(sidePanel);
33-
sideScroll->setWidgetResizable(true);
32+
m_sideScroll->setWidget(m_sidePanel);
33+
m_sideScroll->setWidgetResizable(true);
34+
installSidePanelWheelFilters(m_sidePanel);
3435

3536
auto *terminalPanel = new QWidget(workbench);
3637
auto *terminalLayout = new QVBoxLayout(terminalPanel);
@@ -39,11 +40,24 @@ QWidget *WorkbenchPage::createWorkbench()
3940
terminalLayout->addWidget(createTerminalSection(), 1);
4041
terminalLayout->addWidget(createSendSection());
4142

42-
root->addWidget(sideScroll);
43+
root->addWidget(m_sideScroll);
4344
root->addWidget(terminalPanel, 1);
4445
return workbench;
4546
}
4647

48+
void WorkbenchPage::installSidePanelWheelFilters(QWidget *root)
49+
{
50+
if (!root) {
51+
return;
52+
}
53+
54+
root->installEventFilter(this);
55+
const auto widgets = root->findChildren<QWidget *>();
56+
for (QWidget *widget : widgets) {
57+
widget->installEventFilter(this);
58+
}
59+
}
60+
4761
QWidget *WorkbenchPage::createCheckRow(const QStringList &labels, const QList<CheckBox **> &targets, QWidget *parent)
4862
{
4963
auto *rowWidget = new QWidget(parent);

src/app/view/workbench_page.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ WorkbenchPage::~WorkbenchPage()
5353

5454
bool WorkbenchPage::eventFilter(QObject *watched, QEvent *event)
5555
{
56+
if (event->type() == QEvent::Wheel) {
57+
if (forwardSidePanelWheelEvent(watched, static_cast<QWheelEvent *>(event))) {
58+
return true;
59+
}
60+
}
61+
5662
if (watched == m_sendEdit && event->type() == QEvent::KeyPress) {
5763
auto *keyEvent = static_cast<QKeyEvent *>(event);
5864
const bool enterKey = keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter;
@@ -63,3 +69,31 @@ bool WorkbenchPage::eventFilter(QObject *watched, QEvent *event)
6369
}
6470
return AppPage::eventFilter(watched, event);
6571
}
72+
73+
bool WorkbenchPage::forwardSidePanelWheelEvent(QObject *watched, QWheelEvent *event)
74+
{
75+
if (!m_sideScroll || !m_sidePanel || !event) {
76+
return false;
77+
}
78+
79+
auto *widget = qobject_cast<QWidget *>(watched);
80+
if (!widget || (widget != m_sidePanel && !m_sidePanel->isAncestorOf(widget))) {
81+
return false;
82+
}
83+
if (widget == m_sideScroll->viewport()) {
84+
return false;
85+
}
86+
87+
auto *viewport = m_sideScroll->viewport();
88+
if (!viewport) {
89+
return false;
90+
}
91+
92+
const QPointF viewportPosition = viewport->mapFromGlobal(event->globalPosition().toPoint());
93+
QWheelEvent forwarded(viewportPosition, event->globalPosition(), event->pixelDelta(), event->angleDelta(),
94+
event->buttons(), event->modifiers(), event->phase(), event->inverted(), event->source(),
95+
event->pointingDevice());
96+
QCoreApplication::sendEvent(viewport, &forwarded);
97+
event->setAccepted(forwarded.isAccepted());
98+
return forwarded.isAccepted();
99+
}

src/app/view/workbench_page.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
class QEvent;
1616
class QTextCharFormat;
1717
class QTextCursor;
18+
class QWheelEvent;
1819

1920
class WorkbenchPage : public AppPage
2021
{
@@ -46,6 +47,8 @@ class WorkbenchPage : public AppPage
4647
QWidget *createTerminalSection();
4748
QWidget *createSendSection();
4849
QWidget *createCheckRow(const QStringList &labels, const QList<FluentQt::CheckBox **> &targets, QWidget *parent);
50+
void installSidePanelWheelFilters(QWidget *root);
51+
bool forwardSidePanelWheelEvent(QObject *watched, QWheelEvent *event);
4952

5053
enum class RecordDirection
5154
{
@@ -293,6 +296,8 @@ class WorkbenchPage : public AppPage
293296
bool m_macroRunning = false;
294297
bool m_macroWaitingForResponse = false;
295298

299+
FluentQt::ScrollArea *m_sideScroll = nullptr;
300+
QWidget *m_sidePanel = nullptr;
296301
FluentQt::ComboBox *m_portCombo = nullptr;
297302
FluentQt::EditableComboBox *m_baudCombo = nullptr;
298303
FluentQt::ComboBox *m_dataBitsCombo = nullptr;

0 commit comments

Comments
 (0)