2021-12-23 16:02:41 +00:00
|
|
|
/*
|
|
|
|
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
*/
|
|
|
|
|
|
2023-09-27 04:08:49 +00:00
|
|
|
.import org.kde.notificationmanager as NotificationManager
|
|
|
|
|
.import QtQml as QtQml
|
2021-12-22 23:29:00 +00:00
|
|
|
|
|
|
|
|
function determineNotificationHeadingText(notificationItem) {
|
|
|
|
|
if (notificationItem.notificationType === NotificationManager.Notifications.JobType) {
|
|
|
|
|
if (notificationItem.jobState === NotificationManager.Notifications.JobStateSuspended) {
|
|
|
|
|
if (notificationItem.summary) {
|
|
|
|
|
return i18nc("Job name, e.g. Copying is paused", "%1 (Paused)", notificationItem.summary);
|
|
|
|
|
}
|
|
|
|
|
} else if (notificationItem.jobState === NotificationManager.Notifications.JobStateStopped) {
|
|
|
|
|
if (notificationItem.jobError) {
|
|
|
|
|
if (notificationItem.summary) {
|
|
|
|
|
return i18nc("Job name, e.g. Copying has failed", "%1 (Failed)", notificationItem.summary);
|
|
|
|
|
} else {
|
|
|
|
|
return i18n("Job Failed");
|
|
|
|
|
}
|
|
|
|
|
} else if (notificationItem.summary) {
|
|
|
|
|
return i18ndc("plasma_applet_org.kde.plasma.notifications", "Job name, e.g. Copying has finished", "%1 (Finished)", notificationItem.summary);
|
|
|
|
|
}
|
|
|
|
|
return i18nd("plasma_applet_org.kde.plasma.notifications", "Job Finished");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// some apps use their app name as summary, avoid showing the same text twice
|
|
|
|
|
// try very hard to match the two
|
|
|
|
|
if (notificationItem.summary && notificationItem.summary.toLocaleLowerCase().trim() !== notificationItem.applicationName.toLocaleLowerCase().trim()) {
|
|
|
|
|
return notificationItem.summary;
|
|
|
|
|
}
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function generateNotificationHeaderAgoText(time, jobState) {
|
|
|
|
|
if (!time || isNaN(time.getTime()) || jobState === NotificationManager.Notifications.JobStateRunning) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const deltaMinutes = Math.floor((Date.now() - time.getTime()) / 1000 / 60);
|
|
|
|
|
if (deltaMinutes < 1) {
|
2024-08-01 01:18:33 +00:00
|
|
|
return i18n("now");
|
2021-12-22 23:29:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Received less than an hour ago, show relative minutes
|
|
|
|
|
if (deltaMinutes < 60) {
|
|
|
|
|
return i18nc("Notification was added minutes ago, keep short", "%1m ago", deltaMinutes);
|
|
|
|
|
}
|
|
|
|
|
// Received less than a day ago, show time, 22 hours so the time isn't as ambiguous between today and yesterday
|
|
|
|
|
if (deltaMinutes < 60 * 22) {
|
|
|
|
|
return Qt.formatTime(time, Qt.locale().timeFormat(QtQml.Locale.ShortFormat).replace(/.ss?/i, ""));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Otherwise show relative date (Yesterday, "Last Sunday", or just date if too far in the past)
|
|
|
|
|
return KCoreAddons.Format.formatRelativeDate(time, QtQml.Locale.ShortFormat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function generateNotificationHeaderRemainingText(notificationType, jobState, jobDetails) {
|
|
|
|
|
if (notificationType !== NotificationManager.Notifications.JobType || jobState !== NotificationManager.Notifications.JobStateRunning) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const details = jobDetails;
|
|
|
|
|
if (!details || !details.speed) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var remaining = details.totalBytes - details.processedBytes;
|
|
|
|
|
if (remaining <= 0) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var eta = remaining / details.speed;
|
|
|
|
|
if (eta < 0.5) { // Avoid showing "0 seconds remaining"
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (eta < 60) { // 1 minute
|
|
|
|
|
return i18nc("seconds remaining, keep short", "%1 s remaining", Math.round(eta));
|
|
|
|
|
}
|
|
|
|
|
if (eta < 60 * 60) {// 1 hour
|
|
|
|
|
return i18nc("minutes remaining, keep short", "%1m remaining", Math.round(eta / 60));
|
|
|
|
|
}
|
|
|
|
|
if (eta < 60 * 60 * 5) { // 5 hours max, if it takes even longer there's no real point in showing that
|
|
|
|
|
return i18nc("hours remaining, keep short", "%1h remaining", Math.round(eta / 60 / 60));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|