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;