2023-10-22 03:59:27 +00:00
|
|
|
// SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
|
|
|
|
|
// SPDX-License-Identifier: LGPL-2.0-or-later
|
|
|
|
|
|
|
|
|
|
import QtQuick 2.12
|
|
|
|
|
import QtQuick.Window 2.12
|
|
|
|
|
import QtQuick.Layouts 1.1
|
|
|
|
|
|
|
|
|
|
import org.kde.plasma.components 3.0 as PC3
|
2023-11-02 11:08:17 +00:00
|
|
|
import org.kde.plasma.private.mobileshell.state as MobileShellState
|
2023-10-22 03:59:27 +00:00
|
|
|
import org.kde.private.mobile.homescreen.folio 1.0 as Folio
|
2023-11-02 11:08:17 +00:00
|
|
|
import org.kde.plasma.private.mobileshell as MobileShell
|
2023-10-22 03:59:27 +00:00
|
|
|
import org.kde.kirigami 2.10 as Kirigami
|
|
|
|
|
|
2024-03-06 14:19:03 +00:00
|
|
|
import "./private"
|
2023-10-22 03:59:27 +00:00
|
|
|
import "./delegate"
|
|
|
|
|
|
2023-10-22 17:55:04 +00:00
|
|
|
MouseArea {
|
2023-10-22 03:59:27 +00:00
|
|
|
id: root
|
2024-06-21 04:42:14 +00:00
|
|
|
property Folio.HomeScreen folio
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
property var homeScreen
|
|
|
|
|
|
|
|
|
|
signal delegateDragRequested(var item)
|
|
|
|
|
|
2024-06-21 04:42:14 +00:00
|
|
|
onPressAndHold: folio.HomeScreenState.openSettingsView()
|
2023-10-22 17:55:04 +00:00
|
|
|
|
2023-10-22 03:59:27 +00:00
|
|
|
Repeater {
|
2024-11-07 05:17:57 +00:00
|
|
|
id: repeater
|
2024-06-21 04:42:14 +00:00
|
|
|
model: folio.FavouritesModel
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
delegate: Item {
|
|
|
|
|
id: delegate
|
|
|
|
|
|
2024-11-07 05:17:57 +00:00
|
|
|
readonly property var delegateModel: model.delegate
|
|
|
|
|
readonly property int index: model.index
|
2023-10-22 03:59:27 +00:00
|
|
|
|
2024-11-07 05:17:57 +00:00
|
|
|
readonly property var dragState: folio.HomeScreenState.dragState
|
|
|
|
|
readonly property bool isDropPositionThis: dragState.candidateDropPosition.location === Folio.DelegateDragPosition.Favourites &&
|
2023-10-22 03:59:27 +00:00
|
|
|
dragState.candidateDropPosition.favouritesPosition === delegate.index
|
2024-11-07 05:17:57 +00:00
|
|
|
readonly property bool isAppHoveredOver: folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate &&
|
2023-10-22 03:59:27 +00:00
|
|
|
dragState.dropDelegate &&
|
|
|
|
|
dragState.dropDelegate.type === Folio.FolioDelegate.Application &&
|
|
|
|
|
isDropPositionThis
|
|
|
|
|
|
2024-11-07 05:17:57 +00:00
|
|
|
readonly property bool isLocationBottom: folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom
|
2023-10-22 03:59:27 +00:00
|
|
|
|
2024-11-07 05:17:57 +00:00
|
|
|
// get the normalized index position value from the center so we can animate it
|
|
|
|
|
property double fromCenterValue: model.index - (repeater.count / 2)
|
|
|
|
|
Behavior on fromCenterValue {
|
|
|
|
|
NumberAnimation { duration: 250; easing.type: Easing.InOutQuad; }
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
|
2024-11-07 05:17:57 +00:00
|
|
|
// multiply the 'fromCenterValue' by the cell size to get the actual position
|
|
|
|
|
readonly property int centerPosition: (isLocationBottom ? folio.HomeScreenState.pageCellWidth : folio.HomeScreenState.pageCellHeight) * fromCenterValue
|
|
|
|
|
|
|
|
|
|
x: isLocationBottom ? centerPosition + parent.width / 2 : (parent.width - width) / 2
|
|
|
|
|
y: isLocationBottom ? (parent.height - height) / 2 : parent.height / 2 - centerPosition - folio.HomeScreenState.pageCellHeight
|
|
|
|
|
|
2024-06-21 04:42:14 +00:00
|
|
|
implicitWidth: folio.HomeScreenState.pageCellWidth
|
|
|
|
|
implicitHeight: folio.HomeScreenState.pageCellHeight
|
|
|
|
|
width: folio.HomeScreenState.pageCellWidth
|
|
|
|
|
height: folio.HomeScreenState.pageCellHeight
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
Loader {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
|
|
|
|
sourceComponent: {
|
|
|
|
|
if (delegate.delegateModel.type === Folio.FolioDelegate.Application) {
|
|
|
|
|
return appComponent;
|
|
|
|
|
} else if (delegate.delegateModel.type === Folio.FolioDelegate.Folder) {
|
|
|
|
|
return folderComponent;
|
|
|
|
|
} else {
|
|
|
|
|
// ghost entry
|
|
|
|
|
return placeholderComponent;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: placeholderComponent
|
|
|
|
|
|
2025-03-19 19:38:35 +00:00
|
|
|
// square that shows when hovering over a spot to drop a delegate on (ghost entry)
|
|
|
|
|
PlaceholderDelegate {
|
|
|
|
|
id: dragDropFeedback
|
|
|
|
|
folio: root.folio
|
|
|
|
|
width: folio.HomeScreenState.pageCellWidth
|
|
|
|
|
height: folio.HomeScreenState.pageCellHeight
|
|
|
|
|
}
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: appComponent
|
|
|
|
|
|
|
|
|
|
AppDelegate {
|
|
|
|
|
id: appDelegate
|
2024-06-21 04:42:14 +00:00
|
|
|
folio: root.folio
|
2023-10-22 03:59:27 +00:00
|
|
|
application: delegate.delegateModel.application
|
2024-06-21 04:42:14 +00:00
|
|
|
name: folio.FolioSettings.showFavouritesAppLabels ? delegate.delegateModel.application.name : ""
|
2023-10-22 03:59:27 +00:00
|
|
|
shadow: true
|
|
|
|
|
|
|
|
|
|
turnToFolder: delegate.isAppHoveredOver
|
2024-06-21 04:42:14 +00:00
|
|
|
turnToFolderAnimEnabled: folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
// do not show if the drop animation is running to this delegate
|
|
|
|
|
visible: !(root.homeScreen.dropAnimationRunning && delegate.isDropPositionThis)
|
|
|
|
|
|
|
|
|
|
// don't show label in drag and drop mode
|
|
|
|
|
labelOpacity: delegate.opacity
|
|
|
|
|
|
|
|
|
|
onPressAndHold: {
|
|
|
|
|
let mappedCoords = root.homeScreen.prepareStartDelegateDrag(delegate.delegateModel, appDelegate.delegateItem);
|
2024-06-23 18:21:16 +00:00
|
|
|
folio.HomeScreenState.startDelegateFavouritesDrag(
|
2023-10-22 03:59:27 +00:00
|
|
|
mappedCoords.x,
|
|
|
|
|
mappedCoords.y,
|
2023-11-05 05:14:39 +00:00
|
|
|
appDelegate.pressPosition.x,
|
|
|
|
|
appDelegate.pressPosition.y,
|
2023-10-22 03:59:27 +00:00
|
|
|
delegate.index
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
contextMenu.open();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onPressAndHoldReleased: {
|
|
|
|
|
// cancel the event if the delegate is not dragged
|
2024-06-21 04:42:14 +00:00
|
|
|
if (folio.HomeScreenState.swipeState === Folio.HomeScreenState.AwaitingDraggingDelegate) {
|
2023-10-22 03:59:27 +00:00
|
|
|
homeScreen.cancelDelegateDrag();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onRightMousePress: {
|
|
|
|
|
contextMenu.open();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ContextMenuLoader {
|
|
|
|
|
id: contextMenu
|
|
|
|
|
|
|
|
|
|
// close menu when drag starts
|
|
|
|
|
Connections {
|
2024-06-21 04:42:14 +00:00
|
|
|
target: folio.HomeScreenState
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
function onSwipeStateChanged() {
|
2024-06-21 04:42:14 +00:00
|
|
|
if (folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate) {
|
2023-10-22 03:59:27 +00:00
|
|
|
contextMenu.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
actions: [
|
|
|
|
|
Kirigami.Action {
|
|
|
|
|
icon.name: "emblem-favorite"
|
|
|
|
|
text: i18n("Remove")
|
2024-06-21 04:42:14 +00:00
|
|
|
onTriggered: folio.FavouritesModel.removeEntry(delegate.index)
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: folderComponent
|
|
|
|
|
|
|
|
|
|
AppFolderDelegate {
|
|
|
|
|
id: appFolderDelegate
|
2024-06-21 04:42:14 +00:00
|
|
|
folio: root.folio
|
2023-10-22 03:59:27 +00:00
|
|
|
shadow: true
|
|
|
|
|
folder: delegate.delegateModel.folder
|
2024-06-21 04:42:14 +00:00
|
|
|
name: folio.FolioSettings.showFavouritesAppLabels ? delegate.delegateModel.folder.name : ""
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
// do not show if the drop animation is running to this delegate, and the drop delegate is a folder
|
|
|
|
|
visible: !(root.homeScreen.dropAnimationRunning &&
|
|
|
|
|
delegate.isDropPositionThis &&
|
|
|
|
|
delegate.dragState.dropDelegate.type === Folio.FolioDelegate.Folder)
|
|
|
|
|
|
|
|
|
|
appHoveredOver: delegate.isAppHoveredOver
|
|
|
|
|
|
|
|
|
|
// don't show label in drag and drop mode
|
|
|
|
|
labelOpacity: delegate.opacity
|
|
|
|
|
|
|
|
|
|
onAfterClickAnimation: {
|
|
|
|
|
const pos = homeScreen.prepareFolderOpen(appFolderDelegate.contentItem);
|
2024-06-21 04:42:14 +00:00
|
|
|
folio.HomeScreenState.openFolder(pos.x, pos.y, delegate.delegateModel.folder);
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onPressAndHold: {
|
|
|
|
|
let mappedCoords = root.homeScreen.prepareStartDelegateDrag(delegate.delegateModel, appFolderDelegate.delegateItem);
|
2024-06-21 04:42:14 +00:00
|
|
|
folio.HomeScreenState.startDelegateFavouritesDrag(
|
2023-10-22 03:59:27 +00:00
|
|
|
mappedCoords.x,
|
|
|
|
|
mappedCoords.y,
|
2023-11-05 05:14:39 +00:00
|
|
|
appFolderDelegate.pressPosition.x,
|
|
|
|
|
appFolderDelegate.pressPosition.y,
|
2023-10-22 03:59:27 +00:00
|
|
|
delegate.index
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
contextMenu.open();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onPressAndHoldReleased: {
|
|
|
|
|
// cancel the event if the delegate is not dragged
|
2024-06-21 04:42:14 +00:00
|
|
|
if (folio.HomeScreenState.swipeState === Folio.HomeScreenState.AwaitingDraggingDelegate) {
|
2023-10-22 03:59:27 +00:00
|
|
|
root.homeScreen.cancelDelegateDrag();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onRightMousePress: {
|
|
|
|
|
contextMenu.open();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ContextMenuLoader {
|
|
|
|
|
id: contextMenu
|
|
|
|
|
|
|
|
|
|
// close menu when drag starts
|
|
|
|
|
Connections {
|
2024-06-21 04:42:14 +00:00
|
|
|
target: folio.HomeScreenState
|
2023-10-22 03:59:27 +00:00
|
|
|
|
|
|
|
|
function onSwipeStateChanged() {
|
2024-06-21 04:42:14 +00:00
|
|
|
if (folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate) {
|
2023-10-22 03:59:27 +00:00
|
|
|
contextMenu.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
actions: [
|
|
|
|
|
Kirigami.Action {
|
|
|
|
|
icon.name: "emblem-favorite"
|
|
|
|
|
text: i18n("Remove")
|
2024-03-06 14:19:03 +00:00
|
|
|
onTriggered: deleteDialog.open()
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
]
|
2024-03-06 14:19:03 +00:00
|
|
|
|
|
|
|
|
ConfirmDeleteFolderDialogLoader {
|
|
|
|
|
id: deleteDialog
|
|
|
|
|
parent: root.homeScreen
|
2024-06-21 04:42:14 +00:00
|
|
|
onAccepted: folio.FavouritesModel.removeEntry(delegate.index)
|
2024-03-06 14:19:03 +00:00
|
|
|
}
|
2023-10-22 03:59:27 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|