File: HeaderComponent.qml

package info (click to toggle)
plasma-mobile 6.3.6-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 18,612 kB
  • sloc: xml: 38,470; cpp: 18,437; javascript: 139; sh: 82; makefile: 5
file content (145 lines) | stat: -rw-r--r-- 4,392 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 * SPDX-FileCopyrightText: 2021-2024 Devin Lin <espidev@gmail.com>
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

import QtQuick 2.12
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.1

import org.kde.kirigami as Kirigami
import org.kde.plasma.private.mobileshell as MobileShell
import org.kde.plasma.components 3.0 as PC3

import org.kde.notificationmanager as NotificationManager

Item {
    id: root
    required property real openFactor
    required property real statusBarHeight

    property var notificationsModel: []

    readonly property bool actionDrawerVisible: swipeArea.actionDrawer.intendedToBeVisible

    signal passwordRequested()

    // The status bar and quicksettings take a while to load, don't pause initial lockscreen loading for it
    Timer {
        id: loadTimer
        running: true
        repeat: false
        onTriggered: {
            statusBarLoader.active = true
            actionDrawerLoader.active = true
        }
    }

    // Add loading indicator when status bar has not loaded yet
    PC3.BusyIndicator {
        id: statusBarLoadingIndication
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.topMargin: Kirigami.Units.smallSpacing
        anchors.rightMargin: Kirigami.Units.smallSpacing
        visible: statusBarLoader.status != Loader.Ready

        implicitHeight: root.statusBarHeight
        implicitWidth: root.statusBarHeight

        Kirigami.Theme.inherit: false
        Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
    }

    // Status bar
    Loader {
        id: statusBarLoader
        active: false
        asynchronous: true
        visible: status == Loader.Ready

        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right

        height: root.statusBarHeight

        sourceComponent: MobileShell.StatusBar {
            id: statusBar

            anchors.top: parent.top
            anchors.left: parent.left
            anchors.right: parent.right
            height: root.statusBarHeight

            Kirigami.Theme.inherit: false
            Kirigami.Theme.colorSet: Kirigami.Theme.Complementary

            backgroundColor: "transparent"

            showSecondRow: false
            showDropShadow: true
            showTime: false
            disableSystemTray: true // prevent SIGABRT, since loading the system tray on the lockscreen leads to bad... things
        }
    }

    // Drag down gesture to open action drawer
    MobileShell.ActionDrawerOpenSurface {
        id: swipeArea
        actionDrawer: actionDrawerLoader.item ? actionDrawerLoader.item.actionDrawer : null

        anchors.fill: statusBarLoader
    }

    // Dynamically load on swipe-down to avoid having to load at start
    Loader {
        id: actionDrawerLoader
        active: false
        asynchronous: true
        visible: status == Loader.Ready

        anchors.fill: parent

        sourceComponent: Item {
            property var actionDrawer: drawer

            // Action drawer component
            MobileShell.ActionDrawer {
                id: drawer
                anchors.fill: parent

                visible: offset !== 0
                restrictedPermissions: true

                notificationSettings: NotificationManager.Settings {}
                notificationModel: root.notificationsModel
                notificationModelType: MobileShell.NotificationsModelType.WatchedNotificationsModel

                property bool requestNotificationAction: false

                // notification button clicked, requesting auth
                onPermissionsRequested: {
                    requestNotificationAction = true;
                    drawer.close();
                    root.passwordRequested();
                }
            }

            // listen to authentication events
            Connections {
                target: authenticator
                function onSucceeded() {
                    // run pending action if successfully unlocked
                    if (drawer.requestNotificationAction) {
                        drawer.runPendingAction();
                        drawer.requestNotificationAction = false;
                    }
                }
                function onFailed() {
                    drawer.requestNotificationAction = false;
                }
            }
        }
    }
}