Skip to content

Commit ba23b70

Browse files
committed
feat: add wheel event support for brightness and volume controls
1. Added wheel event handling for brightness slider in BrightnessApplet 2. Implemented wheel event handling for volume control in SoundApplet 3. Installed event filters on relevant slider widgets to capture wheel events 4. Adjusted brightness/volume values in steps of 2% per wheel tick 5. Added necessary QWheelEvent includes The changes allow users to adjust brightness and volume levels using mouse wheel directly on the dock applets, providing a more intuitive and convenient control method. This matches common UX patterns found in other desktop environments. feat: 为亮度和音量控制添加滚轮事件支持 1. 在 BrightnessApplet 中添加亮度滑块的滚轮事件处理 2. 在 SoundApplet 中实现音量控制的滚轮事件处理 3. 在相关滑块部件上安装事件过滤器以捕获滚轮事件 4. 每次滚轮滚动调整亮度/音量2% 5. 添加必要的 QWheelEvent 头文件 这些修改允许用户直接在dock应用上使用鼠标滚轮调整亮度和音量级别,提供了更 直观和方便的控制方式。这与其他桌面环境中常见的用户体验模式相匹配。 Pms: BUG-317615
1 parent 3b974f1 commit ba23b70

3 files changed

Lines changed: 53 additions & 0 deletions

File tree

plugins/dde-dock/brightness/brightnessapplet.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <QScroller>
1212
#include <QVBoxLayout>
13+
#include <QWheelEvent>
1314
#include <DBlurEffectWidget>
1415
#include <DFontSizeManager>
1516

@@ -123,6 +124,10 @@ void BrightnessApplet::addMonitor(Monitor *monitor)
123124
container->updateSliderValue(monitor->brightness() * 100);
124125
container->setProperty(MONITOR_NAME_PROPERTY, monitor->name());
125126
container->slider()->setEnabled(monitor->canBrightness());
127+
128+
// 为滑块安装事件过滤器,以便处理滚轮事件
129+
container->slider()->installEventFilter(this);
130+
126131
m_monitorsLayout->addWidget(container);
127132

128133
connect(&BrightnessModel::ref(), &BrightnessModel::minBrightnessChanged, container, [container] {
@@ -197,3 +202,32 @@ void BrightnessApplet::onContainerChanged(int container)
197202
{
198203
m_titleWidget->setVisible(Dock::APPLET_CONTAINER_QUICK_PANEL != container);
199204
}
205+
206+
bool BrightnessApplet::eventFilter(QObject *watcher, QEvent *event)
207+
{
208+
if (event->type() == QEvent::Wheel) {
209+
// 查找是哪个SliderContainer的slider触发了事件
210+
for (int i = 0; i < m_monitorsLayout->count(); i++) {
211+
auto container = qobject_cast<SliderContainer*>(m_monitorsLayout->itemAt(i)->widget());
212+
if (container && watcher == container->slider()) {
213+
QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
214+
QString monitorName = container->property(MONITOR_NAME_PROPERTY).toString();
215+
const auto &monitor = BrightnessModel::ref().monitor(monitorName);
216+
217+
if (monitor && monitor->canBrightness()) {
218+
int delta = wheelEvent->angleDelta().y() > 0 ? 2 : -2;
219+
int currentValue = container->slider()->value();
220+
int newValue = qBound(container->slider()->minimum(), currentValue + delta, container->slider()->maximum());
221+
222+
container->updateSliderValue(newValue);
223+
BrightnessController::ref().setMonitorBrightness(monitor, (double)newValue / BrightnessModel::ref().maxBrightness());
224+
225+
event->accept();
226+
return true;
227+
}
228+
}
229+
}
230+
}
231+
232+
return QWidget::eventFilter(watcher, event);
233+
}

plugins/dde-dock/brightness/brightnessapplet.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class BrightnessApplet : public QWidget
2929

3030
protected:
3131
void resizeEvent(QResizeEvent *event) override;
32+
bool eventFilter(QObject *watcher, QEvent *event) override;
3233

3334
private:
3435
void initUI();

plugins/dde-dock/sound/soundapplet.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <QListIterator>
1919
#include <QPainter>
2020
#include <QScrollBar>
21+
#include <QWheelEvent>
22+
#include <QApplication>
2123

2224
#define SOUND_OUTPUT_SLIDER "soundOutputSlider"
2325

@@ -85,6 +87,10 @@ void SoundApplet::initUi()
8587
m_listView->setModel(m_itemModel);
8688
m_listView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
8789
m_listView->installEventFilter(this);
90+
91+
// 安装事件过滤器,以便处理滚轮事件
92+
m_sliderContainer->installEventFilter(this);
93+
m_volumeSlider->slider()->installEventFilter(this);
8894

8995
// sound setting button
9096
m_settingButton->setAutoShowPage(true);
@@ -347,6 +353,18 @@ bool SoundApplet::eventFilter(QObject *watcher, QEvent *event)
347353
{
348354
if (event->type() == QEvent::Resize) {
349355
resizeApplet();
356+
} else if (event->type() == QEvent::Wheel && m_volumeSlider->isEnabled()) {
357+
if (watcher == m_sliderContainer || watcher == m_volumeSlider->slider()) {
358+
QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
359+
int delta = wheelEvent->angleDelta().y() > 0 ? 2 : -2;
360+
int currentValue = m_volumeSlider->value();
361+
int newValue = qBound(m_volumeSlider->minimum(), currentValue + delta, m_volumeSlider->maximum());
362+
m_volumeSlider->setValue(newValue);
363+
SoundController::ref().SetVolume(newValue * 0.01, true);
364+
365+
event->accept();
366+
return true;
367+
}
350368
}
351369

352370
return QWidget::eventFilter(watcher, event);

0 commit comments

Comments
 (0)