diff --git a/applets/notifications/package/contents/ui/NotificationDelegate.qml b/applets/notifications/package/contents/ui/NotificationDelegate.qml index 4fb590bc8..1d2200812 100644 --- a/applets/notifications/package/contents/ui/NotificationDelegate.qml +++ b/applets/notifications/package/contents/ui/NotificationDelegate.qml @@ -1,173 +1,173 @@ /* * Copyright 2011 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, or * (at your option) any later version. * * 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 Library General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.0 import QtQuick.Controls.Private 1.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.kquickcontrolsaddons 2.0 PlasmaComponents.ListItem { id: notificationItem width: popupFlickable.width property int layoutSpacing: units.smallSpacing property int toolIconSize: units.iconSizes.smallMedium opacity: 1-Math.abs(x)/width - enabled: true + enabled: model.hasDefaultAction checked: notificationItem.containsMouse Timer { interval: 10*60*1000 repeat: false running: !idleTimeSource.idle onTriggered: { if (!notificationsModel.inserting) notificationsModel.remove(index) } } MouseArea { width: parent.width height: childrenRect.height drag { target: notificationItem axis: Drag.XAxis //kind of an hack over Column being too smart minimumX: -parent.width + 1 maximumX: parent.width - 1 } onReleased: { if (notificationItem.x < -notificationItem.width/2) { removeAnimation.exitFromRight = false removeAnimation.running = true } else if (notificationItem.x > notificationItem.width/2 ) { removeAnimation.exitFromRight = true removeAnimation.running = true } else { resetAnimation.running = true } } onClicked: { if (model.hasDefaultAction) { executeAction(model.source, "default") } else { notification.close(); } } SequentialAnimation { id: removeAnimation property bool exitFromRight: true NumberAnimation { target: notificationItem properties: "x" to: removeAnimation.exitFromRight ? notificationItem.width-1 : 1-notificationItem.width duration: units.longDuration easing.type: Easing.InOutQuad } NumberAnimation { target: notificationItem properties: "height" to: 0 duration: units.longDuration easing.type: Easing.InOutQuad } ScriptAction { script: { closeNotification(model.source); notificationsModel.remove(index); } } } SequentialAnimation { id: resetAnimation NumberAnimation { target: notificationItem properties: "x" to: 0 duration: units.longDuration easing.type: Easing.InOutQuad } } NotificationItem { id: notification width: parent.width compact: true icon: appIcon image: model.image summary: model.summary body: model.body configurable: model.configurable && !Settings.isMobile // model.actions JS array is implicitly turned into a ListModel which we can assign directly actions: model.actions created: model.created urls: { // QML ListModel tries to be smart and turns our urls Array into a dict with index as key... var urls = [] var modelUrls = model.urls if (modelUrls) { for (var key in modelUrls) { urls.push(modelUrls[key]) } } return urls } onClose: { if (notificationsModel.count > 1) { removeAnimation.running = true } else { closeNotification(model.source) notificationsModel.remove(index) } } onConfigure: { plasmoid.expanded = false configureNotification(model.appRealName, model.eventId) } onAction: { executeAction(model.source, actionId) actions.clear() } onOpenUrl: { plasmoid.expanded = false Qt.openUrlExternally(url) } } } //MouseArea Component.onCompleted: { mainScrollArea.height = mainScrollArea.implicitHeight } Component.onDestruction: { mainScrollArea.height = mainScrollArea.implicitHeight } } diff --git a/applets/notifications/package/contents/ui/NotificationPopup.qml b/applets/notifications/package/contents/ui/NotificationPopup.qml index 1b5a5bc4a..442bbb89c 100644 --- a/applets/notifications/package/contents/ui/NotificationPopup.qml +++ b/applets/notifications/package/contents/ui/NotificationPopup.qml @@ -1,152 +1,150 @@ /* * Copyright 2014 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, or * (at your option) any later version. * * 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 Library General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.0 import QtQuick.Controls.Private 1.0 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.kquickcontrolsaddons 2.0 import org.kde.kquickcontrolsaddons 2.0 as KQuickControlsAddons PlasmaCore.Dialog { id: notificationPopup location: PlasmaCore.Types.Floating type: PlasmaCore.Dialog.Notification flags: Qt.WindowDoesNotAcceptFocus property var notificationProperties: ({}) signal notificationTimeout() onVisibleChanged: { if (!visible) { notificationTimer.stop(); } } onYChanged: { if (visible) { notificationTimer.restart(); } } function populatePopup(notification) { notificationProperties = notification notificationTimer.interval = notification.expireTimeout notificationTimer.restart() // notification.actions is a JS array, but we can easily append that to our model notificationItem.actions.clear() notificationItem.actions.append(notificationProperties.actions) } function clearPopup() { notificationProperties = {} notificationItem.actions.clear() } Behavior on y { NumberAnimation { duration: units.longDuration easing.type: Easing.OutQuad } } mainItem: KQuickControlsAddons.MouseEventListener { id: root LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true width: notificationItem.width height: notificationItem.implicitHeight hoverEnabled: true onClicked: { // the MEL would close the notification before the action button // onClicked handler would fire effectively breaking notification actions if (notificationItem.pressedAction()) { return } if (notificationItem.hasDefaultAction) { // the notifications was clicked, trigger the default action if set notificationItem.action("default") - } else { - closeNotification(notificationProperties.source) - // the popup will be closed in response to sourceRemoved + notificationItem.close() } } onContainsMouseChanged: { if (containsMouse) { notificationTimer.stop() } else if (!containsMouse && visible) { notificationTimer.restart() } } Timer { id: notificationTimer onTriggered: { if (!notificationProperties.isPersistent) { expireNotification(notificationProperties.source) } notificationPopup.notificationTimeout(); } } NotificationItem { id: notificationItem summary: notificationProperties.summary || "" body: notificationProperties.body || "" icon: notificationProperties.appIcon || "" image: notificationProperties.image // explicit true/false or else it complains about assigning undefined to bool configurable: notificationProperties.configurable && !Settings.isMobile ? true : false urls: notificationProperties.urls || [] - hasDefaultAction: notificationProperties.hasDefaultAction + hasDefaultAction: notificationProperties.hasDefaultAction || false width: Math.round(23 * units.gridUnit) maximumTextHeight: theme.mSize(theme.defaultFont).height * 10 onClose: { closeNotification(notificationProperties.source) // the popup will be closed in response to sourceRemoved } onConfigure: { configureNotification(notificationProperties.appRealName, notificationProperties.eventId) notificationPositioner.closePopup(notificationProperties.source); } onAction: { executeAction(notificationProperties.source, actionId) actions.clear() } onOpenUrl: { Qt.openUrlExternally(url) notificationPositioner.closePopup(notificationProperties.source); } } } }