From 906dda3885731135e1be7bea8e518e8b45c78fd1 Mon Sep 17 00:00:00 2001 From: choco Date: Thu, 1 Jan 2026 22:32:45 +0100 Subject: [PATCH] lightfinder nearby badge icon --- LightlessSync/UI/TopTabMenu.cs | 41 +++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/LightlessSync/UI/TopTabMenu.cs b/LightlessSync/UI/TopTabMenu.cs index 110b6c3..b8f08e7 100644 --- a/LightlessSync/UI/TopTabMenu.cs +++ b/LightlessSync/UI/TopTabMenu.cs @@ -170,8 +170,22 @@ public class TopTabMenu { Selune.RegisterHighlight(ImGui.GetItemRectMin(), ImGui.GetItemRectMax(), SeluneHighlightMode.Both, true, buttonBorderThickness, exactSize: true, clipToElement: true, roundingOverride: buttonRounding); } + } - + var nearbyCount = GetNearbySyncshellCount(); + if (nearbyCount > 0) + { + var buttonMax = ImGui.GetItemRectMax(); + var badgeRadius = 8f * ImGuiHelpers.GlobalScale; + var badgeCenter = new Vector2(buttonMax.X - badgeRadius * 0.5f, buttonMax.Y - buttonSize.Y + badgeRadius * 0.5f); + var badgeText = nearbyCount > 99 ? "99+" : nearbyCount.ToString(); + var textSize = ImGui.CalcTextSize(badgeText); + + drawList.AddCircleFilled(badgeCenter, badgeRadius + 1f, ImGui.GetColorU32(new Vector4(0, 0, 0, 0.6f))); + drawList.AddCircleFilled(badgeCenter, badgeRadius, ImGui.GetColorU32(UIColors.Get("LightlessPurple"))); + + var textPos = new Vector2(badgeCenter.X - textSize.X * 0.5f, badgeCenter.Y - textSize.Y * 0.5f); + drawList.AddText(textPos, ImGui.GetColorU32(new Vector4(1, 1, 1, 1)), badgeText); } UiSharedService.AttachToolTip(GetLightfinderTooltip()); @@ -805,6 +819,31 @@ public class TopTabMenu return nearbyCount > 0 ? $"Lightfinder ({nearbyCount} nearby)" : "Open Lightfinder"; } + private int GetNearbySyncshellCount() + { + if (!_lightFinderService.IsBroadcasting) + return 0; + + string? myHashedCid = null; + try + { + var cid = _dalamudUtilService.GetCID(); + myHashedCid = cid.ToString().GetHash256(); + } + catch (Exception) + { + } + + return _lightFinderScannerService + .GetActiveSyncshellBroadcasts() + .Where(b => + !string.IsNullOrEmpty(b.GID) && + !string.Equals(b.HashedCID, myHashedCid, StringComparison.Ordinal)) + .Select(b => b.GID!) + .Distinct(StringComparer.Ordinal) + .Count(); + } + private void DrawUserConfig(float availableWidth, float spacingX) { var buttonX = (availableWidth - spacingX) / 2f;