import QtQuick 2.15 import QtQuick.Controls 2.5 import QtQuick.Layouts 1.15 import org.ukui.menu.core 1.0 import org.ukui.menu.extension 1.0 import org.ukui.quick.platform 1.0 as Platform import org.ukui.quick.items 1.0 as UkuiItems import AppControls2 1.0 as AppControls2 UkuiItems.StyleBackground { id: iconItem property bool hold: false property alias draggedIcon: itemLoader radius: 8 useStyleTransparency: false paletteRole: Platform.Theme.Text alpha: hold ? 0 : control.containsPress ? 0.15 : control.containsMouse ? 0.08 : 0 // 合并提升框 52*52 UkuiItems.StyleBackground { width: 52 height: width radius: 14 anchors.top: parent.top anchors.margins: 6 anchors.horizontalCenter: parent.horizontalCenter paletteRole: Platform.Theme.Text useStyleTransparency: false alpha: (delegateDropArea.enterSourceId !== model.id) && delegateDropArea.containsDrag && dragTypeIsMerge ? 0.15 : 0 z: -1 } ColumnLayout { id: itemLayout width: parent.width anchors.top: parent.top anchors.topMargin: 8 anchors.horizontalCenter: parent.horizontalCenter spacing: 6 ToolTip.visible: iconText.truncated && control.containsMouse ToolTip.text: model.name ToolTip.delay: 500 Item { id: loaderBase Layout.preferredHeight: 48 Layout.preferredWidth: 48 Layout.alignment: Qt.AlignHCenter Loader { id: itemLoader width: loaderBase.width height: loaderBase.height x: 0; y: 0 Drag.active: control.drag.active Drag.source: itemLoader Drag.hotSpot.x: width / 2 Drag.hotSpot.y: height / 2 Drag.onActiveChanged: { if (Drag.active) { itemLoader.parent = favoriteView; } else { if (dragTypeIsMerge && (model.id !== mergeToAppId) && (model.type === DataType.Normal)) { iconItem.hold = false; } else { iconResetAnimation.start(); } } } ParallelAnimation { id: iconResetAnimation NumberAnimation { target: itemLoader property: "x" to: container.x + loaderBase.x easing.type: Easing.OutQuad duration: 300 } NumberAnimation { target: itemLoader property: "y" to: (container.y + 8) - favoriteView.contentY easing.type: Easing.OutQuad duration: 300 } onFinished: { iconItem.hold = false; itemLoader.parent = loaderBase; itemLoader.x = 0; itemLoader.y = 0; } } property int visualIndex: 0 property string sourceId: "" property bool isFolder: model.type === DataType.Folder property string icon: model.icon property bool isFavorite: true sourceComponent: { if (type === DataType.Normal) { return appIconComponent; } if (type === DataType.Folder) { return folderIconComponent; } } } } UkuiItems.StyleText { id: iconText Layout.fillWidth: true text: name elide: Text.ElideRight paletteRole: Platform.Theme.Text horizontalAlignment: Text.AlignHCenter opacity: !itemLoader.Drag.active Behavior on opacity { NumberAnimation { duration: 150} } } } Component { id: appIconComponent Image { id: iconImage sourceSize.height: height sourceSize.width: width source: icon cache: false function itemClicked(mouseButton) { if (mouseButton === Qt.RightButton) { visualModel.model.openMenu(index) } else { var data = {"id": model.id}; send(data); } } } } Component { id: folderIconComponent Item { AppControls2.FolderIcon { id: folderIcon width: 40 height: 40 anchors.centerIn: parent rows: 2; columns: 2 spacing: 2; padding: 2 icons: icon radius: 4; alpha: 0.10 } function itemClicked(mouseButton) { if (mouseButton === Qt.RightButton) { visualModel.model.openMenu(index); } else { var x = mapToGlobal(folderIcon.x, folderIcon.y).x; var y = mapToGlobal(folderIcon.x, folderIcon.y).y openFolderSignal(id, name, x, y); // 执行隐藏动画,并且当前图标消失且鼠标区域不可用 favoriteView.isContentShow = false; opacity = 0; control.enabled = false; control.hoverEnabled = false; } } } } MouseArea { id: control anchors.fill: parent hoverEnabled: true pressAndHoldInterval: 300 acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked: { itemLoader.item.itemClicked(mouse.button); } onPressAndHold: { if (mouse.button === Qt.LeftButton) { drag.target = itemLoader; iconItem.hold = true; exchangedStartIndex = itemLoader.visualIndex; itemLoader.sourceId = model.id; } } onReleased: { drag.target = null; } } // folderFunction function resetOpacity() { itemLoader.item.opacity = 1; control.enabled = true; control.hoverEnabled = true; } Component.onCompleted: favoriteView.contentShowFinished.connect(resetOpacity) Component.onDestruction: favoriteView.contentShowFinished.disconnect(resetOpacity) onHoldChanged: { if (hold) { favoriteView.interactive = false; } else { favoriteView.interactive = contentHeight > favoriteView.parent.height; if (dragTypeIsMerge && (model.id !== mergeToAppId) && (model.type === DataType.Normal)) { if (isMergeToFolder) { visualModel.model.addAppToFolder(model.id, mergeToAppId); } else { visualModel.model.addAppsToNewFolder(model.id, mergeToAppId); } } else if (exchangedStartIndex !== itemLoader.visualIndex) { visualModel.model.exchangedAppsOrder(exchangedStartIndex, itemLoader.visualIndex); } } } }