From f5339dc1d2cffceb62e7d0aa86ee92108b49338e Mon Sep 17 00:00:00 2001 From: choco Date: Thu, 9 Oct 2025 22:53:01 +0200 Subject: [PATCH] notif offset placement, default slider yoinked from abel --- .../Configurations/LightlessConfig.cs | 5 +-- LightlessSync/UI/LightlessNotificationUI.cs | 43 ++++++++++++------- LightlessSync/UI/SettingsUi.cs | 21 +++++++++ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs b/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs index 9fa662f..694c325 100644 --- a/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs +++ b/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs @@ -74,7 +74,6 @@ public class LightlessConfig : ILightlessConfiguration // Lightless Notification Configuration // TODO: clean these public bool UseLightlessNotifications { get; set; } = true; - public bool EnableNotificationSounds { get; set; } = true; public int DefaultNotificationDurationSeconds { get; set; } = 10; public bool ShowNotificationProgress { get; set; } = true; public NotificationLocation LightlessInfoNotification { get; set; } = NotificationLocation.LightlessUi; @@ -89,13 +88,11 @@ public class LightlessConfig : ILightlessConfiguration public bool AutoDismissOnAction { get; set; } = true; public bool DismissNotificationOnClick { get; set; } = false; public bool ShowNotificationTimestamp { get; set; } = false; - public bool EnableNotificationHistory { get; set; } = true; - public int NotificationHistorySize { get; set; } = 50; + public int NotificationOffsetY { get; set; } = 50; public uint CustomInfoSoundId { get; set; } = 2; // Se2 public uint CustomWarningSoundId { get; set; } = 15; // Se15 public uint CustomErrorSoundId { get; set; } = 16; // Se16 - public bool UseCustomSounds { get; set; } = false; public uint PairRequestSoundId { get; set; } = 5; // Se5 public bool DisableInfoSound { get; set; } = false; public bool DisableWarningSound { get; set; } = false; diff --git a/LightlessSync/UI/LightlessNotificationUI.cs b/LightlessSync/UI/LightlessNotificationUI.cs index 7706142..3f714a0 100644 --- a/LightlessSync/UI/LightlessNotificationUI.cs +++ b/LightlessSync/UI/LightlessNotificationUI.cs @@ -43,15 +43,9 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase ImGuiWindowFlags.NoNav | ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoCollapse | - ImGuiWindowFlags.AlwaysAutoResize; + ImGuiWindowFlags.AlwaysAutoResize; - var viewport = ImGui.GetMainViewport(); - if (viewport.WorkSize.X > 0) - { - Position = new Vector2(viewport.WorkPos.X + viewport.WorkSize.X - NotificationWidth - EdgeXMargin, - viewport.WorkPos.Y + EdgeYMargin); - PositionCondition = ImGuiCond.Always; - } + PositionCondition = ImGuiCond.Always; Size = new Vector2(NotificationWidth, 100); SizeCondition = ImGuiCond.FirstUseEver; @@ -114,22 +108,30 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase protected override void DrawInternal() { + ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, Vector2.Zero); + lock (_notificationLock) { UpdateNotifications(); if (_notifications.Count == 0) { + ImGui.PopStyleVar(); IsOpen = false; return; } var viewport = ImGui.GetMainViewport(); - var windowPos = new Vector2( - viewport.WorkPos.X + viewport.WorkSize.X - NotificationWidth - EdgeXMargin, - viewport.WorkPos.Y + EdgeYMargin - ); - ImGui.SetWindowPos(windowPos); + + // Always position at top (choco doesnt know how to handle top positions how fitting) + var baseX = viewport.WorkPos.X + viewport.WorkSize.X - NotificationWidth; + var baseY = viewport.WorkPos.Y; + + // Apply Y offset + var finalY = baseY + _configService.Current.NotificationOffsetY; + + // Update position + Position = new Vector2(baseX, finalY); for (int i = 0; i < _notifications.Count; i++) { @@ -141,6 +143,8 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase } } } + + ImGui.PopStyleVar(); } private void UpdateNotifications() @@ -208,6 +212,8 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase var notificationHeight = CalculateNotificationHeight(notification); + ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, Vector2.Zero); + using var child = ImRaii.Child($"notification_{notification.Id}", new Vector2(NotificationWidth - slideOffset, notificationHeight), false, ImGuiWindowFlags.NoScrollbar); @@ -216,6 +222,8 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase { DrawNotificationContent(notification, alpha); } + + ImGui.PopStyleVar(); } private void DrawNotificationContent(LightlessNotification notification, float alpha) @@ -266,6 +274,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase 3f ); + // Draw accent bar on left side of the notif var accentWidth = 3f; drawList.AddRectFilled( windowPos, @@ -312,9 +321,10 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private void DrawNotificationText(LightlessNotification notification, float alpha) { var padding = new Vector2(10f, 6f); - var contentPos = new Vector2(6f, 0f) + padding; + + var contentPos = new Vector2(padding.X, padding.Y); var windowSize = ImGui.GetWindowSize(); - var contentSize = windowSize - padding * 2 - new Vector2(6f, 0f); + var contentSize = new Vector2(windowSize.X - padding.X, windowSize.Y - padding.Y * 2); ImGui.SetCursorPos(contentPos); @@ -358,7 +368,8 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase progressColor.W *= alpha; using (ImRaii.PushColor(ImGuiCol.PlotHistogram, progressColor)) { - ImGui.ProgressBar(notification.Progress, new Vector2(contentSize.X, 2f), ""); + // Use full window width for progress bar + ImGui.ProgressBar(notification.Progress, new Vector2(windowSize.X - padding.X * 2 - 6f, 2f), ""); } } diff --git a/LightlessSync/UI/SettingsUi.cs b/LightlessSync/UI/SettingsUi.cs index 1964431..6184a92 100644 --- a/LightlessSync/UI/SettingsUi.cs +++ b/LightlessSync/UI/SettingsUi.cs @@ -3232,6 +3232,27 @@ public class SettingsUi : WindowMediatorSubscriberBase _uiShared.DrawHelpText("Maximum number of notifications that can be shown at once."); + ImGui.Spacing(); + ImGui.TextUnformatted("Position"); + + int offsetY = _configService.Current.NotificationOffsetY; + if (ImGui.SliderInt("Vertical Offset", ref offsetY, 0, 500)) + { + _configService.Current.NotificationOffsetY = offsetY; + _configService.Save(); + } + + if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) + { + _configService.Current.NotificationOffsetY = 50; + _configService.Save(); + } + + if (ImGui.IsItemHovered()) + ImGui.SetTooltip("Right click to reset to default (50)."); + + _uiShared.DrawHelpText("Move notifications down from the top-right corner. 0 aligns to the very top."); + _uiShared.ColoredSeparator(UIColors.Get("LightlessPurple"), 1.5f); ImGui.TreePop(); }