From fcb22d8dddfe690c80b94846f5488b6321ac3d56 Mon Sep 17 00:00:00 2001 From: Wu JiangYu Date: Thu, 15 Oct 2026 14:12:39 +0800 Subject: [PATCH] feat: add dock spotlight cursor tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add containsMouse and cursorPosition Q_PROPERTY bindings to DockPanel 2. Implement eventFilter logic to track Enter, MouseMove, Leave and Hide events on the dock window without per-item handlers 3. Cache spotlight tracking state via syncSpotlightTracking to avoid settings queries on the hot event path 4. Create DockSpotlight.qml component rendering a two-layer radial gradient spotlight following the cursor 5. Add SpotlightGradient.png texture asset shared by both layers 6. Wire the spotlight into main.qml with a Loader gated on fashion mode and dock visibility 7. Add mouse event derived includes (QEnterEvent, QMouseEvent) and position clamping to keep the spotlight inside the window bounds Log: Added a cursor-following spotlight effect on the dock in fashion mode Influence: 1. Verify the spotlight appears when moving the cursor over the dock in fashion mode 2. Verify the spotlight disappears when the dock is hidden or when the cursor leaves the dock area 3. Test theme switching between light and dark mode to confirm spotlight opacity values change correctly 4. Verify the spotlight does not appear in non-fashion (efficient) mode 5. Test with dock resizing and different dock positions/screen edges 6. Verify the spotlight tracks the cursor smoothly when a control keeps its mouse grab after the pointer leaves the window 7. Confirm no regression in existing dock click, drag and context menu interactions feat: 添加任务栏聚光灯光标跟踪 1. 在 DockPanel 中新增 containsMouse 和 cursorPosition 属性绑定 2. 在 eventFilter 中处理 Enter、MouseMove、Leave 和 Hide 事件, 无需逐项事件处理器即可跟踪光标 3. 通过 syncSpotlightTracking 缓存聚光灯跟踪状态,避免在热路径上 查询设置 4. 新建 DockSpotlight.qml 组件,渲染跟随光标的两层径向渐变聚光灯 5. 添加 SpotlightGradient.png 贴图供两层图像共享 6. 在 main.qml 中通过 Loader 接入聚光灯,并根据时尚模式和任务栏 可见性进行条件加载 7. 添加 QEnterEvent、QMouseEvent 头文件,并对坐标进行边界钳制, 确保聚光灯始终位于窗口范围内 Log: 新增时尚模式下任务栏跟随光标的聚光灯效果 Influence: 1. 验证在时尚模式下将光标移动到任务栏上时聚光灯正常显示 2. 验证任务栏隐藏或光标移出任务栏区域时聚光灯消失 3. 测试浅色与深色主题切换,确认聚光灯透明度随之变化 4. 验证在非时尚(高效)模式下聚光灯不显示 5. 测试任务栏尺寸调整及不同位置/屏幕边缘的情况 6. 验证当控件在指针离开窗口后仍保持鼠标抓取时聚光灯仍能平滑跟踪 7. 确认现有任务栏点击、拖拽和右键菜单交互无回归问题 PMS: task-396639 --- panels/dock/dockpanel.cpp | 57 +++++++++++++++++++++- panels/dock/dockpanel.h | 15 ++++++ panels/dock/package/DockSpotlight.qml | 55 +++++++++++++++++++++ panels/dock/package/SpotlightGradient.png | Bin 0 -> 8894 bytes panels/dock/package/main.qml | 11 +++++ 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 panels/dock/package/DockSpotlight.qml create mode 100644 panels/dock/package/SpotlightGradient.png diff --git a/panels/dock/dockpanel.cpp b/panels/dock/dockpanel.cpp index 0fb95980a..0651cb5ad 100644 --- a/panels/dock/dockpanel.cpp +++ b/panels/dock/dockpanel.cpp @@ -17,8 +17,10 @@ #include "dockdaemonadaptor.h" #include +#include #include #include +#include #include #include #include @@ -45,6 +47,10 @@ DockPanel::DockPanel(QObject *parent) , m_contextDragging(false) , m_isResizing(false) { + connect(this, &DockPanel::fashionModeChanged, this, &DockPanel::syncSpotlightTracking); + connect(this, &DockPanel::hideStateChanged, this, &DockPanel::syncSpotlightTracking); + connect(this, &DockPanel::rootObjectChanged, this, &DockPanel::syncSpotlightTracking); + // The org.deepin.dde.Dock1 service name is used as the readiness flag of the // Type=dbus systemd unit (dde-shell@DDE.service). It must only be acquired // after the QML DockCompositor is created, so that tray plugin loader @@ -546,13 +552,62 @@ qreal DockPanel::devicePixelRatio() const bool DockPanel::eventFilter(QObject *watched, QEvent *event) { - if (watched == window() && event->type() == QEvent::DevicePixelRatioChange) { + if (watched != window()) + return false; + + if (event->type() == QEvent::DevicePixelRatioChange) { Q_EMIT devicePixelRatioChanged(window()->devicePixelRatio()); + } else if (m_spotlightTracking) { + // Observe the window before delivery to Qt Quick controls. No + // per-item handlers, coordinate reports or periodic cursor queries. + switch (event->type()) { + case QEvent::Enter: + setCursorPosition(static_cast(event)->position()); + setContainsMouse(true); + break; + case QEvent::MouseMove: { + const auto position = static_cast(event)->position(); + setCursorPosition(position); + // A pressed control may keep its grab after the pointer leaves. + setContainsMouse(QRectF(QPointF(), window()->size()).contains(position)); + break; + } + case QEvent::Leave: + case QEvent::Hide: + setContainsMouse(false); + break; + default: + break; + } } return false; } +void DockPanel::syncSpotlightTracking() +{ + // Cache the mode so the hot event path never needs to query settings. + m_spotlightTracking = fashionMode() && hideState() == Show; + if (!m_spotlightTracking) + setContainsMouse(false); +} + +void DockPanel::setContainsMouse(bool containsMouse) +{ + if (m_containsMouse == containsMouse) + return; + m_containsMouse = containsMouse; + Q_EMIT containsMouseChanged(containsMouse); +} + +void DockPanel::setCursorPosition(const QPointF &cursorPosition) +{ + if (m_cursorPosition == cursorPosition) + return; + m_cursorPosition = cursorPosition; + Q_EMIT cursorPositionChanged(cursorPosition); +} + bool DockPanel::contextDragging() const { return m_contextDragging; diff --git a/panels/dock/dockpanel.h b/panels/dock/dockpanel.h index a7551639e..9b753253c 100644 --- a/panels/dock/dockpanel.h +++ b/panels/dock/dockpanel.h @@ -10,6 +10,7 @@ #include #include +#include namespace dock { class DockHelper; @@ -44,6 +45,8 @@ class DockPanel : public DS_NAMESPACE::DPanel, public QDBusContext Q_PROPERTY(bool debugMode READ debugMode FINAL CONSTANT) Q_PROPERTY(bool contextDragging READ contextDragging WRITE setContextDragging NOTIFY contextDraggingChanged FINAL) + Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged FINAL) + Q_PROPERTY(QPointF cursorPosition READ cursorPosition NOTIFY cursorPositionChanged FINAL) public: explicit DockPanel(QObject *parent = nullptr); @@ -119,6 +122,9 @@ class DockPanel : public DS_NAMESPACE::DPanel, public QDBusContext bool contextDragging() const; void setContextDragging(bool newContextDragging); + bool containsMouse() const { return m_containsMouse; } + QPointF cursorPosition() const { return m_cursorPosition; } + bool isResizing() const; void setIsResizing(bool resizing); @@ -129,6 +135,7 @@ private Q_SLOTS: void onWindowGeometryChanged(); void launcherVisibleChanged(bool visible); void updateDockScreen(); + void syncSpotlightTracking(); Q_SIGNALS: void geometryChanged(QRect geometry); @@ -156,12 +163,20 @@ private Q_SLOTS: void fashionModeEnabledChanged(bool enabled); void contextDraggingChanged(); + void containsMouseChanged(bool containsMouse); + void cursorPositionChanged(const QPointF &cursorPosition); void isResizingChanged(bool isResizing); // Emitted when async XEmbed window move completes void xembedWindowMoveResult(uint32_t wid, bool success); private: + void setContainsMouse(bool containsMouse); + void setCursorPosition(const QPointF &cursorPosition); + + bool m_spotlightTracking = false; + bool m_containsMouse = false; + QPointF m_cursorPosition; ColorTheme m_theme; HideState m_hideState; DockHelper* m_helper; diff --git a/panels/dock/package/DockSpotlight.qml b/panels/dock/package/DockSpotlight.qml new file mode 100644 index 000000000..c87317763 --- /dev/null +++ b/panels/dock/package/DockSpotlight.qml @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick + +Item { + id: spotlight + property bool containsMouse: false + property point cursorPosition: Qt.point(0, 0) + property real itemSize: 48 + property bool darkTheme: false + readonly property real baseRadius: Math.max(0, Math.min(itemSize * 3.0, height * 3.0, width * 0.18)) + readonly property real coreRadius: baseRadius * 0.35 + + clip: true + enabled: false + visible: opacity > 0 + opacity: containsMouse ? 1 : 0 + + Behavior on opacity { + NumberAnimation { duration: 90; easing.type: Easing.OutQuad } + } + + // Move a single transform instead of evaluating both images' coordinates + // on every pointer event. Both layers share the same cached 256px texture. + Item { + x: Math.max(0, Math.min(spotlight.cursorPosition.x, spotlight.width)) + y: Math.max(0, Math.min(spotlight.cursorPosition.y, spotlight.height)) + + Image { + objectName: "spotlightImage" + width: spotlight.baseRadius * 2 + height: spotlight.baseRadius * 2.6 + x: -width / 2 + y: -height / 2 + source: "SpotlightGradient.png" + fillMode: Image.Stretch + smooth: true + opacity: spotlight.darkTheme ? 0.14 : 0.2 + } + + Image { + objectName: "spotlightCoreImage" + width: spotlight.coreRadius * 2 + height: width + x: -width / 2 + y: -height / 2 + source: "SpotlightGradient.png" + fillMode: Image.Stretch + smooth: true + opacity: spotlight.darkTheme ? 0.23 : 0.32 + } + } +} diff --git a/panels/dock/package/SpotlightGradient.png b/panels/dock/package/SpotlightGradient.png new file mode 100644 index 0000000000000000000000000000000000000000..07bf94ea8cf4d4f62977f7b55b09091b9f8d195e GIT binary patch literal 8894 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 literal 0 HcmV?d00001 diff --git a/panels/dock/package/main.qml b/panels/dock/package/main.qml index 95afad169..56f5227af 100644 --- a/panels/dock/package/main.qml +++ b/panels/dock/package/main.qml @@ -499,6 +499,17 @@ Window { } } + Loader { + anchors.fill: parent + active: dock.fashionDock.enabled && Panel.hideState === Dock.Show + sourceComponent: DockSpotlight { + containsMouse: Panel.containsMouse + cursorPosition: dockContainer.mapFromItem(null, Panel.cursorPosition) + itemSize: dock.dockItemMaxSize + darkTheme: Panel.colorTheme === Dock.Dark + } + } + TapHandler { acceptedButtons: Qt.LeftButton | Qt.RightButton gesturePolicy: TapHandler.WithinBounds