Skip to content

Commit b236970

Browse files
yixinsharkdeepin-bot[bot]
authored andcommitted
fix: correct dock context menu popup positioning
Use DTK popup-window menus for dock context menus that need pointer-relative placement. Pass pointer or touch positions into the menu helper and adjust popup coordinates for bottom and right dock positions. Convert the dock blank-area menu and taskmanager app-item menu to DTK popup windows with PopupHandle blur. 使用 DTK popup window 菜单处理需要基于指针位置弹出的 dock 右键菜单。 传入鼠标或触摸位置,并在底部和右侧 dock 场景下根据菜单尺寸调整弹出坐标。 将 dock 空白区域菜单和 taskmanager 应用项菜单切换为带 PopupHandle 模糊的 DTK popup window。 Log: correct dock context menu popup positioning Pms: BUG-295233
1 parent 21211d1 commit b236970

4 files changed

Lines changed: 85 additions & 35 deletions

File tree

debian/control

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ Depends:
7373
dde-tray-loader (>= 1.99.8),
7474
libdde-shell (= ${binary:Version}),
7575
libdde-shell-dock (= ${binary:Version}),
76-
libdtk6declarative,
76+
libdtk6declarative (>> 6.7.44),
7777
libqt6sql6-sqlite,
7878
libqt6svg6,
7979
qml6-module-qt-labs-platform,

panels/dock/MenuHelper.qml

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,58 @@
1-
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
pragma Singleton
66
import QtQuick
7-
import Qt.labs.platform
7+
import org.deepin.ds.dock 1.0
88

99
Item {
10-
property Menu activeMenu: null
10+
id: root
11+
12+
property var activeMenu: null
1113

1214
signal menuClosed()
1315
Connections {
14-
target: activeMenu
16+
target: root.activeMenu
1517
function onAboutToHide() {
16-
activeMenu = null
17-
menuClosed()
18+
root.activeMenu = null
19+
root.menuClosed()
1820
}
1921
}
20-
function openMenu(menu: Menu) {
22+
function openMenu(menu, parentItem, point) {
23+
if (!menu) {
24+
return
25+
}
26+
2127
if (activeMenu) {
2228
activeMenu.close()
2329
}
24-
menu.open()
30+
31+
if (parentItem !== undefined && point !== undefined) {
32+
menu.popup(parentItem, point.x, point.y)
33+
} else {
34+
menu.open()
35+
}
2536
activeMenu = menu
2637
}
27-
function closeMenu(menu: Menu) {
28-
menu.close()
38+
function calculateMenuPosition(point, menu, position) {
39+
let menuWidth = Math.max(menu.implicitWidth, menu.width, 1)
40+
let menuHeight = Math.max(menu.implicitHeight, menu.height, 1)
41+
switch (position) {
42+
case Dock.Right:
43+
return Qt.point(point.x - menuWidth, point.y)
44+
case Dock.Bottom:
45+
return Qt.point(point.x, point.y - menuHeight)
46+
case Dock.Left:
47+
case Dock.Top:
48+
default:
49+
return point
50+
}
51+
}
52+
function closeMenu(menu) {
53+
if (menu) {
54+
menu.close()
55+
}
2956
}
3057
function closeCurrent() {
3158
if (activeMenu) {

panels/dock/package/main.qml

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
import QtQuick 2.15
6-
import QtQuick.Controls 2.4
6+
import QtQuick.Controls
77
import QtQuick.Layouts 2.15
88
import QtQuick.Window 2.15
99

1010
import QtQml
11-
import Qt.labs.platform as LP
1211

1312
import org.deepin.ds 1.0
1413
import org.deepin.ds.dock 1.0
@@ -57,12 +56,21 @@ Window {
5756
return appearance.opacity
5857
}
5958

60-
function requestShowDockMenu() {
59+
function requestShowDockMenu(point) {
6160
// maybe has popup visible, close it.
6261
Panel.requestClosePopup()
6362
viewDeactivated()
6463
hideTimer.stop()
65-
MenuHelper.openMenu(dockMenuLoader.item)
64+
65+
let localPoint = point ? Qt.point(point.x, point.y) : Qt.point(dockContainer.width / 2, dockContainer.height / 2)
66+
Qt.callLater(function () {
67+
let menu = dockMenuLoader.item
68+
if (!menu)
69+
return
70+
71+
let pos = MenuHelper.calculateMenuPosition(localPoint, menu, Panel.position)
72+
MenuHelper.openMenu(menu, dockContainer, pos)
73+
})
6674
}
6775

6876
DLayerShellWindow.anchors: position2Anchors(positionForAnimation)
@@ -266,11 +274,12 @@ Window {
266274
}
267275
}
268276

269-
component EnumPropertyMenuItem: LP.MenuItem {
277+
component EnumPropertyMenuItem: D.MenuItem {
270278
required property string name
271279
required property string prop
272280
required property int value
273281
text: name
282+
checkable: true
274283

275284
onTriggered: {
276285
Applet[prop] = value
@@ -280,12 +289,9 @@ Window {
280289
}
281290
checked: Applet[prop] === value
282291
}
283-
component MutuallyExclusiveMenu: LP.Menu {
284-
id: menu
285-
LP.MenuItemGroup {
286-
id: group
287-
items: menu.items
288-
}
292+
component MutuallyExclusiveMenu: D.Menu {
293+
popupType: Popup.Window
294+
D.PopupHandle.enableBlurWindow: true
289295
}
290296

291297
function updateAppItems()
@@ -298,8 +304,11 @@ Window {
298304
Loader {
299305
id: dockMenuLoader
300306
active: false
301-
sourceComponent: LP.Menu {
307+
sourceComponent: D.Menu {
302308
id: dockMenu
309+
popupType: Popup.Window
310+
D.PopupHandle.enableBlurWindow: true
311+
303312
MutuallyExclusiveMenu {
304313
visible: Panel.debugMode
305314
title: qsTr("Indicator Style")
@@ -368,14 +377,15 @@ Window {
368377
value: Dock.SmartHide
369378
}
370379
}
371-
LP.MenuItem {
380+
D.MenuItem {
372381
text: qsTr("Lock the Dock")
382+
checkable: true
373383
checked: Panel.locked
374384
onTriggered: {
375385
Panel.locked = !Panel.locked
376386
}
377387
}
378-
LP.MenuItem {
388+
D.MenuItem {
379389
text: qsTr("Dock Settings")
380390
onTriggered: {
381391
Panel.openDockSettings()
@@ -422,7 +432,7 @@ Window {
422432
MenuHelper.closeCurrent()
423433
dockMenuLoader.active = true
424434
if (button === Qt.RightButton && lastActive !== dockMenuLoader.item) {
425-
requestShowDockMenu()
435+
requestShowDockMenu(eventPoint.position)
426436
}
427437
if (button === Qt.LeftButton) {
428438
// try to close popup when clicked empty, because dock does not have focus.
@@ -434,6 +444,7 @@ Window {
434444

435445
//Touch screen click
436446
TapHandler {
447+
id: touchMenuTapHandler
437448
acceptedButtons: Qt.NoButton
438449
acceptedDevices: PointerDevice.TouchScreen
439450
onTapped: function(eventPoint, button) {
@@ -449,7 +460,7 @@ Window {
449460
MenuHelper.closeCurrent()
450461
dockMenuLoader.active = true
451462
if (lastActive !== dockMenuLoader.item) {
452-
requestShowDockMenu()
463+
requestShowDockMenu(touchMenuTapHandler.point.position)
453464
}
454465
}
455466
}

panels/dock/taskmanager/package/AppItem.qml

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
import QtQuick 2.15
6-
import QtQuick.Controls 2.15
6+
import QtQuick.Controls
77

88
import org.deepin.ds 1.0
99
import org.deepin.ds.dock 1.0
1010
import org.deepin.dtk 1.0 as D
11-
import Qt.labs.platform 1.1 as LP
1211

1312
Item {
1413
id: root
@@ -384,12 +383,15 @@ Item {
384383
id: contextMenuLoader
385384
active: false
386385
property bool trashEmpty: true
387-
sourceComponent: LP.Menu {
386+
sourceComponent: D.Menu {
388387
id: contextMenu
388+
popupType: Popup.Window
389+
D.PopupHandle.enableBlurWindow: true
390+
389391
Instantiator {
390392
id: menuItemInstantiator
391393
model: JSON.parse(menus)
392-
delegate: LP.MenuItem {
394+
delegate: D.MenuItem {
393395
text: modelData.name
394396
enabled: (root.itemId === "dde-trash" && modelData.id === "clean-trash")
395397
? !contextMenuLoader.trashEmpty
@@ -476,11 +478,20 @@ Item {
476478
}
477479
}
478480

479-
function requestAppItemMenu() {
481+
function requestAppItemMenu(point) {
480482
Panel.requestClosePopup()
481483
contextMenuLoader.trashEmpty = TaskManager.isTrashEmpty()
482484
contextMenuLoader.active = true
483-
MenuHelper.openMenu(contextMenuLoader.item)
485+
486+
let localPoint = point ? Qt.point(point.x, point.y) : Qt.point(root.width / 2, root.height / 2)
487+
Qt.callLater(function () {
488+
let menu = contextMenuLoader.item
489+
if (!menu)
490+
return
491+
492+
let pos = MenuHelper.calculateMenuPosition(localPoint, menu, Panel.position)
493+
MenuHelper.openMenu(menu, root, pos)
494+
})
484495
}
485496

486497
MouseArea {
@@ -502,11 +513,12 @@ Item {
502513
property bool isTouchLongPressed: false
503514

504515
TapHandler {
516+
id: touchMenuTapHandler
505517
acceptedDevices: PointerDevice.TouchScreen
506518
gesturePolicy: TapHandler.DragThreshold
507519
onLongPressed: {
508520
mouseArea.isTouchLongPressed = true
509-
requestAppItemMenu()
521+
requestAppItemMenu(touchMenuTapHandler.point.position)
510522
}
511523
}
512524
onPressed: function (mouse) {
@@ -528,7 +540,7 @@ Item {
528540

529541
let index = root.modelIndex;
530542
if (mouse.button === Qt.RightButton) {
531-
requestAppItemMenu()
543+
requestAppItemMenu(Qt.point(mouse.x, mouse.y))
532544
} else {
533545
if (root.windows.length === 0) {
534546
launchAnimation.start();

0 commit comments

Comments
 (0)