Warning, /plasma/plasma-mobile/containments/homescreens/folio/package/contents/ui/WidgetDragItem.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 import QtQuick.Controls as QQC2
0007 import Qt5Compat.GraphicalEffects
0008 
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.plasma.core as PlasmaCore
0011 import org.kde.ksvg 1.0 as KSvg
0012 
0013 import org.kde.plasma.components 3.0 as PC3
0014 import org.kde.private.mobile.homescreen.folio 1.0 as Folio
0015 
0016 import './delegate'
0017 import './private'
0018 
0019 Item {
0020     id: root
0021     width: widgetLoader.item ? widgetLoader.item.width : 0
0022     height: widgetLoader.item ? widgetLoader.item.height : 0
0023 
0024     property Folio.FolioWidget widget
0025 
0026     readonly property bool isWidgetDelegate: Folio.HomeScreenState.dragState.dropDelegate && Folio.HomeScreenState.dragState.dropDelegate.type === Folio.FolioDelegate.Widget
0027     readonly property bool dropAnimationRunning: dragXAnim.running || dragYAnim.running
0028 
0029     visible: false
0030     x: Math.round(Folio.HomeScreenState.delegateDragX)
0031     y: Math.round(Folio.HomeScreenState.delegateDragY)
0032 
0033     function startDrag(widget) {
0034         root.widget = widget;
0035         visible = true;
0036     }
0037 
0038     function setXBinding() {
0039         x = Qt.binding(() => Math.round(Folio.HomeScreenState.delegateDragX));
0040     }
0041     function setYBinding() {
0042         y = Qt.binding(() => Math.round(Folio.HomeScreenState.delegateDragY));
0043     }
0044 
0045     // animate drop x
0046     XAnimator on x {
0047         id: dragXAnim
0048         running: false
0049         duration: Kirigami.Units.longDuration
0050         easing.type: Easing.OutCubic
0051         onFinished: {
0052             root.visible = false;
0053             root.widget = null;
0054             root.setXBinding();
0055         }
0056     }
0057 
0058     // animate drop y
0059     YAnimator on y {
0060         id: dragYAnim
0061         running: false
0062         duration: Kirigami.Units.longDuration
0063         easing.type: Easing.OutCubic
0064         onFinished: {
0065             root.visible = false;
0066             root.widget = null;
0067             root.setYBinding();
0068         }
0069     }
0070 
0071     Connections {
0072         id: stateWatcher
0073         target: Folio.HomeScreenState
0074 
0075         function onSwipeStateChanged() {
0076             if (Folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate &&
0077                 Folio.HomeScreenState.dragState.dropDelegate &&
0078                 Folio.HomeScreenState.dragState.dropDelegate.type === Folio.FolioDelegate.Widget) {
0079 
0080                 root.startDrag(Folio.HomeScreenState.dragState.dropDelegate.widget);
0081             }
0082         }
0083     }
0084 
0085     Connections {
0086         target: Folio.HomeScreenState.dragState
0087 
0088         // animate from when the delegate is dropped to its drop position
0089         function onDelegateDroppedAndPlaced() {
0090             if (!root.isWidgetDelegate) {
0091                 return;
0092             }
0093 
0094             let dragState = Folio.HomeScreenState.dragState;
0095             let dropPosition = dragState.candidateDropPosition;
0096 
0097             let pos = Folio.HomeScreenState.getPageDelegateScreenPosition(dropPosition.page, dropPosition.pageRow, dropPosition.pageColumn);
0098 
0099             dragXAnim.to = pos.x;
0100             dragYAnim.to = pos.y;
0101             dragXAnim.restart();
0102             dragYAnim.restart();
0103         }
0104 
0105         // if the drop has been abandoned, just hide
0106         function onNewDelegateDropAbandoned() {
0107             root.visible = false;
0108         }
0109     }
0110 
0111     Loader {
0112         id: widgetLoader
0113 
0114         active: root.widget
0115 
0116         sourceComponent: WidgetDelegate {
0117             widget: root.widget
0118 
0119             layer.enabled: true
0120             layer.effect: DarkenEffect {}
0121         }
0122     }
0123 }