mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
This converts many of the animation durations to Kirigami units so that they can be controlled system wide. It also speeds up several of the animation durations (ex. in folio) from 800ms to 400ms to improve the feel and responsiveness of the shell.
110 lines
3.4 KiB
QML
110 lines
3.4 KiB
QML
/*
|
|
* SPDX-FileCopyrightText: 2021 Devin Lin <espidev@gmail.com>
|
|
* 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 2.10 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();
|
|
}
|
|
}
|