From a824da9a7c6213c52ed1df4ecb4f303b601363a9 Mon Sep 17 00:00:00 2001 From: Fangxun Zhao Date: Mon, 22 Jun 2026 15:56:29 +0800 Subject: [PATCH] fix(plugin-item): adjust opacity and hover animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added QGraphicsOpacityEffect with default 0.7 opacity to PluginItemWidget and PluginItem 2. Added hover animation that transitions opacity from 0.7 to 1.0 on mouse enter 3. Added leave animation that transitions opacity back to 0.7 on mouse leave 4. Exported animation constants (opacity values, duration) as public static members Log: Adjust icon/text opacity and add hover animation for quick panel plugin items fix(plugin-item): 调整透明度与悬停动画 1. 为 PluginItemWidget 和 PluginItem 添加 QGraphicsOpacityEffect,默认透明度 0.7 2. 添加悬停动画:鼠标进入时透明度从 0.7 过渡到 1.0 3. 添加离开动画:鼠标离开时透明度恢复为 0.7 4. 将动画常量(透明度值、持续时间)导出为公共静态成员 Log: 调整快捷面板插件项的图标文字透明度并添加悬停动画效果 PMS: BUG-314503 --- .../dde-dock/common/pluginitemdelegate.cpp | 23 +++++++++++++++++++ plugins/dde-dock/common/pluginitemdelegate.h | 12 +++++++++- src/loader/pluginitem.cpp | 15 ++++++++++++ src/loader/pluginitem.h | 12 ++++++++-- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/plugins/dde-dock/common/pluginitemdelegate.cpp b/plugins/dde-dock/common/pluginitemdelegate.cpp index d1ec91338..08ac34143 100644 --- a/plugins/dde-dock/common/pluginitemdelegate.cpp +++ b/plugins/dde-dock/common/pluginitemdelegate.cpp @@ -192,6 +192,14 @@ PluginItemWidget::PluginItemWidget(PluginStandardItem *item, QWidget *parent) , m_spinner(nullptr) , m_rightIconSpacerItem(new QSpacerItem(0, 0)) { + m_opacityEffect = new QGraphicsOpacityEffect(this); + m_opacityEffect->setOpacity(kNormalOpacity); + setGraphicsEffect(m_opacityEffect); + + m_opacityAnim = new QPropertyAnimation(m_opacityEffect, "opacity", this); + m_opacityAnim->setDuration(kOpacityAnimDuration); + m_opacityAnim->setEasingCurve(QEasingCurve::OutCubic); + if (!m_item) { QLabel *err = new QLabel(this); err->setText("Unknown Item"); @@ -298,9 +306,24 @@ void PluginItemWidget::updateState(const PluginItemState state) m_mainLayout->invalidate(); } +void PluginItemWidget::startHoverAnim() +{ + m_opacityAnim->stop(); + m_opacityAnim->setEndValue(kHoverOpacity); + m_opacityAnim->start(); +} + bool PluginItemWidget::event(QEvent *e) { switch (e->type()) { + case QEvent::Enter: + startHoverAnim(); + break; + case QEvent::Leave: + m_opacityAnim->stop(); + m_opacityAnim->setEndValue(kNormalOpacity); + m_opacityAnim->start(); + break; case QEvent::PaletteChange: { QLayout *layout = this->layout(); for (int i = 0; i < layout->count(); i++) { diff --git a/plugins/dde-dock/common/pluginitemdelegate.h b/plugins/dde-dock/common/pluginitemdelegate.h index 51ec03bcf..d27dffb5f 100644 --- a/plugins/dde-dock/common/pluginitemdelegate.h +++ b/plugins/dde-dock/common/pluginitemdelegate.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2016 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -6,6 +6,8 @@ #include "commoniconbutton.h" +#include +#include #include #include @@ -118,6 +120,14 @@ public Q_SLOTS: bool event(QEvent *e) override; private: + void startHoverAnim(); + + QGraphicsOpacityEffect *m_opacityEffect; + QPropertyAnimation *m_opacityAnim; + static constexpr qreal kNormalOpacity = 0.7; + static constexpr qreal kHoverOpacity = 1.0; + static constexpr int kOpacityAnimDuration = 150; + PluginStandardItem *m_item; QHBoxLayout *m_mainLayout; diff --git a/src/loader/pluginitem.cpp b/src/loader/pluginitem.cpp index 7514ce59a..78273cdf2 100644 --- a/src/loader/pluginitem.cpp +++ b/src/loader/pluginitem.cpp @@ -30,6 +30,13 @@ PluginItem::PluginItem(PluginsItemInterface *pluginItemInterface, const QString m_tooltipTimer->setSingleShot(true); m_tooltipTimer->setInterval(200); + m_opacityEffect = new QGraphicsOpacityEffect(this); + m_opacityEffect->setOpacity(kNormalOpacity); + setGraphicsEffect(m_opacityEffect); + + m_opacityAnim = new QPropertyAnimation(m_opacityEffect, "opacity", this); + m_opacityAnim->setDuration(kOpacityAnimDuration); + m_opacityAnim->setEasingCurve(QEasingCurve::OutCubic); if (m_dbusProxy.isNull()) m_dbusProxy.reset(new DockDBusProxy); @@ -176,6 +183,10 @@ void PluginItem::mouseReleaseEvent(QMouseEvent *e) void PluginItem::enterEvent(QEnterEvent *event) { + m_opacityAnim->stop(); + m_opacityAnim->setEndValue(kHoverOpacity); + m_opacityAnim->start(); + // panel popup existed, not show tooltip if (panelPopupExisted()) { return QWidget::enterEvent(event); @@ -218,6 +229,10 @@ void PluginItem::leaveEvent(QEvent *event) { Q_UNUSED(event) closeToolTip(); + + m_opacityAnim->stop(); + m_opacityAnim->setEndValue(kNormalOpacity); + m_opacityAnim->start(); } // TODO: The reason we add this is because on openSUSE we can see render residue for those diff --git a/src/loader/pluginitem.h b/src/loader/pluginitem.h index 38b1339f0..346cfbede 100644 --- a/src/loader/pluginitem.h +++ b/src/loader/pluginitem.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -8,6 +8,8 @@ #include "pluginsiteminterface_v2.h" #include "dockdbusproxy.h" +#include +#include #include const int Attribute_ForceUnDock = 0x800000; @@ -73,10 +75,16 @@ class PluginItem : public QWidget QMenu *m_menu; QScopedPointer m_dbusProxy; +public: + static constexpr qreal kNormalOpacity = 0.7; + static constexpr qreal kHoverOpacity = 1.0; + static constexpr int kOpacityAnimDuration = 150; + private: QTimer* m_tooltipTimer; QPointer m_tipsWidget; - + QGraphicsOpacityEffect *m_opacityEffect; + QPropertyAnimation *m_opacityAnim; QAction *m_unDockAction = nullptr; int m_pluginFlags = 0; int m_spacing = 0;