From cf827529abe167d172a5a81050f7c6de9553a80d Mon Sep 17 00:00:00 2001 From: Loporrit <141286461+loporrit@users.noreply.github.com> Date: Sat, 28 Jun 2025 16:52:47 +0000 Subject: [PATCH] add shared character data sets display to main ui --- MareSynchronos/UI/CompactUI.cs | 12 ++- MareSynchronos/UI/Components/DrawGroupPair.cs | 23 ++++- MareSynchronos/UI/Components/DrawUserPair.cs | 92 +++++++++++-------- MareSynchronos/UI/Components/GroupPanel.cs | 8 +- 4 files changed, 89 insertions(+), 46 deletions(-) diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index fbb7656..deb90cf 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -44,6 +44,7 @@ public class CompactUi : WindowMediatorSubscriberBase private readonly SelectPairForGroupUi _selectPairsForGroupUi; private readonly ServerConfigurationManager _serverManager; private readonly Stopwatch _timeout = new(); + private readonly CharaDataManager _charaDataManager; private readonly UidDisplayHandler _uidDisplayHandler; private readonly UiSharedService _uiSharedService; private bool _buttonState; @@ -59,7 +60,7 @@ public class CompactUi : WindowMediatorSubscriberBase private bool _wasOpen; public CompactUi(ILogger logger, UiSharedService uiShared, MareConfigService configService, ApiController apiController, PairManager pairManager, ChatService chatService, - ServerConfigurationManager serverManager, MareMediator mediator, FileUploadManager fileTransferManager, UidDisplayHandler uidDisplayHandler, + ServerConfigurationManager serverManager, MareMediator mediator, FileUploadManager fileTransferManager, UidDisplayHandler uidDisplayHandler, CharaDataManager charaDataManager, PerformanceCollectorService performanceCollectorService) : base(logger, mediator, "###LoporritSyncMainUI", performanceCollectorService) { @@ -71,9 +72,10 @@ public class CompactUi : WindowMediatorSubscriberBase _serverManager = serverManager; _fileTransferManager = fileTransferManager; _uidDisplayHandler = uidDisplayHandler; + _charaDataManager = charaDataManager; var tagHandler = new TagHandler(_serverManager); - _groupPanel = new(this, uiShared, _pairManager, _chatService, uidDisplayHandler, _configService, _serverManager); + _groupPanel = new(this, uiShared, _pairManager, _chatService, uidDisplayHandler, _configService, _serverManager, _charaDataManager); _selectGroupForPairUi = new(tagHandler, uidDisplayHandler, _uiSharedService); _selectPairsForGroupUi = new(tagHandler, uidDisplayHandler); _pairGroupsUi = new(configService, tagHandler, uidDisplayHandler, apiController, _selectPairsForGroupUi, _uiSharedService); @@ -371,9 +373,9 @@ public class CompactUi : WindowMediatorSubscriberBase : (ImGui.GetWindowContentRegionMax().Y - ImGui.GetWindowContentRegionMin().Y) - TransferPartHeight - ImGui.GetCursorPosY(); var users = GetFilteredUsers().OrderBy(u => u.GetPairSortKey()); - var onlineUsers = users.Where(u => u.UserPair!.OtherPermissions.IsPaired() && (u.IsOnline || u.UserPair!.OwnPermissions.IsPaused())).Select(c => new DrawUserPair("Online" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService)).ToList(); - var visibleUsers = users.Where(u => u.IsVisible).Select(c => new DrawUserPair("Visible" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService)).ToList(); - var offlineUsers = users.Where(u => !u.UserPair!.OtherPermissions.IsPaired() || (!u.IsOnline && !u.UserPair!.OwnPermissions.IsPaused())).Select(c => new DrawUserPair("Offline" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService)).ToList(); + var onlineUsers = users.Where(u => u.UserPair!.OtherPermissions.IsPaired() && (u.IsOnline || u.UserPair!.OwnPermissions.IsPaused())).Select(c => new DrawUserPair("Online" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService, _charaDataManager)).ToList(); + var visibleUsers = users.Where(u => u.IsVisible).Select(c => new DrawUserPair("Visible" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService, _charaDataManager)).ToList(); + var offlineUsers = users.Where(u => !u.UserPair!.OtherPermissions.IsPaired() || (!u.IsOnline && !u.UserPair!.OwnPermissions.IsPaused())).Select(c => new DrawUserPair("Offline" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService, _charaDataManager)).ToList(); ImGui.BeginChild("list", new Vector2(WindowContentWidth, ySize), border: false); diff --git a/MareSynchronos/UI/Components/DrawGroupPair.cs b/MareSynchronos/UI/Components/DrawGroupPair.cs index 37c2b8c..a0d8e1f 100644 --- a/MareSynchronos/UI/Components/DrawGroupPair.cs +++ b/MareSynchronos/UI/Components/DrawGroupPair.cs @@ -12,6 +12,7 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.Services.Mediator; using Dalamud.Interface.Utility; using MareSynchronos.UI.Components.Popup; +using MareSynchronos.Services; namespace MareSynchronos.UI.Components; @@ -20,15 +21,17 @@ public class DrawGroupPair : DrawPairBase protected readonly MareMediator _mediator; private readonly GroupPairFullInfoDto _fullInfoDto; private readonly GroupFullInfoDto _group; + private readonly CharaDataManager _charaDataManager; public DrawGroupPair(string id, Pair entry, ApiController apiController, MareMediator mareMediator, GroupFullInfoDto group, GroupPairFullInfoDto fullInfoDto, - UidDisplayHandler handler, UiSharedService uiSharedService) + UidDisplayHandler handler, UiSharedService uiSharedService, CharaDataManager charaDataManager) : base(id, entry, apiController, handler, uiSharedService) { _group = group; _fullInfoDto = fullInfoDto; _mediator = mareMediator; + _charaDataManager = charaDataManager; } protected override void DrawLeftSide(float textPosY, float originalY) @@ -140,6 +143,7 @@ public class DrawGroupPair : DrawPairBase var individualAnimDisabled = (_pair.UserPair?.OwnPermissions.IsDisableAnimations() ?? false) || (_pair.UserPair?.OtherPermissions.IsDisableAnimations() ?? false); var individualVFXDisabled = (_pair.UserPair?.OwnPermissions.IsDisableVFX() ?? false) || (_pair.UserPair?.OtherPermissions.IsDisableVFX() ?? false); + bool showShared = _charaDataManager.SharedWithYouData.TryGetValue(_pair.UserData, out var sharedData); bool showInfo = (individualAnimDisabled || individualSoundsDisabled || animDisabled || soundsDisabled); bool showPlus = _pair.UserPair == null; bool showBars = (userIsOwner || (userIsModerator && !entryIsMod && !entryIsOwner)) || !_pair.IsPaused; @@ -147,16 +151,33 @@ public class DrawGroupPair : DrawPairBase var spacing = ImGui.GetStyle().ItemSpacing.X; var permIcon = (individualAnimDisabled || individualSoundsDisabled || individualVFXDisabled) ? FontAwesomeIcon.ExclamationTriangle : ((soundsDisabled || animDisabled || vfxDisabled) ? FontAwesomeIcon.InfoCircle : FontAwesomeIcon.None); + var runningIconWidth = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Running).X; var infoIconWidth = UiSharedService.GetIconSize(permIcon).X; var plusButtonWidth = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Plus).X; var barButtonWidth = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Bars).X; var pos = ImGui.GetWindowContentRegionMin().X + UiSharedService.GetWindowContentRegionWidth() + spacing + - (showShared ? (runningIconWidth + spacing) : 0) - (showInfo ? (infoIconWidth + spacing) : 0) - (showPlus ? (plusButtonWidth + spacing) : 0) - (showBars ? (barButtonWidth + spacing) : 0); ImGui.SameLine(pos); + + if (showShared) + { + _uiSharedService.IconText(FontAwesomeIcon.Running); + + UiSharedService.AttachToolTip($"This user has shared {sharedData!.Count} Character Data Sets with you." + UiSharedService.TooltipSeparator + + "Click to open the Character Data Hub and show the entries."); + + if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) + { + _mediator.Publish(new OpenCharaDataHubWithFilterMessage(_pair.UserData)); + } + ImGui.SameLine(); + } + if (individualAnimDisabled || individualSoundsDisabled) { ImGui.SetCursorPosY(textPosY); diff --git a/MareSynchronos/UI/Components/DrawUserPair.cs b/MareSynchronos/UI/Components/DrawUserPair.cs index a0a418d..eee5b60 100644 --- a/MareSynchronos/UI/Components/DrawUserPair.cs +++ b/MareSynchronos/UI/Components/DrawUserPair.cs @@ -11,6 +11,7 @@ using MareSynchronos.API.Dto.User; using MareSynchronos.Services.Mediator; using MareSynchronos.UI.Handlers; using Dalamud.Interface.Utility; +using MareSynchronos.Services; namespace MareSynchronos.UI.Components; @@ -18,16 +19,18 @@ public class DrawUserPair : DrawPairBase { protected readonly MareMediator _mediator; private readonly SelectGroupForPairUi _selectGroupForPairUi; + private readonly CharaDataManager _charaDataManager; public DrawUserPair(string id, Pair entry, UidDisplayHandler displayHandler, ApiController apiController, MareMediator mareMediator, SelectGroupForPairUi selectGroupForPairUi, - UiSharedService uiSharedService) + UiSharedService uiSharedService, CharaDataManager charaDataManager) : base(id, entry, apiController, displayHandler, uiSharedService) { if (_pair.UserPair == null) throw new ArgumentException("Pair must be UserPair", nameof(entry)); _pair = entry; _selectGroupForPairUi = selectGroupForPairUi; _mediator = mareMediator; + _charaDataManager = charaDataManager; } public bool IsOnline => _pair.IsOnline; @@ -103,22 +106,51 @@ public class DrawUserPair : DrawPairBase var entryUID = _pair.UserData.AliasOrUID; var spacingX = ImGui.GetStyle().ItemSpacing.X; var windowEndX = ImGui.GetWindowContentRegionMin().X + UiSharedService.GetWindowContentRegionWidth(); - var rightSideStart = 0f; + var rightSidePos = windowEndX - barButtonSize.X; + // Flyout Menu + ImGui.SameLine(rightSidePos); + ImGui.SetCursorPosY(originalY); + + if (_uiSharedService.IconButton(FontAwesomeIcon.Bars)) + { + ImGui.OpenPopup("User Flyout Menu"); + } + if (ImGui.BeginPopup("User Flyout Menu")) + { + using (ImRaii.PushId($"buttons-{_pair.UserData.UID}")) DrawPairedClientMenu(_pair); + ImGui.EndPopup(); + } + + // Pause (mutual pairs only) if (_pair.UserPair!.OwnPermissions.IsPaired() && _pair.UserPair!.OtherPermissions.IsPaired()) { + rightSidePos -= pauseIconSize.X + spacingX; + ImGui.SameLine(rightSidePos); + ImGui.SetCursorPosY(originalY); + if (_uiSharedService.IconButton(pauseIcon)) + { + var perm = _pair.UserPair!.OwnPermissions; + perm.SetPaused(!perm.IsPaused()); + _ = _apiController.UserSetPairPermissions(new(_pair.UserData, perm)); + } + UiSharedService.AttachToolTip(!_pair.UserPair!.OwnPermissions.IsPaused() + ? "Pause pairing with " + entryUID + : "Resume pairing with " + entryUID); + + var individualSoundsDisabled = (_pair.UserPair?.OwnPermissions.IsDisableSounds() ?? false) || (_pair.UserPair?.OtherPermissions.IsDisableSounds() ?? false); var individualAnimDisabled = (_pair.UserPair?.OwnPermissions.IsDisableAnimations() ?? false) || (_pair.UserPair?.OtherPermissions.IsDisableAnimations() ?? false); var individualVFXDisabled = (_pair.UserPair?.OwnPermissions.IsDisableVFX() ?? false) || (_pair.UserPair?.OtherPermissions.IsDisableVFX() ?? false); - if (individualAnimDisabled || individualSoundsDisabled || individualVFXDisabled) + // Icon for individually applied permissions + if (individualSoundsDisabled || individualAnimDisabled || individualVFXDisabled) { - var infoIconPosDist = windowEndX - barButtonSize.X - spacingX - pauseIconSize.X - spacingX; var icon = FontAwesomeIcon.ExclamationTriangle; var iconwidth = _uiSharedService.GetIconButtonSize(icon); - rightSideStart = infoIconPosDist - iconwidth.X; - ImGui.SameLine(infoIconPosDist - iconwidth.X); + rightSidePos -= iconwidth.X + spacingX / 2f; + ImGui.SameLine(rightSidePos); ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudYellow); _uiSharedService.IconText(icon); @@ -165,43 +197,27 @@ public class DrawUserPair : DrawPairBase ImGui.EndTooltip(); } } + } - if (rightSideStart == 0f) + // Icon for shared character data + if (_charaDataManager.SharedWithYouData.TryGetValue(_pair.UserData, out var sharedData)) + { + var icon = FontAwesomeIcon.Running; + var iconwidth = _uiSharedService.GetIconButtonSize(icon); + rightSidePos -= iconwidth.X + spacingX / 2f; + ImGui.SameLine(rightSidePos); + _uiSharedService.IconText(icon); + + UiSharedService.AttachToolTip($"This user has shared {sharedData.Count} Character Data Sets with you." + UiSharedService.TooltipSeparator + + "Click to open the Character Data Hub and show the entries."); + + if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) { - rightSideStart = windowEndX - barButtonSize.X - spacingX * 2 - pauseIconSize.X; + _mediator.Publish(new OpenCharaDataHubWithFilterMessage(_pair.UserData)); } - ImGui.SameLine(windowEndX - barButtonSize.X - spacingX - pauseIconSize.X); - ImGui.SetCursorPosY(originalY); - if (_uiSharedService.IconButton(pauseIcon)) - { - var perm = _pair.UserPair!.OwnPermissions; - perm.SetPaused(!perm.IsPaused()); - _ = _apiController.UserSetPairPermissions(new(_pair.UserData, perm)); - } - UiSharedService.AttachToolTip(!_pair.UserPair!.OwnPermissions.IsPaused() - ? "Pause pairing with " + entryUID - : "Resume pairing with " + entryUID); } - // Flyout Menu - if (rightSideStart == 0f) - { - rightSideStart = windowEndX - barButtonSize.X; - } - ImGui.SameLine(windowEndX - barButtonSize.X); - ImGui.SetCursorPosY(originalY); - - if (_uiSharedService.IconButton(FontAwesomeIcon.Bars)) - { - ImGui.OpenPopup("User Flyout Menu"); - } - if (ImGui.BeginPopup("User Flyout Menu")) - { - using (ImRaii.PushId($"buttons-{_pair.UserData.UID}")) DrawPairedClientMenu(_pair); - ImGui.EndPopup(); - } - - return rightSideStart; + return rightSidePos - spacingX; } private void DrawPairedClientMenu(Pair entry) diff --git a/MareSynchronos/UI/Components/GroupPanel.cs b/MareSynchronos/UI/Components/GroupPanel.cs index 2624b6c..168c69f 100644 --- a/MareSynchronos/UI/Components/GroupPanel.cs +++ b/MareSynchronos/UI/Components/GroupPanel.cs @@ -31,6 +31,7 @@ internal sealed class GroupPanel private readonly ChatService _chatService; private readonly MareConfigService _mareConfig; private readonly ServerConfigurationManager _serverConfigurationManager; + private readonly CharaDataManager _charaDataManager; private readonly Dictionary _showGidForEntry = new(StringComparer.Ordinal); private readonly UidDisplayHandler _uidDisplayHandler; private readonly UiSharedService _uiShared; @@ -56,7 +57,8 @@ internal sealed class GroupPanel private string _syncShellToJoin = string.Empty; public GroupPanel(CompactUi mainUi, UiSharedService uiShared, PairManager pairManager, ChatService chatServivce, - UidDisplayHandler uidDisplayHandler, MareConfigService mareConfig, ServerConfigurationManager serverConfigurationManager) + UidDisplayHandler uidDisplayHandler, MareConfigService mareConfig, ServerConfigurationManager serverConfigurationManager, + CharaDataManager charaDataManager) { _mainUi = mainUi; _uiShared = uiShared; @@ -65,6 +67,7 @@ internal sealed class GroupPanel _uidDisplayHandler = uidDisplayHandler; _mareConfig = mareConfig; _serverConfigurationManager = serverConfigurationManager; + _charaDataManager = charaDataManager; } private ApiController ApiController => _uiShared.ApiController; @@ -435,7 +438,8 @@ internal sealed class GroupPanel g => GroupDataComparer.Instance.Equals(g.Key.Group, groupDto.Group) ).Value, _uidDisplayHandler, - _uiShared); + _uiShared, + _charaDataManager); if (pair.IsVisible) visibleUsers.Add(drawPair);