diff --git a/LightlessSync/UI/LightlessNotificationUI.cs b/LightlessSync/UI/LightlessNotificationUI.cs index 9c4f8f5..1d0a477 100644 --- a/LightlessSync/UI/LightlessNotificationUI.cs +++ b/LightlessSync/UI/LightlessNotificationUI.cs @@ -6,6 +6,7 @@ using LightlessSync.LightlessConfiguration.Models; using LightlessSync.Services; using LightlessSync.Services.Mediator; using LightlessSync.UI.Models; +using LightlessSync.UI.Style; using Microsoft.Extensions.Logging; using System.Numerics; @@ -30,6 +31,7 @@ public class LightlessNotificationUi : WindowMediatorSubscriberBase private readonly LightlessConfigService _configService; private readonly Dictionary _notificationYOffsets = []; private readonly Dictionary _notificationTargetYOffsets = []; + private readonly Dictionary _notificationBackgrounds = []; public LightlessNotificationUi(ILogger logger, LightlessMediator mediator, PerformanceCollectorService performanceCollector, LightlessConfigService configService) : base(logger, mediator, "Lightless Notifications##LightlessNotifications", performanceCollector) @@ -225,6 +227,7 @@ public class LightlessNotificationUi : WindowMediatorSubscriberBase _notifications.RemoveAt(i); _notificationYOffsets.Remove(notification.Id); _notificationTargetYOffsets.Remove(notification.Id); + _notificationBackgrounds.Remove(notification.Id); } } } @@ -333,14 +336,15 @@ public class LightlessNotificationUi : WindowMediatorSubscriberBase var windowPos = ImGui.GetWindowPos(); var windowSize = ImGui.GetWindowSize(); - var bgColor = CalculateBackgroundColor(alpha, ImGui.IsWindowHovered()); var accentColor = GetNotificationAccentColor(notification.Type); - accentColor.W *= alpha; + var bgColor = CalculateBackgroundColor(notification, alpha, ImGui.IsWindowHovered(), accentColor); + var accentColorWithAlpha = accentColor; + accentColorWithAlpha.W *= alpha; DrawShadow(drawList, windowPos, windowSize, alpha); HandleClickToDismiss(notification); DrawBackground(drawList, windowPos, windowSize, bgColor); - DrawAccentBar(drawList, windowPos, windowSize, accentColor); + DrawAccentBar(drawList, windowPos, windowSize, accentColorWithAlpha); DrawDurationProgressBar(notification, alpha, windowPos, windowSize, drawList); // Draw download progress bar above duration bar for download notifications @@ -352,16 +356,38 @@ public class LightlessNotificationUi : WindowMediatorSubscriberBase DrawNotificationText(notification, alpha); } - private Vector4 CalculateBackgroundColor(float alpha, bool isHovered) + private Vector4 CalculateBackgroundColor(LightlessNotification notification, float alpha, bool isHovered, Vector4 accentColor) { var baseOpacity = _configService.Current.NotificationOpacity; var finalOpacity = baseOpacity * alpha; - var bgColor = new Vector4(30f/255f, 30f/255f, 30f/255f, finalOpacity); + float boost = Luminance.ComputeHighlight(null, accentColor); + + var baseBg = new Vector4( + 30f/255f + boost, + 30f/255f + boost, + 30f/255f + boost, + finalOpacity + ); + + if (!_notificationBackgrounds.ContainsKey(notification.Id)) + { + _notificationBackgrounds[notification.Id] = baseBg; + } + + var currentBg = _notificationBackgrounds[notification.Id]; + var bgColor = Luminance.BackgroundContrast(null, accentColor, baseBg, ref currentBg); + _notificationBackgrounds[notification.Id] = currentBg; + + bgColor.W = finalOpacity; if (isHovered) { - bgColor *= 1.1f; - bgColor.W = Math.Min(bgColor.W, 0.98f); + bgColor = new Vector4( + bgColor.X * 1.1f, + bgColor.Y * 1.1f, + bgColor.Z * 1.1f, + Math.Min(bgColor.W, 0.98f) + ); } return bgColor;