You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
7.3 KiB
206 lines
7.3 KiB
/* |
|
* Copyright 2019 Kai Uwe Broulik <kde@privat.broulik.de> |
|
* |
|
* This program is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU General Public License as |
|
* published by the Free Software Foundation; either version 2 of |
|
* the License or (at your option) version 3 or any later version |
|
* accepted by the membership of KDE e.V. (or its successor approved |
|
* by the membership of KDE e.V.), which shall act as a proxy |
|
* defined in Section 14 of version 3 of the license. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program. If not, see <http://www.gnu.org/licenses/> |
|
*/ |
|
|
|
import QtQuick 2.8 |
|
import QtQuick.Layouts 1.1 |
|
|
|
import org.kde.plasma.core 2.0 as PlasmaCore |
|
import org.kde.plasma.components 2.0 as Components |
|
|
|
import org.kde.notificationmanager 1.0 as NotificationManager |
|
|
|
import ".." |
|
|
|
PlasmaCore.Dialog { |
|
id: notificationPopup |
|
|
|
property int popupWidth |
|
|
|
property alias notificationType: notificationItem.notificationType |
|
|
|
property alias applicationName: notificationItem.applicationName |
|
property alias applicationIconSource: notificationItem.applicationIconSource |
|
property alias deviceName: notificationItem.deviceName |
|
|
|
property alias time: notificationItem.time |
|
|
|
property alias summary: notificationItem.summary |
|
property alias body: notificationItem.body |
|
property alias icon: notificationItem.icon |
|
property alias urls: notificationItem.urls |
|
|
|
property int urgency |
|
property int timeout |
|
property int dismissTimeout |
|
|
|
property alias jobState: notificationItem.jobState |
|
property alias percentage: notificationItem.percentage |
|
property alias jobError: notificationItem.jobError |
|
property alias suspendable: notificationItem.suspendable |
|
property alias killable: notificationItem.killable |
|
property alias jobDetails: notificationItem.jobDetails |
|
|
|
property alias configureActionLabel: notificationItem.configureActionLabel |
|
property alias configurable: notificationItem.configurable |
|
property alias dismissable: notificationItem.dismissable |
|
property alias closable: notificationItem.closable |
|
|
|
property bool hasDefaultAction |
|
property alias actionNames: notificationItem.actionNames |
|
property alias actionLabels: notificationItem.actionLabels |
|
|
|
signal configureClicked |
|
signal dismissClicked |
|
signal closeClicked |
|
|
|
signal defaultActionInvoked |
|
signal actionInvoked(string actionName) |
|
signal openUrl(string url) |
|
signal fileActionInvoked |
|
|
|
signal expired |
|
|
|
signal suspendJobClicked |
|
signal resumeJobClicked |
|
signal killJobClicked |
|
|
|
property int defaultTimeout: 5000 |
|
readonly property int effectiveTimeout: { |
|
if (timeout === -1) { |
|
return defaultTimeout; |
|
} |
|
if (dismissTimeout) { |
|
return dismissTimeout; |
|
} |
|
return timeout; |
|
} |
|
|
|
location: PlasmaCore.Types.Floating |
|
|
|
flags: Qt.WindowDoesNotAcceptFocus |
|
|
|
visible: false |
|
|
|
// When notification is updated, restart hide timer |
|
onTimeChanged: { |
|
if (timer.running) { |
|
timer.restart(); |
|
} |
|
} |
|
|
|
mainItem: MouseArea { |
|
id: area |
|
width: notificationPopup.popupWidth |
|
height: notificationItem.implicitHeight + notificationItem.y |
|
hoverEnabled: true |
|
|
|
cursorShape: hasDefaultAction ? Qt.PointingHandCursor : Qt.ArrowCursor |
|
acceptedButtons: hasDefaultAction ? Qt.LeftButton : Qt.NoButton |
|
|
|
onClicked: notificationPopup.defaultActionInvoked() |
|
|
|
LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft |
|
LayoutMirroring.childrenInherit: true |
|
|
|
Timer { |
|
id: timer |
|
interval: notificationPopup.effectiveTimeout |
|
running: notificationPopup.visible && !area.containsMouse && interval > 0 |
|
&& !notificationItem.dragging && !notificationItem.menuOpen |
|
onTriggered: { |
|
if (notificationPopup.dismissTimeout) { |
|
notificationPopup.dismissClicked(); |
|
} else { |
|
notificationPopup.expired(); |
|
} |
|
} |
|
} |
|
|
|
Timer { |
|
id: timeoutIndicatorDelayTimer |
|
// only show indicator for the last ten seconds of timeout |
|
readonly property int remainingTimeout: 10000 |
|
interval: Math.max(0, timer.interval - remainingTimeout) |
|
running: interval > 0 && timer.running |
|
} |
|
|
|
Rectangle { |
|
id: timeoutIndicatorRect |
|
anchors { |
|
right: parent.right |
|
rightMargin: -notificationPopup.margins.right |
|
bottom: parent.bottom |
|
bottomMargin: -notificationPopup.margins.bottom |
|
} |
|
width: units.devicePixelRatio * 3 |
|
color: theme.highlightColor |
|
opacity: timeoutIndicatorAnimation.running ? 0.6 : 0 |
|
visible: units.longDuration > 1 |
|
Behavior on opacity { |
|
NumberAnimation { |
|
duration: units.longDuration |
|
} |
|
} |
|
|
|
NumberAnimation { |
|
id: timeoutIndicatorAnimation |
|
target: timeoutIndicatorRect |
|
property: "height" |
|
from: area.height + notificationPopup.margins.top + notificationPopup.margins.bottom |
|
to: 0 |
|
duration: Math.min(timer.interval, timeoutIndicatorDelayTimer.remainingTimeout) |
|
running: timer.running && !timeoutIndicatorDelayTimer.running && units.longDuration > 1 |
|
} |
|
} |
|
|
|
NotificationItem { |
|
id: notificationItem |
|
// let the item bleed into the dialog margins so the close button margins cancel out |
|
y: closable || dismissable || configurable ? -notificationPopup.margins.top : 0 |
|
headingRightPadding: -notificationPopup.margins.right |
|
width: parent.width |
|
hovered: area.containsMouse |
|
maximumLineCount: 8 |
|
bodyCursorShape: notificationPopup.hasDefaultAction ? Qt.PointingHandCursor : 0 |
|
|
|
thumbnailLeftPadding: -notificationPopup.margins.left |
|
thumbnailRightPadding: -notificationPopup.margins.right |
|
thumbnailTopPadding: -notificationPopup.margins.top |
|
thumbnailBottomPadding: -notificationPopup.margins.bottom |
|
|
|
closable: true |
|
onBodyClicked: { |
|
if (area.acceptedButtons & mouse.button) { |
|
area.clicked(null /*mouse*/); |
|
} |
|
} |
|
onCloseClicked: notificationPopup.closeClicked() |
|
onDismissClicked: notificationPopup.dismissClicked() |
|
onConfigureClicked: notificationPopup.configureClicked() |
|
onActionInvoked: notificationPopup.actionInvoked(actionName) |
|
onOpenUrl: notificationPopup.openUrl(url) |
|
onFileActionInvoked: notificationPopup.fileActionInvoked() |
|
|
|
onSuspendJobClicked: notificationPopup.suspendJobClicked() |
|
onResumeJobClicked: notificationPopup.resumeJobClicked() |
|
onKillJobClicked: notificationPopup.killJobClicked() |
|
} |
|
} |
|
}
|
|
|