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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
/*
SPDX-FileCopyrightText: 2018-2019 Kai Uwe Broulik <kde@privat.broulik.de>
SPDX-FileCopyrightText: 2024 Marco Martin <mart@kde.org>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami as Kirigami
import org.kde.kquickcontrolsaddons as KQuickControlsAddons
import org.kde.notificationmanager as NotificationManager
import org.kde.plasma.private.notifications as Notifications
import "../components" as Components
BaseDelegate {
id: delegateRoot
Layout.preferredWidth: footerLoader.item?.implicitWidth ?? -1
body: bodyLabel
icon: icon
footer: footerLoader.item
columns: 3
Accessible.role: Accessible.Notification
readonly property int __firstColumn: modelInterface.urgency === NotificationManager.Notifications.CriticalUrgency ? 1 : 0
PlasmaExtras.PlasmoidHeading {
id: heading
topInset: 0
Layout.fillWidth: true
Layout.columnSpan: delegateRoot.__firstColumn + 2
bottomPadding: 0
// We want the close button borders to touch popup borders
leftPadding: Layout.mirrored ? -modelInterface.popupLeftPadding : 0
rightPadding: Layout.mirrored ? 0 : -modelInterface.popupRightPadding
// HACK PlasmoidHeading is a QQC2 Control which accepts left mouse button by default,
// which breaks the popup default action mouse handler, cf. QTBUG-89785
Component.onCompleted: Notifications.InputDisabler.makeTransparentForInput(this)
contentItem: Components.NotificationHeader {
modelInterface: delegateRoot.modelInterface
}
}
// Horizontal timeout indicator
Item {
Layout.fillWidth: true
Layout.row: 1
Layout.columnSpan: delegateRoot.__firstColumn + 2
// Hug the top, left, and right
Layout.topMargin: -((delegateRoot.rowSpacing * 2) + height)
Layout.leftMargin: -delegateRoot.modelInterface.popupLeftPadding
Layout.rightMargin: -delegateRoot.modelInterface.popupRightPadding
implicitHeight: 2
implicitWidth: -1
visible: !criticalNotificationIndicator.visible
Rectangle {
readonly property real completionFraction: delegateRoot.modelInterface.remainingTime / delegateRoot.modelInterface.timeout
height: parent.height
width: Math.round(parent.width * completionFraction)
anchors.left: parent.left
color: Kirigami.Theme.highlightColor
}
}
Rectangle {
id: criticalNotificationIndicator
Layout.fillHeight: true
Layout.leftMargin: Layout.mirrored ? 0 : -modelInterface.popupLeftPadding
Layout.rightMargin: Layout.mirrored ? -modelInterface.popupRightPadding : 0
Layout.topMargin: -delegateRoot.rowSpacing
Layout.bottomMargin: -delegateRoot.rowSpacing
Layout.rowSpan: 3
implicitWidth: 4
height: parent.height
color: Kirigami.Theme.neutralTextColor
visible: modelInterface.urgency === NotificationManager.Notifications.CriticalUrgency
}
Components.Summary {
id: summary
// Base layout intentionally has no row spacing, so add top padding here when needed
Layout.topMargin: delegateRoot.hasBodyText || icon.visible ? Kirigami.Units.smallSpacing : 0
Layout.fillWidth: true
Layout.row: 2
Layout.column: delegateRoot.__firstColumn
Layout.columnSpan: icon.visible ? 1 : 2
modelInterface: delegateRoot.modelInterface
KQuickControlsAddons.MouseEventListener {
anchors.fill: parent
visible: modelInterface.hasDefaultAction && !delegateRoot.hasBodyText
onClicked: modelInterface.defaultActionInvoked();
}
}
Components.Icon {
id: icon
// Base layout intentionally has no row spacing, so add top padding here
Layout.topMargin: Kirigami.Units.smallSpacing
Layout.row: 2
Layout.column: delegateRoot.__firstColumn + 1
Layout.rowSpan: 2
modelInterface: delegateRoot.modelInterface
}
KQuickControlsAddons.MouseEventListener {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.row: summary.visible ? 3 : 2
Layout.column: delegateRoot.__firstColumn
Layout.columnSpan: icon.visible ? 1 : 2
Layout.maximumHeight: Kirigami.Units.gridUnit * modelInterface.maximumLineCount
// The body doesn't need to influence the implicit width in any way, this avoids a binding loop
implicitWidth: -1
implicitHeight: scroll.implicitHeight
visible: delegateRoot.hasBodyText
onClicked: {
if (modelInterface.hasDefaultAction) {
modelInterface.defaultActionInvoked();
}
}
PlasmaComponents3.ScrollView {
id: scroll
anchors.fill: parent
contentWidth: bodyLabel.width
// This avoids a binding loop
PlasmaComponents3.ScrollBar.vertical.visible: modelInterface.maximumLineCount > 0 && bodyLabel.implicitHeight > parent.Layout.maximumHeight
PlasmaComponents3.ScrollBar.horizontal.visible: false
Components.Body {
id: bodyLabel
width: scroll.contentItem.width
modelInterface: delegateRoot.modelInterface
Accessible.ignored: true // ignore HTML body in favor of Accessible.description on delegateRoot
}
}
}
Components.FooterLoader {
id: footerLoader
Layout.fillWidth: true
Layout.row: 4
Layout.column: delegateRoot.__firstColumn
Layout.columnSpan: 2
modelInterface: delegateRoot.modelInterface
iconContainerItem: icon
}
}
|