Skip to content

Commit 461b181

Browse files
committed
feat: enhance drag-and-drop visual feedback and folder icon animation
feat: 增强拖放视觉反馈和文件夹图标动画效果 提供拖动应用到文件夹的动画效果,实现应用原地缩小以及位移到相应的文件夹的应用位置, 采用方案为获取鼠标位置大小,然后采用hotspot的坐标偏移,获取应用图标中心点,然后转为icon坐标系的坐标图标应该放置的应用图标中心点,从而解决由于缩放图标会产生的位置偏移问题。 另外去除 girdview 是由于计算位置正确,但是存在着显示问题却会偏移像素级位置,所以去除。 采用dragAndfolderBackground 为 文件夹的背景, 也是对应的drag时候的图标的背景。 PMS: BUG-288931 BUG-315679
1 parent f26b5ff commit 461b181

4 files changed

Lines changed: 202 additions & 45 deletions

File tree

qml/FolderGridViewPopup.qml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2024-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -541,9 +541,15 @@ Popup {
541541
}
542542

543543
component DelegateDropArea: DropArea {
544+
property bool isDragHover: false
545+
544546
onEntered: function(drag) {
545547
root.onDragEnter(this)
546-
folderDragApplyTimer.dragId = drag.getDataAsString("text/x-dde-launcher-dnd-desktopId")
548+
let dragId = drag.getDataAsString("text/x-dde-launcher-dnd-desktopId")
549+
if (dragId !== model.desktopId) {
550+
isDragHover = true
551+
}
552+
folderDragApplyTimer.dragId = dragId
547553
folderDragApplyTimer.restart()
548554
}
549555
onPositionChanged: function(drag) {
@@ -558,6 +564,7 @@ Popup {
558564
}
559565
}
560566
onExited: {
567+
isDragHover = false
561568
root.onDragExit(this)
562569
folderDragApplyTimer.stop()
563570
folderDragApplyTimer.dragId = ""
@@ -566,6 +573,7 @@ Popup {
566573
root.onDragExit(this)
567574
}
568575
onDropped: function(drop) {
576+
isDragHover = false
569577
let dragId = drop.getDataAsString("text/x-dde-launcher-dnd-desktopId")
570578
if (dragId === "") {
571579
return
@@ -619,6 +627,7 @@ Popup {
619627
id: innerItem
620628
anchors.fill: parent
621629
dndEnabled: true
630+
isDragHover: false
622631
displayFont: isWindowedMode ? DTK.fontManager.t9 : DTK.fontManager.t6
623632
Drag.mimeData: Helper.generateDragMimeData(model.desktopId)
624633
visible: dndItem.currentlyDraggedId !== model.desktopId

qml/FullscreenFrame.qml

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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

@@ -33,7 +33,18 @@ InputEventItem {
3333
// ----------- Drag and Drop related functions START -----------
3434
Label {
3535
property string currentlyDraggedId
36-
36+
property string currentlyDraggedIconName
37+
38+
property bool mergeAnimPending: false
39+
//被拖拽图标
40+
property string mergeAnimTargetIcon: ""
41+
//放下的图标或文件夹
42+
property string mergeAnimTargetIcon2: ""
43+
// 鼠标松手位置(窗口坐标)
44+
property real mergeAnimStartX: 0
45+
property real mergeAnimStartY: 0
46+
47+
property real mergeSize: 0
3748
signal dragEnded()
3849

3950
id: dndItem
@@ -45,6 +56,7 @@ InputEventItem {
4556
text = "Dragging " + currentlyDraggedId
4657
} else {
4758
currentlyDraggedId = ""
59+
currentlyDraggedIconName = ""
4860
dragEnded()
4961
}
5062
}
@@ -547,21 +559,29 @@ InputEventItem {
547559
delegate: DropArea {
548560
Keys.forwardTo: [iconItemDelegate]
549561

562+
property bool isDragHover: false
563+
550564
visible: !folderGridViewPopup.visible || folderGridViewPopup.currentFolderId !== Number(model.desktopId.replace("internal/folders/", ""))
551565
width: gridViewContainer.cellWidth
552566
height: gridViewContainer.cellHeight
553567
onEntered: function (drag) {
554568
if (folderGridViewPopup.opened) {
555569
folderGridViewPopup.close()
556570
}
557-
dndDropEnterTimer.dragId = drag.getDataAsString("text/x-dde-launcher-dnd-desktopId")
571+
let dragId = drag.getDataAsString("text/x-dde-launcher-dnd-desktopId")
572+
if (dragId !== model.desktopId) {
573+
isDragHover = true
574+
}
575+
dndDropEnterTimer.dragId = dragId
558576
dndDropEnterTimer.restart()
559577
}
560578
onExited: {
579+
isDragHover = false
561580
dndDropEnterTimer.stop()
562581
dndDropEnterTimer.dragId = ""
563582
}
564583
onDropped: function (drop) {
584+
isDragHover = false
565585
dndDropEnterTimer.stop()
566586
dndDropEnterTimer.dragId = ""
567587
let dragId = drop.getDataAsString("text/x-dde-launcher-dnd-desktopId")
@@ -572,6 +592,15 @@ InputEventItem {
572592
} else if (drop.x > (width - sideOpPadding)) {
573593
op = 1
574594
}
595+
if (op === 0) {
596+
dndItem.mergeAnimTargetIcon = dndItem.currentlyDraggedIconName
597+
dndItem.mergeAnimTargetIcon2 = !folderIcons ? iconItemDelegate.iconSource : ""
598+
let cursorScene = mapToItem(null, drop.x, drop.y)
599+
let hs = dndItem.Drag.hotSpot
600+
dndItem.mergeAnimStartX = cursorScene.x - hs.x + dndItem.mergeSize / 2
601+
dndItem.mergeAnimStartY = cursorScene.y - hs.y + dndItem.mergeSize / 2
602+
dndItem.mergeAnimPending = true
603+
}
575604
dropOnItem(dragId, model.desktopId, op)
576605
proxyModel.sort(0)
577606
}
@@ -606,6 +635,7 @@ InputEventItem {
606635
}
607636
enabled: !folderGridViewPopup.visible
608637
dndEnabled: !folderGridViewPopup.opened
638+
isDragHover: parent.isDragHover
609639
Drag.mimeData: Helper.generateDragMimeData(model.desktopId)
610640
visible: dndItem.currentlyDraggedId !== model.desktopId
611641
iconSource: (iconName && iconName !== "") ? iconName : "application-x-desktop"

0 commit comments

Comments
 (0)