Skip to content

Commit d88fe16

Browse files
committed
fix(dde-dock): add hover opacity effect to quick panel widgets
1. Add QGraphicsOpacityEffect and enterEvent/leaveEvent overrides to brightness, sound, media, and common quick panel widgets 2. Add per-element opacity effects (icon/name/state) to bluetooth, eye-comfort-mode, and wireless-casting quick panel widgets 3. Implement updateOpacity logic: icon follows hover or active state, text always follows hover 4. Set normal opacity to 0.7 and hover opacity to 1.0 for consistent visual feedback 5. Apply the same pattern to JumpSettingButton and PluginItemDelegate for unified dock hover behavior Log: Add hover highlight effect to all dock quick panel widgets for better visual feedback fix(dde-dock): 为所有快捷面板控件添加悬停透明度效果 1. 为亮度、声音、媒体和公共快捷面板控件添加 QGraphicsOpacityEffect 及 enterEvent/leaveEvent 重写 2. 为蓝牙、护眼模式和无线投屏控件添加逐元素(图标/名称/状态)透明度效果 3. 实现 updateOpacity 逻辑:图标跟随悬停或激活状态,文字始终跟随悬停 4. 设置常规透明度为 0.7,悬停透明度为 1.0,实现一致的视觉反馈 5. 对 JumpSettingButton 和 PluginItemDelegate 应用相同模式,统一 Dock 悬停行为 Log: 为所有 Dock 快捷面板控件添加悬停高亮效果,改善视觉反馈 PMS: BUG-314503
1 parent 5f6b140 commit d88fe16

18 files changed

Lines changed: 318 additions & 4 deletions

plugins/dde-dock/bluetooth/quickpanelwidget.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ QuickPanelWidget::QuickPanelWidget(QWidget *parent)
6666
, m_nameLabel(new DLabel(this))
6767
, m_stateLabel(new DLabel(this))
6868
, m_expandLabel(new DIconButton(this))
69+
, m_iconEffect(new QGraphicsOpacityEffect(m_iconWidget))
70+
, m_nameEffect(new QGraphicsOpacityEffect(m_nameLabel))
71+
, m_stateEffect(new QGraphicsOpacityEffect(m_stateLabel))
6972
{
7073
initUi();
7174
initConnection();
@@ -90,7 +93,9 @@ void QuickPanelWidget::setDescription(const QString &description)
9093

9194
void QuickPanelWidget::setActive(bool active)
9295
{
96+
m_active = active;
9397
m_iconWidget->setBackgroundRole(active ? QPalette::Highlight : QPalette::BrightText);
98+
updateOpacity(m_hovered);
9499
}
95100

96101
void QuickPanelWidget::mousePressEvent(QMouseEvent *event)
@@ -128,10 +133,14 @@ void QuickPanelWidget::initUi()
128133
m_nameLabel->setElideMode(Qt::ElideRight);
129134
m_nameLabel->setContentsMargins(0, 2, 0, 0);
130135
m_nameLabel->setForegroundRole(QPalette::BrightText);
136+
m_nameEffect->setOpacity(kNormalOpacity);
137+
m_nameLabel->setGraphicsEffect(m_nameEffect);
131138

132139
DFontSizeManager::instance()->bind(m_stateLabel, DFontSizeManager::T10);
133140
DToolTip::setToolTipShowMode(m_stateLabel, DToolTip::ShowWhenElided);
134141
m_stateLabel->setElideMode(Qt::ElideRight);
142+
m_stateEffect->setOpacity(kNormalOpacity);
143+
m_stateLabel->setGraphicsEffect(m_stateEffect);
135144

136145
QVBoxLayout *layout = new QVBoxLayout(labelWidget);
137146
layout->setContentsMargins(0, 8, 0, 8);
@@ -143,6 +152,8 @@ void QuickPanelWidget::initUi()
143152
m_iconWidget->setEnabledCircle(true);
144153
m_iconWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
145154
m_iconWidget->setIconSize(IconSize);
155+
m_iconEffect->setOpacity(kNormalOpacity);
156+
m_iconWidget->setGraphicsEffect(m_iconEffect);
146157
m_iconWidget->setCheckable(false);
147158
m_iconWidget->setFixedSize(QSize(40, 40));
148159
m_iconWidget->setFocusPolicy(Qt::NoFocus);
@@ -171,3 +182,26 @@ void QuickPanelWidget::initConnection()
171182
{
172183
connect(m_iconWidget, &DFloatingButton::clicked, this, &QuickPanelWidget::iconClicked);
173184
}
185+
186+
void QuickPanelWidget::updateOpacity(bool hover)
187+
{
188+
// icon: when active, always 1.0; otherwise follow hover
189+
m_iconEffect->setOpacity((m_active || hover) ? kHoverOpacity : kNormalOpacity);
190+
// text: always follow hover regardless of active state
191+
m_nameEffect->setOpacity(hover ? kHoverOpacity : kNormalOpacity);
192+
m_stateEffect->setOpacity(hover ? kHoverOpacity : kNormalOpacity);
193+
}
194+
195+
void QuickPanelWidget::enterEvent(QEnterEvent *event)
196+
{
197+
m_hovered = true;
198+
updateOpacity(true);
199+
QWidget::enterEvent(event);
200+
}
201+
202+
void QuickPanelWidget::leaveEvent(QEvent *event)
203+
{
204+
Q_UNUSED(event)
205+
m_hovered = false;
206+
updateOpacity(false);
207+
}

plugins/dde-dock/bluetooth/quickpanelwidget.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#ifndef QUICKPANELWIDGET_H
77
#define QUICKPANELWIDGET_H
88

9+
#include <QGraphicsOpacityEffect>
10+
911
#include <DFloatingButton>
1012
#include <DLabel>
1113

@@ -35,17 +37,28 @@ public Q_SLOTS:
3537
protected:
3638
void mousePressEvent(QMouseEvent *event) override;
3739
void mouseReleaseEvent(QMouseEvent *event) override;
40+
void enterEvent(QEnterEvent *event) override;
41+
void leaveEvent(QEvent *event) override;
3842

3943
private:
4044
void initUi();
4145
void initConnection();
46+
void updateOpacity(bool hover);
4247

4348
private:
49+
static constexpr qreal kNormalOpacity = 0.7;
50+
static constexpr qreal kHoverOpacity = 1.0;
51+
4452
QuickButton *m_iconWidget;
4553
Dtk::Widget::DLabel *m_nameLabel;
4654
Dtk::Widget::DLabel *m_stateLabel;
4755
Dtk::Widget::DIconButton *m_expandLabel;
4856
QPoint m_clickPoint;
57+
bool m_active = false;
58+
bool m_hovered = false;
59+
QGraphicsOpacityEffect *m_iconEffect;
60+
QGraphicsOpacityEffect *m_nameEffect;
61+
QGraphicsOpacityEffect *m_stateEffect;
4962
};
5063

5164
#endif // QUICKPANELWIDGET_H

plugins/dde-dock/brightness/brightnessquickpanel.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,18 @@ BrightnessQuickPanel::BrightnessQuickPanel(QWidget* parent)
2424
: QWidget(parent)
2525
, m_sliderContainer(new SliderContainer(this))
2626
, m_currentMonitor(nullptr)
27+
, m_opacityEffect(new QGraphicsOpacityEffect(this))
2728
{
29+
m_opacityEffect->setOpacity(kNormalOpacity);
30+
setGraphicsEffect(m_opacityEffect);
2831
initUi();
2932
initConnection();
3033

3134
m_sliderContainer->setRange(BrightnessModel::ref().minBrightness(), BrightnessModel::ref().maxBrightness());
3235
UpdateDisplayStatus();
3336
}
3437

38+
3539
BrightnessQuickPanel::~BrightnessQuickPanel()
3640
{
3741
}
@@ -110,3 +114,16 @@ void BrightnessQuickPanel::refreshWidget()
110114
m_sliderContainer->updateSliderValue(m_currentMonitor->brightness() * 100);
111115
}
112116
}
117+
118+
void BrightnessQuickPanel::enterEvent(QEnterEvent *event)
119+
{
120+
m_opacityEffect->setOpacity(kHoverOpacity);
121+
QWidget::enterEvent(event);
122+
}
123+
124+
void BrightnessQuickPanel::leaveEvent(QEvent *event)
125+
{
126+
Q_UNUSED(event)
127+
m_opacityEffect->setOpacity(kNormalOpacity);
128+
}
129+

plugins/dde-dock/brightness/brightnessquickpanel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "monitor.h"
1010

1111
#include <DBlurEffectWidget>
12+
#include <QGraphicsOpacityEffect>
1213
#include <QWidget>
1314
#include <QPointer>
1415

@@ -32,12 +33,18 @@ class BrightnessQuickPanel : public QWidget
3233
protected:
3334
void initUi();
3435
void initConnection();
36+
void enterEvent(QEnterEvent *event) override;
37+
void leaveEvent(QEvent *event) override;
3538

3639
private Q_SLOTS:
3740
void refreshWidget();
3841
void UpdateDisplayStatus();
3942

4043
private:
44+
static constexpr qreal kNormalOpacity = 0.7;
45+
static constexpr qreal kHoverOpacity = 1.0;
46+
4147
SliderContainer *m_sliderContainer;
4248
QPointer<Monitor> m_currentMonitor;
49+
QGraphicsOpacityEffect *m_opacityEffect;
4350
};

plugins/dde-dock/common/jumpsettingbutton.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,24 @@ JumpSettingButton::JumpSettingButton(QWidget *parent)
2222
, m_autoShowPage(true)
2323
, m_iconButton(new CommonIconButton(this))
2424
, m_descriptionLabel(new DLabel(this))
25+
, m_opacityEffect(new QGraphicsOpacityEffect(this))
2526
{
27+
m_opacityEffect->setOpacity(kNormalOpacity);
28+
setGraphicsEffect(m_opacityEffect);
2629
initUI();
2730
}
2831

32+
2933
JumpSettingButton::JumpSettingButton(const QIcon& icon, const QString& description, QWidget* parent)
3034
: QFrame(parent)
3135
, m_hover(false)
3236
, m_autoShowPage(true)
3337
, m_iconButton(new CommonIconButton(this))
3438
, m_descriptionLabel(new DLabel(this))
39+
, m_opacityEffect(new QGraphicsOpacityEffect(this))
3540
{
41+
m_opacityEffect->setOpacity(kNormalOpacity);
42+
setGraphicsEffect(m_opacityEffect);
3643
initUI();
3744

3845
m_iconButton->setIcon(icon);
@@ -143,3 +150,16 @@ void JumpSettingButton::setDccPage(const QString &first, const QString &second)
143150
m_fistPage = first;
144151
m_secondPage = second;
145152
}
153+
154+
void JumpSettingButton::enterEvent(QEnterEvent *event)
155+
{
156+
m_opacityEffect->setOpacity(kHoverOpacity);
157+
QFrame::enterEvent(event);
158+
}
159+
160+
void JumpSettingButton::leaveEvent(QEvent *event)
161+
{
162+
Q_UNUSED(event)
163+
m_opacityEffect->setOpacity(kNormalOpacity);
164+
}
165+

plugins/dde-dock/common/jumpsettingbutton.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "commoniconbutton.h"
99

10+
#include <QGraphicsOpacityEffect>
11+
1012
#include <QFrame>
1113
#include <QLabel>
1214

@@ -33,17 +35,23 @@ class JumpSettingButton : public QFrame
3335
bool event(QEvent* e) override;
3436
void paintEvent(QPaintEvent* e) override;
3537
void mouseReleaseEvent(QMouseEvent* event) override;
38+
void enterEvent(QEnterEvent *event) override;
39+
void leaveEvent(QEvent *event) override;
3640

3741
private:
3842
void initUI();
3943

4044
private:
45+
static constexpr qreal kNormalOpacity = 0.7;
46+
static constexpr qreal kHoverOpacity = 1.0;
47+
4148
bool m_hover;
4249
bool m_autoShowPage;
4350
QString m_fistPage;
4451
QString m_secondPage;
4552
CommonIconButton *m_iconButton;
4653
Dtk::Widget::DLabel *m_descriptionLabel;
54+
QGraphicsOpacityEffect *m_opacityEffect;
4755
};
4856

4957
#endif

plugins/dde-dock/common/pluginitemdelegate.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ PluginItemWidget::PluginItemWidget(PluginStandardItem *item, QWidget *parent)
191191
, m_connBtn(nullptr)
192192
, m_spinner(nullptr)
193193
, m_rightIconSpacerItem(new QSpacerItem(0, 0))
194+
, m_opacityEffect(new QGraphicsOpacityEffect(this))
194195
{
195196
if (!m_item) {
196197
QLabel *err = new QLabel(this);
@@ -242,8 +243,12 @@ PluginItemWidget::PluginItemWidget(PluginStandardItem *item, QWidget *parent)
242243
connect(m_item, &PluginStandardItem::stateChanged, this, &PluginItemWidget::updateState);
243244

244245
connect(m_connBtn, &CommonIconButton::clicked, m_item, &PluginStandardItem::connectBtnClicked);
246+
247+
m_opacityEffect->setOpacity(kNormalOpacity);
248+
setGraphicsEffect(m_opacityEffect);
245249
}
246250

251+
247252
PluginItemWidget::~PluginItemWidget()
248253
{
249254
}
@@ -315,3 +320,16 @@ bool PluginItemWidget::event(QEvent *e)
315320
}
316321
return QWidget::event(e);
317322
}
323+
324+
void PluginItemWidget::enterEvent(QEnterEvent *event)
325+
{
326+
m_opacityEffect->setOpacity(kHoverOpacity);
327+
QWidget::enterEvent(event);
328+
}
329+
330+
void PluginItemWidget::leaveEvent(QEvent *event)
331+
{
332+
Q_UNUSED(event)
333+
m_opacityEffect->setOpacity(kNormalOpacity);
334+
}
335+

plugins/dde-dock/common/pluginitemdelegate.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <DLabel>
1010
#include <DSpinner>
1111

12+
#include <QGraphicsOpacityEffect>
13+
1214
#include <QObject>
1315
#include <QStyledItemDelegate>
1416
#include <QStandardItem>
@@ -116,8 +118,13 @@ public Q_SLOTS:
116118

117119
protected:
118120
bool event(QEvent *e) override;
121+
void enterEvent(QEnterEvent *event) override;
122+
void leaveEvent(QEvent *event) override;
119123

120124
private:
125+
static constexpr qreal kNormalOpacity = 0.7;
126+
static constexpr qreal kHoverOpacity = 1.0;
127+
121128
PluginStandardItem *m_item;
122129

123130
QHBoxLayout *m_mainLayout;
@@ -126,4 +133,5 @@ public Q_SLOTS:
126133
CommonIconButton *m_connBtn;
127134
DSpinner *m_spinner;
128135
QSpacerItem *m_rightIconSpacerItem;
136+
QGraphicsOpacityEffect *m_opacityEffect;
129137
};

plugins/dde-dock/common/singlequickpanel.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ SignalQuickPanel::SignalQuickPanel(QWidget *parent)
2020
, m_icon(new CommonIconButton(this))
2121
, m_description(new DLabel(this))
2222
, m_active(false)
23+
, m_iconEffect(new QGraphicsOpacityEffect(m_icon))
24+
, m_descEffect(new QGraphicsOpacityEffect(m_description))
2325
{
2426
initUI();
2527
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SignalQuickPanel::refreshBg);
@@ -34,10 +36,16 @@ void SignalQuickPanel::initUI()
3436
{
3537
m_icon->setFixedSize(QSize(24, 24));
3638

39+
m_iconEffect->setOpacity(kNormalOpacity);
40+
m_icon->setGraphicsEffect(m_iconEffect);
41+
3742
m_description->setElideMode(Qt::ElideRight);
3843
DToolTip::setToolTipShowMode(m_description, DToolTip::ShowWhenElided);
3944
DFontSizeManager::instance()->bind(m_description, DFontSizeManager::T10);
4045

46+
m_descEffect->setOpacity(kNormalOpacity);
47+
m_description->setGraphicsEffect(m_descEffect);
48+
4149
auto layout = new QVBoxLayout;
4250
layout->setContentsMargins(8, 8, 8, 8);
4351
layout->setSpacing(0);
@@ -68,6 +76,29 @@ void SignalQuickPanel::setWidgetState(WidgetState state)
6876
m_active = (WS_ACTIVE == state);
6977

7078
refreshBg();
79+
updateOpacity(m_hovered);
80+
}
81+
82+
void SignalQuickPanel::updateOpacity(bool hover)
83+
{
84+
// icon: when active, always 1.0; otherwise follow hover
85+
m_iconEffect->setOpacity((m_active || hover) ? kHoverOpacity : kNormalOpacity);
86+
// text: always follow hover regardless of active state
87+
m_descEffect->setOpacity(hover ? kHoverOpacity : kNormalOpacity);
88+
}
89+
90+
void SignalQuickPanel::enterEvent(QEnterEvent *event)
91+
{
92+
m_hovered = true;
93+
updateOpacity(true);
94+
QWidget::enterEvent(event);
95+
}
96+
97+
void SignalQuickPanel::leaveEvent(QEvent *event)
98+
{
99+
Q_UNUSED(event)
100+
m_hovered = false;
101+
updateOpacity(false);
71102
}
72103

73104
void SignalQuickPanel::mouseReleaseEvent(QMouseEvent *event)

0 commit comments

Comments
 (0)