Skip to content

Commit f7e9895

Browse files
committed
revert: "fix: correct dock context menu popup positioning"
This reverts commit b236970. 引入 popup 窗口菜单后,popup 会主动夺取输入焦点,导致 dock 右键 一级菜单与展开后的二级菜单之间出现互抢焦点的问题:二级菜单弹出 时会从一级菜单抢走焦点,进而触发一级菜单异常关闭或交互错乱。 先回退至 Qt.labs.platform 菜单方案,待焦点抢夺问题彻底解决后再 重新引入 DTK popup window 菜单。 Log: revert popup menu due to focus stealing between primary and submenu
1 parent cbd22f2 commit f7e9895

4 files changed

Lines changed: 35 additions & 85 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 (>> 6.7.44),
76+
libdtk6declarative,
7777
libqt6sql6-sqlite,
7878
libqt6svg6,
7979
qml6-module-qt-labs-platform,

panels/dock/MenuHelper.qml

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

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

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

1412
signal menuClosed()
1513
Connections {
16-
target: root.activeMenu
14+
target: activeMenu
1715
function onAboutToHide() {
18-
root.activeMenu = null
19-
root.menuClosed()
16+
activeMenu = null
17+
menuClosed()
2018
}
2119
}
22-
function openMenu(menu, parentItem, point) {
23-
if (!menu) {
24-
return
25-
}
26-
20+
function openMenu(menu: Menu) {
2721
if (activeMenu) {
2822
activeMenu.close()
2923
}
30-
31-
if (parentItem !== undefined && point !== undefined) {
32-
menu.popup(parentItem, point.x, point.y)
33-
} else {
34-
menu.open()
35-
}
24+
menu.open()
3625
activeMenu = menu
3726
}
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-
}
27+
function closeMenu(menu: Menu) {
28+
menu.close()
5629
}
5730
function closeCurrent() {
5831
if (activeMenu) {

panels/dock/package/main.qml

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

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

1010
import QtQml
11+
import Qt.labs.platform as LP
1112

1213
import org.deepin.ds 1.0
1314
import org.deepin.ds.dock 1.0
@@ -56,21 +57,12 @@ Window {
5657
return appearance.opacity
5758
}
5859

59-
function requestShowDockMenu(point) {
60+
function requestShowDockMenu() {
6061
// maybe has popup visible, close it.
6162
Panel.requestClosePopup()
6263
viewDeactivated()
6364
hideTimer.stop()
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-
})
65+
MenuHelper.openMenu(dockMenuLoader.item)
7466
}
7567

7668
DLayerShellWindow.anchors: position2Anchors(positionForAnimation)
@@ -274,12 +266,11 @@ Window {
274266
}
275267
}
276268

277-
component EnumPropertyMenuItem: D.MenuItem {
269+
component EnumPropertyMenuItem: LP.MenuItem {
278270
required property string name
279271
required property string prop
280272
required property int value
281273
text: name
282-
checkable: true
283274

284275
onTriggered: {
285276
Applet[prop] = value
@@ -289,9 +280,12 @@ Window {
289280
}
290281
checked: Applet[prop] === value
291282
}
292-
component MutuallyExclusiveMenu: D.Menu {
293-
popupType: Popup.Window
294-
D.PopupHandle.enableBlurWindow: true
283+
component MutuallyExclusiveMenu: LP.Menu {
284+
id: menu
285+
LP.MenuItemGroup {
286+
id: group
287+
items: menu.items
288+
}
295289
}
296290

297291
function updateAppItems()
@@ -304,11 +298,8 @@ Window {
304298
Loader {
305299
id: dockMenuLoader
306300
active: false
307-
sourceComponent: D.Menu {
301+
sourceComponent: LP.Menu {
308302
id: dockMenu
309-
popupType: Popup.Window
310-
D.PopupHandle.enableBlurWindow: true
311-
312303
MutuallyExclusiveMenu {
313304
visible: Panel.debugMode
314305
title: qsTr("Indicator Style")
@@ -377,15 +368,14 @@ Window {
377368
value: Dock.SmartHide
378369
}
379370
}
380-
D.MenuItem {
371+
LP.MenuItem {
381372
text: qsTr("Lock the Dock")
382-
checkable: true
383373
checked: Panel.locked
384374
onTriggered: {
385375
Panel.locked = !Panel.locked
386376
}
387377
}
388-
D.MenuItem {
378+
LP.MenuItem {
389379
text: qsTr("Dock Settings")
390380
onTriggered: {
391381
Panel.openDockSettings()
@@ -432,7 +422,7 @@ Window {
432422
MenuHelper.closeCurrent()
433423
dockMenuLoader.active = true
434424
if (button === Qt.RightButton && lastActive !== dockMenuLoader.item) {
435-
requestShowDockMenu(eventPoint.position)
425+
requestShowDockMenu()
436426
}
437427
if (button === Qt.LeftButton) {
438428
// try to close popup when clicked empty, because dock does not have focus.
@@ -444,7 +434,6 @@ Window {
444434

445435
//Touch screen click
446436
TapHandler {
447-
id: touchMenuTapHandler
448437
acceptedButtons: Qt.NoButton
449438
acceptedDevices: PointerDevice.TouchScreen
450439
onTapped: function(eventPoint, button) {
@@ -460,7 +449,7 @@ Window {
460449
MenuHelper.closeCurrent()
461450
dockMenuLoader.active = true
462451
if (lastActive !== dockMenuLoader.item) {
463-
requestShowDockMenu(touchMenuTapHandler.point.position)
452+
requestShowDockMenu()
464453
}
465454
}
466455
}

panels/dock/taskmanager/package/AppItem.qml

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

55
import QtQuick 2.15
6-
import QtQuick.Controls
6+
import QtQuick.Controls 2.15
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
1112

1213
Item {
1314
id: root
@@ -383,15 +384,12 @@ Item {
383384
id: contextMenuLoader
384385
active: false
385386
property bool trashEmpty: true
386-
sourceComponent: D.Menu {
387+
sourceComponent: LP.Menu {
387388
id: contextMenu
388-
popupType: Popup.Window
389-
D.PopupHandle.enableBlurWindow: true
390-
391389
Instantiator {
392390
id: menuItemInstantiator
393391
model: JSON.parse(menus)
394-
delegate: D.MenuItem {
392+
delegate: LP.MenuItem {
395393
text: modelData.name
396394
enabled: (root.itemId === "dde-trash" && modelData.id === "clean-trash")
397395
? !contextMenuLoader.trashEmpty
@@ -478,20 +476,11 @@ Item {
478476
}
479477
}
480478

481-
function requestAppItemMenu(point) {
479+
function requestAppItemMenu() {
482480
Panel.requestClosePopup()
483481
contextMenuLoader.trashEmpty = TaskManager.isTrashEmpty()
484482
contextMenuLoader.active = true
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-
})
483+
MenuHelper.openMenu(contextMenuLoader.item)
495484
}
496485

497486
MouseArea {
@@ -513,12 +502,11 @@ Item {
513502
property bool isTouchLongPressed: false
514503

515504
TapHandler {
516-
id: touchMenuTapHandler
517505
acceptedDevices: PointerDevice.TouchScreen
518506
gesturePolicy: TapHandler.DragThreshold
519507
onLongPressed: {
520508
mouseArea.isTouchLongPressed = true
521-
requestAppItemMenu(touchMenuTapHandler.point.position)
509+
requestAppItemMenu()
522510
}
523511
}
524512
onPressed: function (mouse) {
@@ -540,7 +528,7 @@ Item {
540528

541529
let index = root.modelIndex;
542530
if (mouse.button === Qt.RightButton) {
543-
requestAppItemMenu(Qt.point(mouse.x, mouse.y))
531+
requestAppItemMenu()
544532
} else {
545533
if (root.windows.length === 0) {
546534
launchAnimation.start();

0 commit comments

Comments
 (0)