Warning, /plasma/plasma-mobile/containments/homescreens/folio/package/contents/ui/HomeScreen.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
0002 // SPDX-License-Identifier: LGPL-2.0-or-later
0003 
0004 import QtQuick
0005 import QtQuick.Window
0006 import QtQuick.Layouts
0007 import QtQuick.Effects
0008 import QtQuick.Controls as QQC2
0009 
0010 import org.kde.kirigami 2.20 as Kirigami
0011 
0012 import org.kde.plasma.plasmoid 2.0
0013 import org.kde.plasma.components 3.0 as PC3
0014 import org.kde.plasma.private.mobileshell as MobileShell
0015 import org.kde.private.mobile.homescreen.folio 1.0 as Folio
0016 
0017 import "./delegate"
0018 import "./settings"
0019 
0020 Item {
0021     id: root
0022 
0023     property real topMargin: 0
0024     property real bottomMargin: 0
0025     property real leftMargin: 0
0026     property real rightMargin: 0
0027 
0028     property bool interactive: true
0029 
0030     property Folio.HomeScreenState homeScreenState: Folio.HomeScreenState
0031 
0032     // non-widget drop animation
0033     readonly property bool dropAnimationRunning: delegateDragItem.dropAnimationRunning || widgetDragItem.dropAnimationRunning
0034 
0035     // widget that is currently being dragged (or dropped)
0036     readonly property Folio.FolioWidget currentlyDraggedWidget: widgetDragItem.widget
0037 
0038     // how much to scale out in the settings mode
0039     readonly property real settingsModeHomeScreenScale: 0.8
0040 
0041     onTopMarginChanged: Folio.HomeScreenState.viewTopPadding = root.topMargin
0042     onBottomMarginChanged: Folio.HomeScreenState.viewBottomPadding = root.bottomMargin
0043     onLeftMarginChanged: Folio.HomeScreenState.viewLeftPadding = root.leftMargin
0044     onRightMarginChanged: Folio.HomeScreenState.viewRightPadding = root.rightMargin
0045 
0046     // called by any delegates when starting drag
0047     // returns the mapped coordinates to be used in the home screen state
0048     function prepareStartDelegateDrag(delegate, item) {
0049         swipeArea.setSkipSwipeThreshold(true);
0050 
0051         if (delegate) {
0052             delegateDragItem.delegate = delegate;
0053         }
0054         return root.mapFromItem(item, 0, 0);
0055     }
0056 
0057     function cancelDelegateDrag() {
0058         homeScreenState.cancelDelegateDrag();
0059     }
0060 
0061     // sets the coordinates for the folder opening/closing animation
0062     function prepareFolderOpen(item) {
0063         return root.mapFromItem(item, 0, 0);
0064     }
0065 
0066     function openConfigure() {
0067         Plasmoid.internalAction("configure").trigger();
0068     }
0069 
0070     // determine how tall an app label is, for delegate measurements
0071     DelegateLabel {
0072         id: appLabelMetrics
0073         text: "M\nM"
0074         visible: false
0075 
0076         onHeightChanged: Folio.HomeScreenState.pageDelegateLabelHeight = appLabelMetrics.height
0077 
0078         Component.onCompleted: {
0079             Folio.HomeScreenState.pageDelegateLabelWidth = Kirigami.Units.smallSpacing;
0080         }
0081     }
0082 
0083     // determine screen dimensions
0084     Item {
0085         id: screenDimensions
0086         anchors.fill: parent
0087 
0088         onWidthChanged: Folio.HomeScreenState.viewWidth = width;
0089         onHeightChanged: Folio.HomeScreenState.viewHeight = height;
0090     }
0091 
0092     // a way of stopping focus
0093     FocusScope {
0094         id: noFocus
0095     }
0096 
0097     // area that can be swiped
0098     MobileShell.SwipeArea {
0099         id: swipeArea
0100         anchors.fill: parent
0101 
0102         interactive: root.interactive &&
0103             settings.homeScreenInteractive &&
0104             (appDrawer.flickable.contentY <= 10 || // disable the swipe area when we are swiping in the app drawer, and not in drag-and-drop
0105                 Folio.HomeScreenState.swipeState === Folio.HomeScreenState.AwaitingDraggingDelegate ||
0106                 Folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate ||
0107                 Folio.HomeScreenState.swipeState === Folio.HomeScreenState.SwipingAppDrawerGrid ||
0108                 Folio.HomeScreenState.viewState !== Folio.HomeScreenState.AppDrawerView)
0109 
0110         onSwipeStarted: {
0111             homeScreenState.swipeStarted();
0112         }
0113         onSwipeEnded: {
0114             homeScreenState.swipeEnded();
0115         }
0116         onSwipeMove: (totalDeltaX, totalDeltaY, deltaX, deltaY) => {
0117             homeScreenState.swipeMoved(totalDeltaX, totalDeltaY, deltaX, deltaY);
0118         }
0119 
0120         onPressedChanged: {
0121             if (pressed) {
0122                 // ensures that components like the widget settings overlay close when swiping
0123                 noFocus.forceActiveFocus();
0124             }
0125         }
0126 
0127         SettingsComponent {
0128             id: settings
0129             width: parent.width
0130             height: parent.height
0131             opacity: Folio.HomeScreenState.settingsOpenProgress
0132             z: 1
0133 
0134             // move the settings out of the way if it is not visible
0135             // NOTE: we do this instead of setting visible to false, because
0136             //       it doesn't mess with widget drag and drop
0137             y: (opacity > 0) ? 0 : parent.height
0138 
0139             settingsModeHomeScreenScale: root.settingsModeHomeScreenScale
0140             homeScreen: root
0141         }
0142 
0143         Item {
0144             id: mainHomeScreen
0145             anchors.fill: parent
0146 
0147             // we stop showing halfway through the animation
0148             opacity: 1 - Math.max(homeScreenState.appDrawerOpenProgress, homeScreenState.searchWidgetOpenProgress, homeScreenState.folderOpenProgress) * 2
0149             visible: opacity > 0 // prevent handlers from picking up events
0150 
0151             transform: [
0152                 Scale {
0153                     property real scaleFactor: Math.max(homeScreenState.appDrawerOpenProgress, homeScreenState.searchWidgetOpenProgress)
0154                     origin.x: mainHomeScreen.width / 2
0155                     origin.y: mainHomeScreen.height / 2
0156                     yScale: 1 - (scaleFactor * 2) * 0.1
0157                     xScale: 1 - (scaleFactor * 2) * 0.1
0158                 }
0159             ]
0160 
0161             HomeScreenPages {
0162                 id: homeScreenPages
0163                 homeScreen: root
0164 
0165                 anchors.topMargin: root.topMargin
0166                 anchors.leftMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Left ? 0 : root.leftMargin
0167                 anchors.rightMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Right ? 0 : root.rightMargin
0168                 anchors.bottomMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom ? 0 : root.bottomMargin
0169 
0170                 // update the model with page dimensions
0171                 onWidthChanged: {
0172                     homeScreenState.pageWidth = homeScreenPages.width;
0173                 }
0174                 onHeightChanged: {
0175                     homeScreenState.pageHeight = homeScreenPages.height;
0176                 }
0177 
0178                 transform: [
0179                     Scale {
0180                         // animation when settings opens
0181                         property real scaleFactor: 1 - Folio.HomeScreenState.settingsOpenProgress * (1 - settingsModeHomeScreenScale)
0182                         origin.x: root.leftMargin + (root.width - root.rightMargin - root.leftMargin) / 2
0183                         origin.y: root.height * settingsModeHomeScreenScale / 2
0184                         xScale: scaleFactor
0185                         yScale: scaleFactor
0186                     }
0187                 ]
0188 
0189                 states: [
0190                     State {
0191                         name: "bottom"
0192                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom
0193                         AnchorChanges {
0194                             target: homeScreenPages
0195                             anchors.top: parent.top
0196                             anchors.bottom: favouritesBar.top
0197                             anchors.left: parent.left
0198                             anchors.right: parent.right
0199                         }
0200                     }, State {
0201                         name: "left"
0202                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Left
0203                         AnchorChanges {
0204                             target: homeScreenPages
0205                             anchors.top: parent.top
0206                             anchors.bottom: parent.bottom
0207                             anchors.left: favouritesBar.right
0208                             anchors.right: parent.right
0209                         }
0210                     }, State {
0211                         name: "right"
0212                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Right
0213                         AnchorChanges {
0214                             target: homeScreenPages
0215                             anchors.top: parent.top
0216                             anchors.bottom: parent.bottom
0217                             anchors.left: parent.left
0218                             anchors.right: favouritesBar.left
0219                         }
0220                     }
0221                 ]
0222             }
0223 
0224             Rectangle {
0225                 id: favouritesBarScrim
0226                 color: Qt.rgba(255, 255, 255, 0.2)
0227 
0228                 // don't show in settings mode
0229                 opacity: 1 - Folio.HomeScreenState.settingsOpenProgress
0230                 visible: Folio.FolioSettings.showFavouritesBarBackground
0231 
0232                 anchors.top: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom ? favouritesBar.top : parent.top
0233                 anchors.bottom: parent.bottom
0234                 anchors.left: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Right ? favouritesBar.left : parent.left
0235                 anchors.right: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Left ? favouritesBar.right : parent.right
0236 
0237                 // because of the scale animation, we need to extend the panel out a bit
0238                 anchors.topMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom ? 0 : -Kirigami.Units.gridUnit * 5
0239                 anchors.bottomMargin: -Kirigami.Units.gridUnit * 5
0240                 anchors.leftMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Right ? 0 : -Kirigami.Units.gridUnit * 5
0241                 anchors.rightMargin: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Left ? 0 : -Kirigami.Units.gridUnit * 5
0242             }
0243 
0244             FavouritesBar {
0245                 id: favouritesBar
0246                 homeScreen: root
0247                 leftMargin: root.leftMargin
0248                 topMargin: root.topMargin
0249 
0250                 // don't show in settings mode
0251                 opacity: 1 - Folio.HomeScreenState.settingsOpenProgress
0252                 visible: opacity > 0
0253 
0254                 // one is ignored as anchors are set
0255                 height: Kirigami.Units.gridUnit * 6
0256                 width: Kirigami.Units.gridUnit * 6
0257 
0258                 anchors.topMargin: root.topMargin
0259                 anchors.bottomMargin: root.bottomMargin
0260                 anchors.leftMargin: root.leftMargin
0261                 anchors.rightMargin: root.rightMargin
0262 
0263                 states: [
0264                     State {
0265                         name: "bottom"
0266                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom
0267                         AnchorChanges {
0268                             target: favouritesBar
0269                             anchors.top: undefined
0270                             anchors.bottom: parent.bottom
0271                             anchors.left: parent.left
0272                             anchors.right: parent.right
0273                         }
0274                         PropertyChanges {
0275                             target: favouritesBar
0276                             height: Kirigami.Units.gridUnit * 6
0277                         }
0278                     }, State {
0279                         name: "left"
0280                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Left
0281                         AnchorChanges {
0282                             target: favouritesBar
0283                             anchors.top: parent.top
0284                             anchors.bottom: parent.bottom
0285                             anchors.left: parent.left
0286                             anchors.right: undefined
0287                         }
0288                         PropertyChanges {
0289                             target: favouritesBar
0290                             width: Kirigami.Units.gridUnit * 6
0291                         }
0292                     }, State {
0293                         name: "right"
0294                         when: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Right
0295                         AnchorChanges {
0296                             target: favouritesBar
0297                             anchors.top: parent.top
0298                             anchors.bottom: parent.bottom
0299                             anchors.left: undefined
0300                             anchors.right: parent.right
0301                         }
0302                         PropertyChanges {
0303                             target: favouritesBar
0304                             width: Kirigami.Units.gridUnit * 6
0305                         }
0306                     }
0307                 ]
0308             }
0309 
0310             Item {
0311                 id: pageIndicatorWrapper
0312                 property bool favouritesBarAtBottom: Folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom
0313 
0314                 // don't show in settings mode
0315                 opacity: 1 - Folio.HomeScreenState.settingsOpenProgress
0316 
0317                 anchors.top: parent.top
0318                 anchors.left: parent.left
0319                 anchors.right: parent.right
0320                 anchors.bottom: favouritesBarAtBottom ? favouritesBar.top : parent.bottom
0321 
0322                 anchors.topMargin: root.topMargin
0323                 anchors.leftMargin: root.leftMargin
0324                 anchors.rightMargin: root.rightMargin
0325                 anchors.bottomMargin: favouritesBarAtBottom ? 0 : (root.bottomMargin + Kirigami.Units.largeSpacing)
0326 
0327                 QQC2.PageIndicator {
0328                     visible: count > 1
0329                     Kirigami.Theme.inherit: false
0330                     Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
0331 
0332                     anchors.horizontalCenter: parent.horizontalCenter
0333                     anchors.bottom: parent.bottom
0334 
0335                     currentIndex: Folio.HomeScreenState.currentPage
0336                     count: Folio.PageListModel.length
0337                 }
0338             }
0339         }
0340 
0341         // folder view
0342         FolderView {
0343             id: folderView
0344             anchors.fill: parent
0345             anchors.topMargin: root.topMargin
0346             anchors.leftMargin: root.leftMargin
0347             anchors.rightMargin: root.rightMargin
0348             anchors.bottomMargin: root.bottomMargin
0349 
0350             homeScreen: root
0351             opacity: homeScreenState.folderOpenProgress
0352             transform: Translate { y: folderView.opacity > 0 ? 0 : folderView.height }
0353         }
0354 
0355         // drag and drop component
0356         DelegateDragItem {
0357             id: delegateDragItem
0358         }
0359 
0360         // drag and drop for widgets
0361         WidgetDragItem {
0362             id: widgetDragItem
0363         }
0364 
0365         // bottom app drawer
0366         AppDrawer {
0367             id: appDrawer
0368             width: parent.width
0369             height: parent.height
0370 
0371             homeScreen: root
0372 
0373             // we only start showing it halfway through
0374             opacity: homeScreenState.appDrawerOpenProgress < 0.5 ? 0 : (homeScreenState.appDrawerOpenProgress - 0.5) * 2
0375 
0376             // position for animation
0377             property real animationY: (1 - homeScreenState.appDrawerOpenProgress) * (Kirigami.Units.gridUnit * 2)
0378 
0379             // move the app drawer out of the way if it is not visible
0380             // NOTE: we do this instead of setting visible to false, because
0381             //       it doesn't mess with app drag and drop from the app drawer
0382             y: (opacity > 0) ? animationY : parent.height
0383 
0384             headerHeight: Math.round(Kirigami.Units.gridUnit * 5)
0385             headerItem: AppDrawerHeader {}
0386 
0387             // account for panels
0388             topPadding: root.topMargin
0389             bottomPadding: root.bottomMargin
0390             leftPadding: root.leftMargin
0391             rightPadding: root.rightMargin
0392 
0393             Connections {
0394                 target: Folio.HomeScreenState
0395 
0396                 function onAppDrawerClosed() {
0397                     // reset app drawer position when closed
0398                     appDrawer.flickable.contentY = 0;
0399                 }
0400             }
0401         }
0402 
0403         // search component
0404         MobileShell.KRunnerScreen {
0405             id: searchWidget
0406             anchors.fill: parent
0407 
0408             opacity: homeScreenState.searchWidgetOpenProgress
0409             visible: opacity > 0
0410             transform: Translate { y: (1 - homeScreenState.searchWidgetOpenProgress) * (-Kirigami.Units.gridUnit * 2) }
0411 
0412             onVisibleChanged: {
0413                 if (!visible) {
0414                     // clear search bar when closed
0415                     searchWidget.clearField();
0416                 }
0417             }
0418 
0419             // focus the search bar if it opens
0420             Connections {
0421                 target: Folio.HomeScreenState
0422 
0423                 function onSearchWidgetOpenProgressChanged() {
0424                     if (homeScreenState.searchWidgetOpenProgress === 1.0) {
0425                         searchWidget.requestFocus();
0426                     } else {
0427                         // TODO this gets called a lot, can we have a more performant way?
0428                         root.forceActiveFocus();
0429                     }
0430                 }
0431             }
0432 
0433             onRequestedClose: {
0434                 homeScreenState.closeSearchWidget();
0435             }
0436 
0437             anchors.topMargin: root.topMargin
0438             anchors.bottomMargin: root.bottomMargin
0439             anchors.leftMargin: root.leftMargin
0440             anchors.rightMargin: root.rightMargin
0441         }
0442     }
0443 }