Warning, /plasma/plasma-desktop/applets/kickoff/package/contents/ui/ApplicationsPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
0003 * SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005
0006 import QtQuick 2.15
0007 import QtQuick.Layouts 1.15
0008 import QtQuick.Templates 2.15 as T
0009 import QtQml 2.15
0010 import org.kde.plasma.private.kicker 0.1 as Kicker
0011 import org.kde.kirigami 2.20 as Kirigami
0012 import org.kde.plasma.plasmoid 2.0
0013
0014 BasePage {
0015 id: root
0016 sideBarComponent: KickoffListView {
0017 id: sideBar
0018 focus: true // needed for Loaders
0019 model: kickoff.rootModel
0020 // needed otherwise app displayed at top-level will show a first character as group.
0021 section.property: ""
0022 delegate: KickoffListDelegate {
0023 width: view.availableWidth
0024 isCategoryListItem: true
0025 }
0026 }
0027 contentAreaComponent: VerticalStackView {
0028 id: stackView
0029
0030 popEnter: Transition {
0031 NumberAnimation {
0032 property: "x"
0033 from: 0.5 * root.width
0034 to: 0
0035 duration: Kirigami.Units.longDuration
0036 easing.type: Easing.OutCubic
0037 }
0038 NumberAnimation {
0039 property: "opacity"
0040 from: 0.0
0041 to: 1.0
0042 duration: Kirigami.Units.longDuration
0043 easing.type: Easing.OutCubic
0044 }
0045 }
0046
0047 pushEnter: Transition {
0048 NumberAnimation {
0049 property: "x"
0050 from: 0.5 * -root.width
0051 to: 0
0052 duration: Kirigami.Units.longDuration
0053 easing.type: Easing.OutCubic
0054 }
0055 NumberAnimation {
0056 property: "opacity"
0057 from: 0.0
0058 to: 1.0
0059 duration: Kirigami.Units.longDuration
0060 easing.type: Easing.OutCubic
0061 }
0062 }
0063
0064 readonly property string preferredFavoritesViewObjectName: Plasmoid.configuration.favoritesDisplay === 0 ? "favoritesGridView" : "favoritesListView"
0065 readonly property Component preferredFavoritesViewComponent: Plasmoid.configuration.favoritesDisplay === 0 ? favoritesGridViewComponent : favoritesListViewComponent
0066 readonly property string preferredAllAppsViewObjectName: Plasmoid.configuration.applicationsDisplay === 0 ? "listOfGridsView" : "applicationsListView"
0067 readonly property Component preferredAllAppsViewComponent: Plasmoid.configuration.applicationsDisplay === 0 ? listOfGridsViewComponent : applicationsListViewComponent
0068
0069 readonly property string preferredAppsViewObjectName: Plasmoid.configuration.applicationsDisplay === 0 ? "applicationsGridView" : "applicationsListView"
0070 readonly property Component preferredAppsViewComponent: Plasmoid.configuration.applicationsDisplay === 0 ? applicationsGridViewComponent : applicationsListViewComponent
0071 // NOTE: The 0 index modelForRow isn't supposed to be used. That's just how it works.
0072 // But to trigger model data update, set initial value to 0
0073 property int appsModelRow: 0
0074 readonly property Kicker.AppsModel appsModel: kickoff.rootModel.modelForRow(appsModelRow)
0075 focus: true
0076 initialItem: preferredFavoritesViewComponent
0077
0078 Component {
0079 id: favoritesListViewComponent
0080 DropAreaListView {
0081 id: favoritesListView
0082 objectName: "favoritesListView"
0083 mainContentView: true
0084 focus: true
0085 model: kickoff.rootModel.favoritesModel
0086 }
0087 }
0088
0089 Component {
0090 id: favoritesGridViewComponent
0091 DropAreaGridView {
0092 id: favoritesGridView
0093 objectName: "favoritesGridView"
0094 focus: true
0095 model: kickoff.rootModel.favoritesModel
0096 }
0097 }
0098
0099 Component {
0100 id: applicationsListViewComponent
0101
0102 KickoffListView {
0103 id: applicationsListView
0104 objectName: "applicationsListView"
0105 mainContentView: true
0106 model: stackView.appsModel
0107 // we want to semantically switch between group and "", disabling grouping, workaround for QTBUG-121797
0108 section.property: model && model.description === "KICKER_ALL_MODEL" ? "group" : "_unset"
0109 section.criteria: ViewSection.FirstCharacter
0110 hasSectionView: stackView.appsModelRow === 1
0111
0112 onShowSectionViewRequested: sectionName => {
0113 stackView.push(applicationsSectionViewComponent, {
0114 "currentSection": sectionName,
0115 "parentView": applicationsListView
0116 });
0117 }
0118 }
0119 }
0120
0121 Component {
0122 id: applicationsSectionViewComponent
0123
0124 SectionView {
0125 id: sectionView
0126 model: stackView.appsModel.sections
0127
0128 onHideSectionViewRequested: index => {
0129 stackView.pop();
0130 stackView.currentItem.view.positionViewAtIndex(index, ListView.Beginning);
0131 stackView.currentItem.currentIndex = index;
0132 }
0133 }
0134 }
0135
0136 Component {
0137 id: applicationsGridViewComponent
0138 KickoffGridView {
0139 id: applicationsGridView
0140 objectName: "applicationsGridView"
0141 model: stackView.appsModel
0142 }
0143 }
0144
0145 Component {
0146 id: listOfGridsViewComponent
0147
0148 ListOfGridsView {
0149 id: listOfGridsView
0150 objectName: "listOfGridsView"
0151 mainContentView: true
0152 gridModel: stackView.appsModel
0153
0154 onShowSectionViewRequested: sectionName => {
0155 stackView.push(applicationsSectionViewComponent, {
0156 currentSection: sectionName,
0157 parentView: listOfGridsView
0158 });
0159 }
0160 }
0161 }
0162
0163 onPreferredFavoritesViewComponentChanged: {
0164 if (root.sideBarItem !== null && root.sideBarItem.currentIndex === 0) {
0165 stackView.replace(stackView.preferredFavoritesViewComponent)
0166 }
0167 }
0168 onPreferredAllAppsViewComponentChanged: {
0169 if (root.sideBarItem !== null && root.sideBarItem.currentIndex === 1) {
0170 stackView.replace(stackView.preferredAllAppsViewComponent)
0171 }
0172 }
0173 onPreferredAppsViewComponentChanged: {
0174 if (root.sideBarItem !== null && root.sideBarItem.currentIndex > 1) {
0175 stackView.replace(stackView.preferredAppsViewComponent)
0176 }
0177 }
0178
0179 Connections {
0180 target: root.sideBarItem
0181 function onCurrentIndexChanged() {
0182 // Only update row index if the condition is met.
0183 // The 0 index modelForRow isn't supposed to be used. That's just how it works.
0184 if (root.sideBarItem.currentIndex > 0) {
0185 appsModelRow = root.sideBarItem.currentIndex
0186 }
0187 if (root.sideBarItem.currentIndex === 0
0188 && stackView.currentItem.objectName !== stackView.preferredFavoritesViewObjectName) {
0189 stackView.replace(stackView.preferredFavoritesViewComponent)
0190 } else if (root.sideBarItem.currentIndex === 1
0191 && stackView.currentItem.objectName !== stackView.preferredAllAppsViewObjectName) {
0192 stackView.replace(stackView.preferredAllAppsViewComponent)
0193 } else if (root.sideBarItem.currentIndex > 1
0194 && stackView.currentItem.objectName !== stackView.preferredAppsViewObjectName) {
0195 stackView.replace(stackView.preferredAppsViewComponent)
0196 }
0197 }
0198 }
0199 Connections {
0200 target: kickoff
0201 function onExpandedChanged() {
0202 if (kickoff.expanded) {
0203 kickoff.contentArea.currentItem.forceActiveFocus()
0204 }
0205 }
0206 }
0207 }
0208 // NormalPage doesn't get destroyed when deactivated, so the binding uses
0209 // StackView.status and visible. This way the bindings are reset when
0210 // NormalPage is Activated again.
0211 Binding {
0212 target: kickoff
0213 property: "sideBar"
0214 value: root.sideBarItem
0215 when: root.T.StackView.status === T.StackView.Active && root.visible
0216 restoreMode: Binding.RestoreBinding
0217 }
0218 Binding {
0219 target: kickoff
0220 property: "contentArea"
0221 value: root.contentAreaItem.currentItem // NOT just root.contentAreaItem
0222 when: root.T.StackView.status === T.StackView.Active && root.visible
0223 restoreMode: Binding.RestoreBinding
0224 }
0225 }