fix: add touch screen support for dock menu#1510
fix: add touch screen support for dock menu#151018202781743 merged 1 commit intolinuxdeepin:masterfrom
Conversation
1. Added a new function requestShowDockMenu() to centralize dock menu display logic 2. Implemented TapHandler for touch screen devices to handle both tap and long press gestures 3. Tap gesture now closes popups and deactivates view without opening menu 4. Long press gesture triggers the dock menu (same as right-click on mouse) 5. Refactored existing mouse click handler to use the new requestShowDockMenu() function Log: Touch screen users can now open dock menu via long press gesture Influence: 1. Test touch screen interaction with dock panel - verify tap closes popups 2. Verify long press on touch screen opens dock menu correctly 3. Test mouse right-click still works as before to open dock menu 4. Verify mouse left-click behavior remains unchanged 5. Test that popups close properly on both touch tap and mouse click 6. Verify dock menu doesn't open unintentionally on regular taps fix: 为任务栏菜单添加触摸屏支持 1. 新增 requestShowDockMenu() 函数集中处理任务栏菜单显示逻辑 2. 为触摸屏设备实现 TapHandler 以处理点击和长按手势 3. 点击手势现在会关闭弹窗并停用视图而不打开菜单 4. 长按手势触发任务栏菜单(与鼠标右键点击相同) 5. 重构现有的鼠标点击处理程序以使用新的 requestShowDockMenu() 函数 Log: 触摸屏用户现在可以通过长按手势打开任务栏菜单 Influence: 1. 测试触摸屏与任务栏面板的交互 - 验证点击会关闭弹窗 2. 验证触摸屏长按能正确打开任务栏菜单 3. 测试鼠标右键点击仍然可以正常打开任务栏菜单 4. 验证鼠标左键点击行为保持不变 5. 测试弹窗在触摸点击和鼠标点击时都能正确关闭 6. 验证任务栏菜单不会在常规点击时意外打开 PMS: BUG-352989
Reviewer's GuideAdds touch-screen support for opening dock and app item menus by centralizing dock menu display logic and introducing touch/gesture handlers, while keeping existing mouse behavior intact. Sequence diagram for dock menu mouse and touch interactionssequenceDiagram
actor User
participant DockWindow
participant MouseArea
participant TapHandler
participant Panel
participant MenuHelper
participant DockMenuLoader
participant HideTimer
rect rgb(230,230,255)
User->>MouseArea: Mouse right-click
MouseArea->>MenuHelper: closeCurrent()
MouseArea->>DockMenuLoader: active = true
alt button is Qt.RightButton and lastActive != dockMenuLoader.item
MouseArea->>DockWindow: requestShowDockMenu()
DockWindow->>Panel: requestClosePopup()
DockWindow->>DockWindow: viewDeactivated()
DockWindow->>HideTimer: stop()
DockWindow->>MenuHelper: openMenu(dockMenuLoader.item)
end
end
rect rgb(230,255,230)
User->>TapHandler: Tap (touch)
TapHandler->>MenuHelper: closeCurrent()
TapHandler->>DockMenuLoader: active = true
TapHandler->>Panel: requestClosePopup()
TapHandler->>DockWindow: viewDeactivated()
note over DockWindow,MenuHelper: Tap closes popups and deactivates view, does not open dock menu
end
rect rgb(255,230,230)
User->>TapHandler: Long press (touch)
TapHandler->>MenuHelper: closeCurrent()
TapHandler->>DockMenuLoader: active = true
alt lastActive != dockMenuLoader.item
TapHandler->>DockWindow: requestShowDockMenu()
DockWindow->>Panel: requestClosePopup()
DockWindow->>DockWindow: viewDeactivated()
DockWindow->>HideTimer: stop()
DockWindow->>MenuHelper: openMenu(dockMenuLoader.item)
end
end
Updated class diagram for dock and app item menu helpersclassDiagram
class DockWindow {
+requestShowDockMenu()
}
class TapHandlerDock {
+onTapped(eventPoint, button)
+onLongPressed()
}
class MouseAreaDock {
+onClicked(mouse)
}
class AppItem {
+requestAppItemMenu()
}
class MouseAreaAppItem {
+onPressAndHold(mouse)
+onClicked(mouse)
}
class Panel {
+requestClosePopup()
}
class MenuHelper {
+closeCurrent()
+openMenu(menuItem)
+activeMenu
}
class DockMenuLoader {
+active
+item
}
class ContextMenuLoader {
+trashEmpty
+active
+item
}
DockWindow --> Panel : uses
DockWindow --> MenuHelper : uses
DockWindow --> DockMenuLoader : uses
DockWindow --> TapHandlerDock : contains
DockWindow --> MouseAreaDock : contains
TapHandlerDock --> Panel : uses
TapHandlerDock --> MenuHelper : uses
TapHandlerDock --> DockMenuLoader : uses
MouseAreaDock --> MenuHelper : uses
MouseAreaDock --> DockMenuLoader : uses
MouseAreaDock --> DockWindow : calls requestShowDockMenu
AppItem --> ContextMenuLoader : uses
AppItem --> MenuHelper : uses
MouseAreaAppItem --> AppItem : calls requestAppItemMenu
MouseAreaAppItem --> ContextMenuLoader : uses
MouseAreaAppItem --> MenuHelper : uses
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
deepin pr auto review这段代码主要实现了 Dock(任务栏)和 AppItem(应用图标)在鼠标右键点击和触摸屏长按时的菜单显示逻辑,以及触摸屏点击时的行为。以下是对这段代码的详细审查和改进建议: 1. 语法逻辑1.1
|
There was a problem hiding this comment.
Hey - I've found 1 issue, and left some high level feedback:
- In both the TapHandler.onTapped handler and the long-press handler you introduce a local
lastActivevariable that is never used, which can be removed to avoid confusion and keep the gesture handlers minimal. - The new helper functions (e.g.,
requestShowDockMenu,requestAppItemMenu) only cover part of the previously duplicated sequences (e.g.,dockMenuLoader.active = trueis still repeated at each call site); consider moving all shared steps into the helpers so callers don’t need to remember the correct activation order.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- In both the TapHandler.onTapped handler and the long-press handler you introduce a local `lastActive` variable that is never used, which can be removed to avoid confusion and keep the gesture handlers minimal.
- The new helper functions (e.g., `requestShowDockMenu`, `requestAppItemMenu`) only cover part of the previously duplicated sequences (e.g., `dockMenuLoader.active = true` is still repeated at each call site); consider moving all shared steps into the helpers so callers don’t need to remember the correct activation order.
## Individual Comments
### Comment 1
<location path="panels/dock/taskmanager/package/AppItem.qml" line_range="461-463" />
<code_context>
closeItemPreview()
}
+ // touchscreen long press.
+ onPressAndHold: function (mouse) {
+ if (mouse.button === Qt.NoButton) {
+ requestAppItemMenu()
+ }
+ }
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Consider making the touch-only PressAndHold guard more explicit and resilient
Using `mouse.button === Qt.NoButton` as a proxy for touch is a bit implicit and may break if event semantics change. If you only want touch long‑press, consider checking `mouse.source` / device type (if available) or wiring this through a dedicated touch handler (e.g., `TapHandler` long‑press, as in the dock) so the intent is explicit and less prone to misfiring on non‑touch input.
Suggested implementation:
```
// touch long-press: open app item menu explicitly for touch input
TapHandler {
id: touchLongPressHandler
acceptedDevices: PointerDevice.TouchScreen
acceptedButtons: Qt.LeftButton
gesturePolicy: TapHandler.ReleaseWithinBounds
onLongPressed: requestAppItemMenu()
}
```
If `TapHandler` and `PointerDevice` are not yet available in this file, ensure the root of `AppItem.qml` imports a recent enough QtQuick version (e.g. `import QtQuick 2.12` or later) where `TapHandler` and the `PointerDevice` attached type are provided. No other behavioral changes are required; the long-press is now explicitly touch-only instead of inferred via `mouse.button === Qt.NoButton`.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: 18202781743, BLumia The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
display logic
and long press gestures
menu
mouse)
requestShowDockMenu() function
Log: Touch screen users can now open dock menu via long press gesture
Influence:
popups
fix: 为任务栏菜单添加触摸屏支持
Log: 触摸屏用户现在可以通过长按手势打开任务栏菜单
Influence:
PMS: BUG-352989
Summary by Sourcery
Add touch-screen support for opening dock and app item context menus while centralizing dock menu display logic.
New Features:
Enhancements: