From f225989a00e4839f515b34c9a84fc9639d707eb6 Mon Sep 17 00:00:00 2001 From: cake Date: Sun, 21 Dec 2025 01:20:34 +0100 Subject: [PATCH] Trunculate the broadcaster name in the grid view as it was overlapping into the Shell name --- LightlessSync/UI/SyncshellFinderUI.cs | 84 ++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/LightlessSync/UI/SyncshellFinderUI.cs b/LightlessSync/UI/SyncshellFinderUI.cs index 2f215a1..0586c06 100644 --- a/LightlessSync/UI/SyncshellFinderUI.cs +++ b/LightlessSync/UI/SyncshellFinderUI.cs @@ -350,9 +350,9 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase ? shell.Group.Alias : shell.Group.GID; + var style = ImGui.GetStyle(); float startX = ImGui.GetCursorPosX(); - float availWidth = ImGui.GetContentRegionAvail().X; - float rightTextW = ImGui.CalcTextSize(broadcasterName).X; + float availW = ImGui.GetContentRegionAvail().X; ImGui.BeginGroup(); @@ -364,13 +364,45 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase Mediator.Publish(new GroupProfileOpenStandaloneMessage(shell.Group)); } - ImGui.SameLine(); - float rightX = startX + availWidth - rightTextW; - var pos = ImGui.GetCursorPos(); - ImGui.SetCursorPos(new Vector2(rightX, pos.Y + 3f * ImGuiHelpers.GlobalScale)); - ImGui.TextUnformatted(broadcasterName); - if (ImGui.IsItemHovered()) - ImGui.SetTooltip("Broadcaster of the syncshell."); + float nameRightX = ImGui.GetItemRectMax().X; + + var regionMinScreen = ImGui.GetCursorScreenPos(); + float regionRightX = regionMinScreen.X + availW; + + float minBroadcasterX = nameRightX + style.ItemSpacing.X; + + float maxBroadcasterWidth = regionRightX - minBroadcasterX; + + string broadcasterToShow = broadcasterName; + + if (!string.IsNullOrEmpty(broadcasterName) && maxBroadcasterWidth > 0f) + { + float bcFullWidth = ImGui.CalcTextSize(broadcasterName).X; + string toolTip; + + if (bcFullWidth > maxBroadcasterWidth) + { + broadcasterToShow = TruncateTextToWidth(broadcasterName, maxBroadcasterWidth); + toolTip = broadcasterName + Environment.NewLine + Environment.NewLine + "Broadcaster of the syncshell."; + } + else + { + toolTip = "Broadcaster of the syncshell."; + } + + float bcWidth = ImGui.CalcTextSize(broadcasterToShow).X; + + float broadX = regionRightX - bcWidth; + + broadX = MathF.Max(broadX, minBroadcasterX); + + ImGui.SameLine(); + var curPos = ImGui.GetCursorPos(); + ImGui.SetCursorPos(new Vector2(broadX - regionMinScreen.X + startX, curPos.Y + 3f * ImGuiHelpers.GlobalScale)); + ImGui.TextUnformatted(broadcasterToShow); + if (ImGui.IsItemHovered()) + ImGui.SetTooltip(toolTip); + } ImGui.EndGroup(); @@ -590,6 +622,40 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase float widthUsed = cursorLocalX - baseLocal.X; return (widthUsed, rowHeight); } + private static string TruncateTextToWidth(string text, float maxWidth) + { + if (string.IsNullOrEmpty(text)) + return text; + + const string ellipsis = "..."; + float ellipsisWidth = ImGui.CalcTextSize(ellipsis).X; + + if (maxWidth <= ellipsisWidth) + return ellipsis; + + int low = 0; + int high = text.Length; + string best = ellipsis; + + while (low <= high) + { + int mid = (low + high) / 2; + string candidate = string.Concat(text.AsSpan(0, mid), ellipsis); + float width = ImGui.CalcTextSize(candidate).X; + + if (width <= maxWidth) + { + best = candidate; + low = mid + 1; + } + else + { + high = mid - 1; + } + } + + return best; + } private IDalamudTextureWrap? GetIconWrap(uint iconId) {