/* * SPDX-FileCopyrightText: 2021 Devin Lin * SPDX-License-Identifier: GPL-2.0-or-later */ import QtQuick 2.15 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.15 as Controls import org.kde.plasma.components 3.0 as PC3 import org.kde.kirigami as Kirigami import org.kde.plasma.private.mobileshell as MobileShell import org.kde.plasma.private.mobileshell.state as MobileShellState import plasma.applet.org.kde.plasma.mobile.homescreen.halcyon as Halcyon import org.kde.plasma.plasmoid MobileShell.GridView { id: gridView cacheBuffer: cellHeight * 20 // 10 rows above and below reuseItems: true Controls.ScrollBar.vertical: Controls.ScrollBar {} Connections { target: parent function onFocusRequested() { forceActiveFocus(); } } // ensure items aren't visible out of bounds layer.enabled: true readonly property int reservedSpaceForLabel: metrics.height readonly property real effectiveContentWidth: width - leftMargin - rightMargin cellWidth: gridView.effectiveContentWidth / Math.min(Math.floor(effectiveContentWidth / (Kirigami.Units.iconSizes.huge + Kirigami.Units.largeSpacing * 2)), 8) cellHeight: cellWidth + reservedSpaceForLabel property int columns: Math.floor(effectiveContentWidth / cellWidth) property int rows: Math.ceil(Halcyon.ApplicationListModel.count / columns) function goToBeginning() { goToBeginningAnim.restart(); } NumberAnimation on contentY { id: goToBeginningAnim to: gridView.originY duration: Kirigami.Units.longDuration easing.type: Easing.InOutQuad } model: Halcyon.ApplicationListModel header: MobileShell.BaseItem { implicitWidth: gridView.effectiveContentWidth topPadding: Kirigami.Units.gridUnit + Math.round(gridView.height * 0.1) bottomPadding: Kirigami.Units.gridUnit leftPadding: Kirigami.Units.smallSpacing contentItem: PC3.Label { color: "white" font.pointSize: 16 font.weight: Font.Bold text: i18n("Applications") } } PC3.Label { id: metrics text: "M\nM" visible: false font.pointSize: Kirigami.Theme.defaultFont.pointSize * 0.85 font.weight: Font.Bold } Keys.onReturnPressed: currentItem.launchApp() delegate: GridAppDelegate { id: delegate property Halcyon.Application application: model.application width: gridView.cellWidth height: gridView.cellHeight reservedSpaceForLabel: gridView.reservedSpaceForLabel onLaunch: (x, y, icon, title, storageId) => { if (icon !== "") { MobileShellState.ShellDBusClient.openAppLaunchAnimationWithPosition( Plasmoid.screen, icon, title, storageId, 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)); } application.setMinimizedDelegate(delegate); MobileShell.AppLaunch.launchOrActivateApp(application.storageId); } } Component.onCompleted: { goToBeginning(); } }