Warning, /plasma/plasma-mobile/containments/homescreens/halcyon/package/contents/ui/GridAppDelegate.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 import QtQuick 0008 import QtQuick.Layouts 0009 import QtQuick.Effects 0010 import QtQuick.Controls as Controls 0011 0012 import org.kde.plasma.core as PlasmaCore 0013 import org.kde.plasma.components 3.0 as PlasmaComponents 0014 import org.kde.kquickcontrolsaddons 0015 0016 import org.kde.plasma.private.mobileshell as MobileShell 0017 import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings 0018 import org.kde.private.mobile.homescreen.halcyon as Halcyon 0019 0020 import org.kde.kirigami as Kirigami 0021 0022 MouseArea { 0023 id: delegate 0024 width: GridView.view.cellWidth 0025 height: GridView.view.cellHeight 0026 0027 property Halcyon.Application application: model.application 0028 0029 property int reservedSpaceForLabel 0030 property alias iconItem: icon 0031 0032 readonly property real margins: Math.floor(width * 0.2) 0033 0034 signal launch(int x, int y, var source, string title, string storageId) 0035 0036 function openContextMenu() { 0037 dialogLoader.active = true; 0038 dialogLoader.item.open(); 0039 } 0040 0041 cursorShape: Qt.PointingHandCursor 0042 acceptedButtons: Qt.LeftButton | Qt.RightButton 0043 onPressAndHold: openContextMenu() 0044 0045 function launchApp() { 0046 // launch app 0047 if (application.running) { 0048 delegate.launch(0, 0, "", application.name, application.storageId); 0049 } else { 0050 delegate.launch(delegate.x + (Kirigami.Units.smallSpacing * 2), delegate.y + (Kirigami.Units.smallSpacing * 2), icon.source, application.name, application.storageId); 0051 } 0052 } 0053 0054 Loader { 0055 id: dialogLoader 0056 active: false 0057 0058 sourceComponent: PlasmaComponents.Menu { 0059 title: label.text 0060 closePolicy: PlasmaComponents.Menu.CloseOnReleaseOutside | PlasmaComponents.Menu.CloseOnEscape 0061 0062 PlasmaComponents.MenuItem { 0063 icon.name: "emblem-favorite" 0064 text: i18n("Add to favourites") 0065 onClicked: { 0066 Halcyon.PinnedModel.addApp(application.storageId, 0); 0067 } 0068 } 0069 onClosed: dialogLoader.active = false 0070 } 0071 } 0072 0073 // grow/shrink animation 0074 property real zoomScale: 1 0075 transform: Scale { 0076 origin.x: delegate.width / 2; 0077 origin.y: delegate.height / 2; 0078 xScale: delegate.zoomScale 0079 yScale: delegate.zoomScale 0080 } 0081 0082 property bool launchAppRequested: false 0083 0084 NumberAnimation on zoomScale { 0085 id: shrinkAnim 0086 running: false 0087 duration: ShellSettings.Settings.animationsEnabled ? 80 : 1 0088 to: ShellSettings.Settings.animationsEnabled ? 0.8 : 1 0089 onFinished: { 0090 if (!delegate.pressed) { 0091 growAnim.restart(); 0092 } 0093 } 0094 } 0095 0096 NumberAnimation on zoomScale { 0097 id: growAnim 0098 running: false 0099 duration: ShellSettings.Settings.animationsEnabled ? 80 : 1 0100 to: 1 0101 onFinished: { 0102 if (delegate.launchAppRequested) { 0103 delegate.launchApp(); 0104 delegate.launchAppRequested = false; 0105 } 0106 } 0107 } 0108 0109 onPressedChanged: { 0110 if (pressed) { 0111 growAnim.stop(); 0112 shrinkAnim.restart(); 0113 } else if (!pressed && !shrinkAnim.running) { 0114 growAnim.restart(); 0115 } 0116 } 0117 // launch app handled by press animation 0118 onClicked: mouse => { 0119 if (mouse.button === Qt.RightButton) { 0120 openContextMenu(); 0121 } else { 0122 launchAppRequested = true; 0123 } 0124 } 0125 0126 ColumnLayout { 0127 anchors { 0128 fill: parent 0129 leftMargin: margins 0130 topMargin: margins 0131 rightMargin: margins 0132 bottomMargin: margins 0133 } 0134 spacing: 0 0135 0136 Kirigami.Icon { 0137 id: icon 0138 0139 Kirigami.Theme.inherit: false 0140 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0141 0142 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop 0143 Layout.fillWidth: true 0144 Layout.preferredHeight: Math.floor(parent.height - delegate.reservedSpaceForLabel) 0145 Layout.maximumHeight: labelFontMetrics.height * 7 0146 Layout.topMargin: Math.max(0, Layout.preferredHeight - height) 0147 0148 source: application.icon 0149 0150 Rectangle { 0151 anchors { 0152 horizontalCenter: parent.horizontalCenter 0153 bottom: parent.bottom 0154 } 0155 visible: application.running 0156 radius: width 0157 width: Kirigami.Units.smallSpacing 0158 height: width 0159 color: Kirigami.Theme.highlightColor 0160 } 0161 0162 // darken effect when hovered/pressed 0163 layer { 0164 enabled: delegate.pressed 0165 effect: MultiEffect { 0166 colorization: 1.0 0167 colorizationColor: Qt.rgba(0, 0, 0, 0.3) 0168 } 0169 } 0170 0171 FontMetrics { 0172 id: labelFontMetrics 0173 font: label.font 0174 } 0175 } 0176 0177 PlasmaComponents.Label { 0178 id: label 0179 visible: text.length > 0 0180 0181 Layout.fillWidth: true 0182 Layout.preferredHeight: delegate.reservedSpaceForLabel 0183 Layout.topMargin: Kirigami.Units.smallSpacing 0184 Layout.leftMargin: -parent.anchors.leftMargin + Kirigami.Units.smallSpacing 0185 Layout.rightMargin: -parent.anchors.rightMargin + Kirigami.Units.smallSpacing 0186 0187 wrapMode: Text.WordWrap 0188 maximumLineCount: 2 0189 horizontalAlignment: Text.AlignHCenter 0190 verticalAlignment: Text.AlignTop 0191 elide: Text.ElideRight 0192 0193 text: application.name 0194 0195 font.pointSize: Kirigami.Theme.defaultFont.pointSize * 0.85 0196 font.weight: Font.Bold 0197 color: "white" 0198 } 0199 } 0200 } 0201 0202