From 4060ba96f1618cd825a87a98ba627568595fc9a7 Mon Sep 17 00:00:00 2001 From: choco Date: Thu, 25 Sep 2025 00:15:42 +0200 Subject: [PATCH 1/4] moved settings button from compact UI to top tab menu --- LightlessSync/UI/CompactUI.cs | 17 +---------------- LightlessSync/UI/TopTabMenu.cs | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/LightlessSync/UI/CompactUI.cs b/LightlessSync/UI/CompactUI.cs index 5a7439a..a14be42 100644 --- a/LightlessSync/UI/CompactUI.cs +++ b/LightlessSync/UI/CompactUI.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; @@ -109,21 +109,6 @@ public class CompactUi : WindowMediatorSubscriberBase AllowClickthrough = false; TitleBarButtons = new() { - new TitleBarButton() - { - Icon = FontAwesomeIcon.Cog, - Click = (msg) => - { - Mediator.Publish(new UiToggleMessage(typeof(SettingsUi))); - }, - IconOffset = new(2,1), - ShowTooltip = () => - { - ImGui.BeginTooltip(); - ImGui.Text("Open Lightless Settings"); - ImGui.EndTooltip(); - } - }, new TitleBarButton() { Icon = FontAwesomeIcon.Book, diff --git a/LightlessSync/UI/TopTabMenu.cs b/LightlessSync/UI/TopTabMenu.cs index c7f5035..9aa112c 100644 --- a/LightlessSync/UI/TopTabMenu.cs +++ b/LightlessSync/UI/TopTabMenu.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; @@ -40,7 +40,8 @@ public class TopTabMenu Individual, Syncshell, Lightfinder, - UserConfig + UserConfig, + Settings } public string Filter @@ -67,7 +68,7 @@ public class TopTabMenu { var availableWidth = ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X; var spacing = ImGui.GetStyle().ItemSpacing; - var buttonX = (availableWidth - (spacing.X * 3)) / 4f; + var buttonX = (availableWidth - (spacing.X * 4)) / 5f; var buttonY = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Pause).Y; var buttonSize = new Vector2(buttonX, buttonY); var drawList = ImGui.GetWindowDrawList(); @@ -144,6 +145,17 @@ public class TopTabMenu } UiSharedService.AttachToolTip("Your User Menu"); + ImGui.SameLine(); + using (ImRaii.PushFont(UiBuilder.IconFont)) + { + if (ImGui.Button(FontAwesomeIcon.Cog.ToIconString(), buttonSize)) + { + _lightlessMediator.Publish(new UiToggleMessage(typeof(SettingsUi))); + } + + } + UiSharedService.AttachToolTip("Lightless Sync Settings"); + ImGui.NewLine(); btncolor.Dispose(); From 3831dd24f1be5bda865c65ea669ea14e7db0f55c Mon Sep 17 00:00:00 2001 From: choco Date: Sun, 28 Sep 2025 15:16:45 +0200 Subject: [PATCH 2/4] settings cleanup readded title settings --- LightlessSync/UI/CompactUI.cs | 15 +++++++++++++++ LightlessSync/UI/TopTabMenu.cs | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/LightlessSync/UI/CompactUI.cs b/LightlessSync/UI/CompactUI.cs index a14be42..247e440 100644 --- a/LightlessSync/UI/CompactUI.cs +++ b/LightlessSync/UI/CompactUI.cs @@ -109,6 +109,21 @@ public class CompactUi : WindowMediatorSubscriberBase AllowClickthrough = false; TitleBarButtons = new() { + new TitleBarButton() + { + Icon = FontAwesomeIcon.Cog, + Click = (msg) => + { + Mediator.Publish(new UiToggleMessage(typeof(SettingsUi))); + }, + IconOffset = new(2,1), + ShowTooltip = () => + { + ImGui.BeginTooltip(); + ImGui.Text("Open Lightless Settings"); + ImGui.EndTooltip(); + } + }, new TitleBarButton() { Icon = FontAwesomeIcon.Book, diff --git a/LightlessSync/UI/TopTabMenu.cs b/LightlessSync/UI/TopTabMenu.cs index 9aa112c..339b22c 100644 --- a/LightlessSync/UI/TopTabMenu.cs +++ b/LightlessSync/UI/TopTabMenu.cs @@ -154,7 +154,7 @@ public class TopTabMenu } } - UiSharedService.AttachToolTip("Lightless Sync Settings"); + UiSharedService.AttachToolTip("Open Lightless Settings"); ImGui.NewLine(); btncolor.Dispose(); From 08e3c8678f6b252480f22b4f337b72818f4dd0a7 Mon Sep 17 00:00:00 2001 From: choco Date: Sun, 28 Sep 2025 15:49:15 +0200 Subject: [PATCH 3/4] added broadcaster name display in Syncshell finder table --- LightlessSync/Plugin.cs | 4 ++-- LightlessSync/UI/SyncshellFinderUI.cs | 29 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/LightlessSync/Plugin.cs b/LightlessSync/Plugin.cs index 09f218e..3529735 100644 --- a/LightlessSync/Plugin.cs +++ b/LightlessSync/Plugin.cs @@ -1,4 +1,4 @@ -using Dalamud.Game; +using Dalamud.Game; using Dalamud.Game.ClientState.Objects; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Interface.Windowing; @@ -230,7 +230,7 @@ public sealed class Plugin : IDalamudPlugin s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped((s) => new BroadcastUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); - collection.AddScoped((s) => new SyncshellFinderUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); + collection.AddScoped((s) => new SyncshellFinderUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped(); collection.AddScoped(); diff --git a/LightlessSync/UI/SyncshellFinderUI.cs b/LightlessSync/UI/SyncshellFinderUI.cs index 81f0b0e..32be263 100644 --- a/LightlessSync/UI/SyncshellFinderUI.cs +++ b/LightlessSync/UI/SyncshellFinderUI.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; @@ -24,6 +24,7 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase private readonly UiSharedService _uiSharedService; private readonly BroadcastScannerService _broadcastScannerService; private readonly PairManager _pairManager; + private readonly DalamudUtilService _dalamudUtilService; private readonly List _nearbySyncshells = []; private List _currentSyncshells = []; @@ -41,13 +42,15 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase UiSharedService uiShared, ApiController apiController, BroadcastScannerService broadcastScannerService, - PairManager pairManager) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService) + PairManager pairManager, + DalamudUtilService dalamudUtilService) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService) { _broadcastService = broadcastService; _uiSharedService = uiShared; _apiController = apiController; _broadcastScannerService = broadcastScannerService; _pairManager = pairManager; + _dalamudUtilService = dalamudUtilService; IsOpen = false; SizeConstraints = new() @@ -102,8 +105,8 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase if (ImGui.BeginTable("##NearbySyncshellsTable", 3, ImGuiTableFlags.Borders | ImGuiTableFlags.RowBg)) { - ImGui.TableSetupColumn("Alias", ImGuiTableColumnFlags.WidthStretch); - ImGui.TableSetupColumn("GID", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("Syncshell", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("Broadcaster", ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupColumn("Join", ImGuiTableColumnFlags.WidthFixed, 80f * ImGuiHelpers.GlobalScale); ImGui.TableHeadersRow(); @@ -111,9 +114,21 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase { ImGui.TableNextRow(); ImGui.TableNextColumn(); - ImGui.TextUnformatted(shell.Group.Alias ?? "(No Alias)"); + + var displayName = !string.IsNullOrEmpty(shell.Group.Alias) ? shell.Group.Alias : shell.Group.GID; + ImGui.TextUnformatted(displayName); + ImGui.TableNextColumn(); - ImGui.TextUnformatted(shell.Group.GID); + var broadcasts = _broadcastScannerService.GetActiveSyncshellBroadcasts(); + var broadcast = broadcasts.FirstOrDefault(b => string.Equals(b.GID, shell.Group.GID, StringComparison.Ordinal)); + var broadcasterName = "Unknown"; + if (broadcast != null) + { + var playerInfo = _dalamudUtilService.FindPlayerByNameHash(broadcast.HashedCID); + broadcasterName = !string.IsNullOrEmpty(playerInfo.Name) ? playerInfo.Name : "Unknown Player"; + } + ImGui.TextUnformatted(broadcasterName); + ImGui.TableNextColumn(); var label = $"Join##{shell.Group.GID}"; @@ -123,8 +138,6 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase if (!_currentSyncshells.Exists(g => string.Equals(g.GID, shell.GID, StringComparison.Ordinal))) { - - if (ImGui.Button(label)) { _logger.LogInformation($"Join requested for Syncshell {shell.Group.GID} ({shell.Group.Alias})"); From 0cc7181e98552f5e577f1d1288c8bd24a1bc2f43 Mon Sep 17 00:00:00 2001 From: choco Date: Sun, 28 Sep 2025 19:41:19 +0200 Subject: [PATCH 4/4] added world name to syncshell broadcaster info --- LightlessSync/Services/DalamudUtilService.cs | 15 +++++++++++++-- LightlessSync/UI/SyncshellFinderUI.cs | 12 +++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/LightlessSync/Services/DalamudUtilService.cs b/LightlessSync/Services/DalamudUtilService.cs index ed66506..e5fd735 100644 --- a/LightlessSync/Services/DalamudUtilService.cs +++ b/LightlessSync/Services/DalamudUtilService.cs @@ -1,4 +1,4 @@ -using Dalamud.Game.ClientState.Conditions; +using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; @@ -541,7 +541,6 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber curWaitTime += tick; Thread.Sleep(tick); } - Thread.Sleep(tick * 2); } @@ -557,6 +556,18 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber return result; } + public string? GetWorldNameFromPlayerAddress(nint address) + { + if (address == nint.Zero) return null; + + EnsureIsOnFramework(); + var playerCharacter = _objectTable.OfType().FirstOrDefault(p => p.Address == address); + if (playerCharacter == null) return null; + + var worldId = (ushort)playerCharacter.HomeWorld.RowId; + return WorldData.Value.TryGetValue(worldId, out var worldName) ? worldName : null; + } + private unsafe void CheckCharacterForDrawing(nint address, string characterName) { var gameObj = (GameObject*)address; diff --git a/LightlessSync/UI/SyncshellFinderUI.cs b/LightlessSync/UI/SyncshellFinderUI.cs index 32be263..4af72d5 100644 --- a/LightlessSync/UI/SyncshellFinderUI.cs +++ b/LightlessSync/UI/SyncshellFinderUI.cs @@ -119,13 +119,18 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase ImGui.TextUnformatted(displayName); ImGui.TableNextColumn(); - var broadcasts = _broadcastScannerService.GetActiveSyncshellBroadcasts(); - var broadcast = broadcasts.FirstOrDefault(b => string.Equals(b.GID, shell.Group.GID, StringComparison.Ordinal)); var broadcasterName = "Unknown"; + var broadcast = _broadcastScannerService.GetActiveSyncshellBroadcasts() + .FirstOrDefault(b => string.Equals(b.GID, shell.Group.GID, StringComparison.Ordinal)); + if (broadcast != null) { var playerInfo = _dalamudUtilService.FindPlayerByNameHash(broadcast.HashedCID); - broadcasterName = !string.IsNullOrEmpty(playerInfo.Name) ? playerInfo.Name : "Unknown Player"; + if (!string.IsNullOrEmpty(playerInfo.Name)) + { + var worldName = _dalamudUtilService.GetWorldNameFromPlayerAddress(playerInfo.Address); + broadcasterName = !string.IsNullOrEmpty(worldName) ? $"{playerInfo.Name} ({worldName})" : playerInfo.Name; + } } ImGui.TextUnformatted(broadcasterName); @@ -317,4 +322,5 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase return _nearbySyncshells[_selectedNearbyIndex].Group.GID; } + }