/* * SPDX-FileCopyrightText: 2021 Marco Martin * * SPDX-License-Identifier: GPL-2.0-or-later */ import QtQuick 2.14 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.3 as Controls import QtGraphicalEffects 1.6 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.kquickcontrolsaddons 2.0 import org.kde.plasma.private.containmentlayoutmanager 1.0 as ContainmentLayoutManager import org.kde.plasma.private.mobileshell 1.0 as MobileShell import org.kde.plasma.private.nanoshell 2.0 as NanoShell import org.kde.kirigami 2.14 as Kirigami import org.kde.plasma.private.mobilehomescreencomponents 0.1 as HomeScreenComponents Repeater { id: launcherRepeater model: HomeScreenComponents.FavoritesModel required property var homeScreenState property ContainmentLayoutManager.AppletsLayout appletsLayout property FavoriteStrip favoriteStrip property int cellWidth property int cellHeight signal scrollLeftRequested signal scrollRightRequested signal stopScrollRequested delegate: HomeDelegate { id: delegate homeScreenState: launcherRepeater.homeScreenState width: launcherRepeater.cellWidth height: Math.min(parent.height, launcherRepeater.cellHeight) appletsLayout: launcherRepeater.appletsLayout //just the normal inline binding in height: fails as it gets broken, make it explicit Binding { target: delegate property: "height" value: Math.min(delegate.parent.height, launcherRepeater.cellHeight) } parent: parentFromLocation reservedSpaceForLabel: metrics.height property Item parentFromLocation: { switch (model.applicationLocation) { case HomeScreenComponents.ApplicationListModel.Favorites: return favoriteStrip.flow; case HomeScreenComponents.ApplicationListModel.Desktop: default: return appletsLayout; } } Component.onCompleted: { if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Desktop) { appletsLayout.restoreItem(delegate); } } onUserDrag: { dragCenterX = dragCenter.x; dragCenterY = dragCenter.y; launcherDragManager.dragItem(delegate, dragCenter.x, dragCenter.y); delegate.width = appletsLayout.cellWidth; delegate.height = appletsLayout.cellHeight; var pos = plasmoid.fullRepresentationItem.mapFromItem(delegate, dragCenter.x, dragCenter.y); //SCROLL LEFT if (pos.x < PlasmaCore.Units.gridUnit) { launcherRepeater.scrollLeftRequested(); //SCROLL RIGHT } else if (pos.x > homeScreenState.pageWidth - PlasmaCore.Units.gridUnit) { launcherRepeater.scrollRightRequested(); //DON't SCROLL } else { launcherRepeater.stopScrollRequested(); } } onDragActiveChanged: { launcherDragManager.active = dragActive if (dragActive) { // Must be 0, 0 as at this point dragCenterX and dragCenterY are on the drag before" launcherDragManager.startDrag(delegate); launcherDragManager.currentlyDraggedDelegate = delegate; } else { launcherDragManager.dropItem(delegate, dragCenterX, dragCenterY); plasmoid.editMode = false; editMode = false; launcherRepeater.stopScrollRequested(); launcherDragManager.currentlyDraggedDelegate = null; forceActiveFocus(); } } onLaunch: (x, y, icon, title) => { if (icon !== "") { print(delegate.iconItem) MobileShell.HomeScreenControls.openAppAnimation( icon, title, delegate.iconItem.Kirigami.ScenePosition.x + delegate.iconItem.width/2, delegate.iconItem.Kirigami.ScenePosition.y + delegate.iconItem.height/2, Math.min(delegate.iconItem.width, delegate.iconItem.height)); } } onParentFromLocationChanged: { if (!launcherDragManager.active && parent != parentFromLocation) { parent = parentFromLocation; if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Favorites) { plasmoid.nativeInterface.stackBefore(delegate, parentFromLocation.children[index]); } else if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Grid) { plasmoid.nativeInterface.stackBefore(delegate, parentFromLocation.children[Math.max(0, index - HomeScreenComponents.ApplicationListModel.favoriteCount)]); } } } } }