Warning, /plasma/plasma-mobile/containments/homescreens/folio/package/contents/ui/DelegateDragItem.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
0002 // SPDX-License-Identifier: LGPL-2.0-or-later
0003
0004 import QtQuick
0005 import QtQuick.Layouts
0006
0007 import org.kde.kirigami 2.20 as Kirigami
0008 import org.kde.private.mobile.homescreen.folio 1.0 as Folio
0009
0010 import "./delegate"
0011
0012 Item {
0013 id: root
0014 width: Folio.HomeScreenState.pageCellWidth
0015 height: Folio.HomeScreenState.pageCellHeight
0016
0017 property Folio.FolioDelegate delegate
0018
0019 readonly property real dropAnimationRunning: dragXAnim.running || dragYAnim.running
0020
0021 // ignore widget dragging, that is not handled by this component
0022 readonly property bool isWidgetDrag: Folio.HomeScreenState.dragState.dropDelegate && Folio.HomeScreenState.dragState.dropDelegate.type === Folio.FolioDelegate.Widget
0023
0024 visible: false
0025 x: Folio.HomeScreenState.delegateDragX
0026 y: Folio.HomeScreenState.delegateDragY
0027
0028 function setXBinding() {
0029 x = Qt.binding(() => Folio.HomeScreenState.delegateDragX);
0030 }
0031 function setYBinding() {
0032 y = Qt.binding(() => Folio.HomeScreenState.delegateDragY);
0033 }
0034
0035 // animate drop x
0036 XAnimator on x {
0037 id: dragXAnim
0038 running: false
0039 duration: Kirigami.Units.longDuration
0040 easing.type: Easing.OutCubic
0041 onFinished: {
0042 root.visible = false;
0043 root.setXBinding();
0044 }
0045 }
0046
0047 // animate drop y
0048 YAnimator on y {
0049 id: dragYAnim
0050 running: false
0051 duration: Kirigami.Units.longDuration
0052 easing.type: Easing.OutCubic
0053 onFinished: {
0054 root.visible = false;
0055 root.setYBinding();
0056 }
0057 }
0058
0059 // animate scale if it's an app being placed into a folder
0060 ScaleAnimator on scale {
0061 id: scaleAnim
0062 to: 0
0063 running: false
0064 duration: Kirigami.Units.longDuration
0065 easing.type: Easing.InOutCubic
0066 }
0067
0068 Connections {
0069 id: stateWatcher
0070 target: Folio.HomeScreenState
0071
0072 property var delegateDroppedOn: null
0073
0074 // reset and show drag item
0075 function onSwipeStateChanged() {
0076 if (Folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate && !isWidgetDrag) {
0077 root.scale = 1.0;
0078 root.visible = true;
0079 }
0080 }
0081
0082 // save the existing delegate at the spot (this is called before the delegate is dropped)
0083 function onDelegateDragEnded() {
0084 if (root.isWidgetDrag) {
0085 return;
0086 }
0087
0088 let dragState = Folio.HomeScreenState.dragState;
0089 let dropPosition = dragState.candidateDropPosition;
0090
0091 switch (dropPosition.location) {
0092 case Folio.DelegateDragPosition.Pages:
0093 stateWatcher.delegateDroppedOn = Folio.HomeScreenState.getPageDelegateAt(dropPosition.page, dropPosition.pageRow, dropPosition.pageColumn);
0094 break;
0095 case Folio.DelegateDragPosition.Favourites:
0096 stateWatcher.delegateDroppedOn = Folio.HomeScreenState.getFavouritesDelegateAt(dropPosition.favouritesPosition);
0097 break;
0098 case Folio.DelegateDragPosition.Folder:
0099 stateWatcher.delegateDroppedOn = null;
0100 break;
0101 }
0102 }
0103 }
0104
0105 Connections {
0106 target: Folio.HomeScreenState.dragState
0107
0108 // animate from when the delegate is dropped to its drop position
0109 function onDelegateDroppedAndPlaced() {
0110 if (root.isWidgetDrag) {
0111 return;
0112 }
0113
0114 let dragState = Folio.HomeScreenState.dragState;
0115 let dropPosition = dragState.candidateDropPosition;
0116
0117 let pos = null;
0118
0119 switch (dropPosition.location) {
0120 case Folio.DelegateDragPosition.Pages:
0121 pos = Folio.HomeScreenState.getPageDelegateScreenPosition(dropPosition.page, dropPosition.pageRow, dropPosition.pageColumn);
0122 break;
0123 case Folio.DelegateDragPosition.Favourites:
0124 pos = Folio.HomeScreenState.getFavouritesDelegateScreenPosition(dropPosition.favouritesPosition);
0125 break;
0126 case Folio.DelegateDragPosition.Folder:
0127 pos = Folio.HomeScreenState.getFolderDelegateScreenPosition(dropPosition.folderPosition);
0128 break;
0129 }
0130
0131 dragXAnim.to = pos.x;
0132 dragYAnim.to = pos.y;
0133 dragXAnim.restart();
0134 dragYAnim.restart();
0135
0136 if (stateWatcher.delegateDroppedOn &&
0137 stateWatcher.delegateDroppedOn.type != Folio.FolioDelegate.None &&
0138 dragState.dropDelegate.type === Folio.FolioDelegate.Application) {
0139
0140 // scale animation if we are creating, or inserting into a folder
0141 scaleAnim.restart();
0142 }
0143 }
0144
0145 // if the drop has been abandoned, just hide
0146 function onNewDelegateDropAbandoned() {
0147 root.visible = false;
0148 }
0149 }
0150
0151 // simulate an icon delegate
0152 ColumnLayout {
0153 anchors.fill: parent
0154 spacing: 0
0155
0156 // icon
0157 DelegateIconLoader {
0158 id: loader
0159 Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
0160 Layout.minimumWidth: Folio.FolioSettings.delegateIconSize
0161 Layout.minimumHeight: Folio.FolioSettings.delegateIconSize
0162 Layout.preferredHeight: Layout.minimumHeight
0163
0164 delegate: root.delegate
0165
0166 layer.enabled: true
0167 layer.effect: DelegateShadow {}
0168 }
0169
0170 // simulate the delegate label for positioning purposes
0171 DelegateLabel {
0172 id: label
0173 opacity: 0
0174
0175 Layout.fillWidth: true
0176 Layout.preferredHeight: Folio.HomeScreenState.pageDelegateLabelHeight
0177 Layout.topMargin: Folio.HomeScreenState.pageDelegateLabelSpacing
0178 Layout.leftMargin: -parent.anchors.leftMargin + Kirigami.Units.smallSpacing
0179 Layout.rightMargin: -parent.anchors.rightMargin + Kirigami.Units.smallSpacing
0180 }
0181 }
0182 }