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