This commit is contained in:
2026-03-02 20:02:54 +02:00
parent aef27304e4
commit f189e304a8
3 changed files with 91 additions and 18 deletions

View File

@@ -27,15 +27,54 @@ Item {
readonly property string notifBody: notifObject ? String(notifObject.body || "") : ""
readonly property string notifAppName: notifObject ? String(notifObject.appName || "") : ""
readonly property string notifAppIcon: notifObject ? String(notifObject.appIcon || "") : ""
readonly property string notifDesktopEntry: {
if (!notifObject || !notifObject.hints)
return "";
const value = notifObject.hints["desktop-entry"];
return value === undefined || value === null ? "" : String(value);
}
readonly property string notifImage: notifObject ? String(notifObject.image || "") : ""
readonly property bool isExpanded: forceExpanded || contextOpen
readonly property string appIconSource: {
if (!notifAppIcon || notifAppIcon.length === 0)
function resolveIconSource(iconName) {
const normalized = String(iconName || "").trim();
if (normalized.length === 0)
return "";
if (notifAppIcon.indexOf("/") >= 0 || notifAppIcon.indexOf("file://") === 0)
return notifAppIcon;
return Quickshell.iconPath(notifAppIcon);
if (normalized.indexOf("/") >= 0 || normalized.indexOf("file://") === 0)
return normalized;
return String(Quickshell.iconPath(normalized) || "");
}
readonly property string appIconSource: {
const candidates = [];
const desktopEntry = notifDesktopEntry.trim();
const appName = notifAppName.trim();
const appIcon = notifAppIcon.trim();
if (desktopEntry.length > 0) {
candidates.push(desktopEntry);
if (desktopEntry.endsWith(".desktop"))
candidates.push(desktopEntry.slice(0, desktopEntry.length - 8));
}
if (appName.length > 0) {
candidates.push(appName);
const normalizedAppName = appName.toLowerCase();
candidates.push(normalizedAppName);
candidates.push(normalizedAppName.replace(/\s+/g, "-"));
candidates.push(normalizedAppName.replace(/\s+/g, ""));
}
if (appIcon.length > 0)
candidates.push(appIcon);
for (let i = 0; i < candidates.length; i++) {
const resolved = resolveIconSource(candidates[i]);
if (resolved.length > 0)
return resolved;
}
return "";
}
readonly property string customImageSource: notifImage
@@ -82,7 +121,7 @@ Item {
const rawTimeout = Number(notifObject.expireTimeout);
if (Number.isFinite(rawTimeout) && rawTimeout > 0) {
const normalizedTimeout = rawTimeout > 100 ? Math.round(rawTimeout) : Math.round(rawTimeout * 1000);
return Math.max(theme ? theme.minimumTimeoutMs : 4500, normalizedTimeout);
return Math.max(theme ? theme.minimumTimeoutMs : 2000, normalizedTimeout);
}
const urgency = notifObject.urgency;
@@ -144,18 +183,50 @@ Item {
id: enterAnimation
running: !peekMode
PropertyAction { target: root; property: "opacity"; value: 0 }
PropertyAction { target: root; property: "x"; value: 20 }
PropertyAction {
target: root
property: "opacity"
value: 0
}
PropertyAction {
target: root
property: "x"
value: 20
}
ParallelAnimation {
NumberAnimation { target: root; property: "opacity"; to: 1; duration: theme ? theme.enterMs : 170; easing.type: Easing.OutCubic }
NumberAnimation { target: root; property: "x"; to: 0; duration: theme ? theme.enterMs : 170; easing.type: Easing.OutCubic }
NumberAnimation {
target: root
property: "opacity"
to: 1
duration: theme ? theme.enterMs : 170
easing.type: Easing.OutCubic
}
NumberAnimation {
target: root
property: "x"
to: 0
duration: theme ? theme.enterMs : 170
easing.type: Easing.OutCubic
}
}
}
ParallelAnimation {
id: closeAnimation
NumberAnimation { target: root; property: "opacity"; to: 0; duration: theme ? theme.fadeMs : 120; easing.type: Easing.InCubic }
NumberAnimation { target: root; property: "x"; to: width; duration: theme ? theme.exitMs : 140; easing.type: Easing.InCubic }
NumberAnimation {
target: root
property: "opacity"
to: 0
duration: theme ? theme.fadeMs : 120
easing.type: Easing.InCubic
}
NumberAnimation {
target: root
property: "x"
to: width
duration: theme ? theme.exitMs : 140
easing.type: Easing.InCubic
}
onFinished: root.closeFinished(root.notificationId, root.closeReason)
}
@@ -218,8 +289,8 @@ Item {
anchors.fill: parent
visible: root.primaryIconSource.length === 0
color: "#000000"
border.width: 1
border.color: theme ? theme.panelBorder : "#ffffff"
border.width: 0
border.color: "transparent"
radius: 0
antialiasing: false
}
@@ -318,7 +389,9 @@ Item {
radius: 0
antialiasing: false
HoverHandler { id: actionHover }
HoverHandler {
id: actionHover
}
Text {
anchors.centerIn: parent

View File

@@ -35,10 +35,10 @@ QtObject {
readonly property int dragDismissThreshold: 140
readonly property int fallbackLowTimeoutMs: 4500
readonly property int fallbackLowTimeoutMs: 1000
readonly property int fallbackNormalTimeoutMs: 5000
readonly property int fallbackCriticalTimeoutMs: 8000
readonly property int minimumTimeoutMs: 4500
readonly property int minimumTimeoutMs: 1000
readonly property int enterMs: 170
readonly property int exitMs: 140