diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index cf73dac..69d3caa 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -20,6 +20,7 @@ using MareSynchronos.WebAPI.Files.Models; using MareSynchronos.WebAPI.SignalR.Utils; using Microsoft.Extensions.Logging; using System.Collections.Concurrent; +using System.Collections.Immutable; using System.Globalization; using System.Numerics; using System.Reflection; @@ -392,47 +393,67 @@ public class CompactUi : WindowMediatorSubscriberBase { List drawFolders = []; - var users = GetFilteredGroupUsers() - .ToDictionary(g => g.Key, g => g.Value); + var allPairs = _pairManager.PairsWithGroups + .ToImmutableDictionary(k => k.Key, k => k.Value); + var filteredUsers = allPairs + .Where(p => + { + if (_tabMenu.Filter.IsNullOrEmpty()) return true; + return p.Key.UserData.AliasOrUID.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) || + (p.Key.GetNote()?.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) ?? false) || + (p.Key.PlayerName?.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) ?? false); + }) + .ToImmutableDictionary(k => k.Key, k => k.Value); + + string? alphabeticalSortFunc(KeyValuePair> u) + => (_configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) + ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) + : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID)); if (_configService.Current.ShowVisibleUsersSeparately) { - var visibleUsers = users.Where(u => u.Key.IsVisible && - (_configService.Current.ShowSyncshellUsersInVisible || !(!_configService.Current.ShowSyncshellUsersInVisible && !u.Key.IsDirectlyPaired))) - .OrderBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) - .ToDictionary(k => k.Key, k => k.Value); + var allUsers = allPairs + .Where(u => u.Key.IsVisible + && (_configService.Current.ShowSyncshellUsersInVisible || !(!_configService.Current.ShowSyncshellUsersInVisible && !u.Key.IsDirectlyPaired))) + .Select(k => k.Key) + .ToImmutableList(); - drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomVisibleTag, visibleUsers)); + var visibleUsers = filteredUsers + .Where(u => u.Key.IsVisible + && (_configService.Current.ShowSyncshellUsersInVisible || !(!_configService.Current.ShowSyncshellUsersInVisible && !u.Key.IsDirectlyPaired))) + .OrderBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) + .ToImmutableDictionary(k => k.Key, k => k.Value); + + drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomVisibleTag, visibleUsers, allUsers)); } List groupFolders = new(); foreach (var group in _pairManager.GroupPairs.Select(g => g.Key).OrderBy(g => g.GroupAliasOrGID, StringComparer.OrdinalIgnoreCase)) { - var groupUsers2 = users.Where(v => v.Value.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal)) + var allUsers = allPairs + .Where(v => v.Value.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal))) + .Select(k => k.Key) + .ToImmutableList(); + + var groupUsers = filteredUsers + .Where(v => v.Value.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal)) && (v.Key.IsOnline || (!v.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) || v.Key.UserPair.OwnPermissions.IsPaused())) - .OrderByDescending(u => u.Key.IsOnline) - .ThenBy(u => + .OrderByDescending(u => u.Key.IsOnline) + .ThenBy(u => + { + if (string.Equals(u.Key.UserData.UID, group.OwnerUID, StringComparison.Ordinal)) return 0; + if (group.GroupPairUserInfos.TryGetValue(u.Key.UserData.UID, out var info)) { - if (string.Equals(u.Key.UserData.UID, group.OwnerUID, StringComparison.Ordinal)) return 0; - if (group.GroupPairUserInfos.TryGetValue(u.Key.UserData.UID, out var info)) - { - if (info.IsModerator()) return 1; - if (info.IsPinned()) return 2; - } - return u.Key.IsVisible ? 3 : 4; - }) - .ThenBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) - .ToDictionary(k => k.Key, k => k.Value); + if (info.IsModerator()) return 1; + if (info.IsPinned()) return 2; + } + return u.Key.IsVisible ? 3 : 4; + }) + .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) + .ToImmutableDictionary(k => k.Key, k => k.Value); - groupFolders.Add(_drawEntityFactory.CreateDrawGroupFolder(group, groupUsers2, - users.Count(v => v.Value.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal))))); + groupFolders.Add(_drawEntityFactory.CreateDrawGroupFolder(group, groupUsers, allUsers)); } if (_configService.Current.GroupUpSyncshells) @@ -444,77 +465,85 @@ public class CompactUi : WindowMediatorSubscriberBase HashSet alreadyInTags = []; foreach (var tag in tags) { - var tagUsers = users.Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && _tagHandler.HasTag(u.Key.UserData.UID, tag) - && (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) - || u.Key.UserPair.OwnPermissions.IsPaused())) + var allUsers = allPairs + .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && _tagHandler.HasTag(u.Key.UserData.UID, tag)) + .Select(k => k.Key) + .ToImmutableList(); + + var tagUsers = filteredUsers + .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && _tagHandler.HasTag(u.Key.UserData.UID, tag) + && (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) + || u.Key.UserPair.OwnPermissions.IsPaused())) .OrderByDescending(u => u.Key.IsVisible) .ThenByDescending(u => u.Key.IsOnline) - .ThenBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) - .ToDictionary(u => u.Key, u => u.Value); + .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase); drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(tag, tagUsers.Select(u => { alreadyInTags.Add(u.Key); return (u.Key, u.Value); - }).ToDictionary(u => u.Key, u => u.Value), users.Count(u => _tagHandler.HasTag(u.Key.UserData.UID, tag)))); + }).ToImmutableDictionary(u => u.Key, u => u.Value), allUsers)); } - var onlineDirectPairedUsersNotInTags = users.Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && !_tagHandler.HasAnyTag(u.Key.UserData.UID) - && (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) - || u.Key.UserPair.OwnPermissions.IsPaused())) + var onlineAllPairedUsersNotInTags = allPairs + .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && !_tagHandler.HasAnyTag(u.Key.UserData.UID)) + .Select(k => k.Key) + .ToImmutableList(); + + var onlineDirectPairedUsersNotInTags = filteredUsers + .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && !_tagHandler.HasAnyTag(u.Key.UserData.UID) + && (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) + || u.Key.UserPair.OwnPermissions.IsPaused())) .OrderByDescending(u => u.Key.IsVisible) .ThenByDescending(u => u.Key.IsOnline) - .ThenBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) - .ToDictionary(u => u.Key, u => u.Value); + .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) + .ToImmutableDictionary(u => u.Key, u => u.Value); drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder((_configService.Current.ShowOfflineUsersSeparately ? TagHandler.CustomOnlineTag : TagHandler.CustomAllTag), - onlineDirectPairedUsersNotInTags)); + onlineDirectPairedUsersNotInTags, onlineAllPairedUsersNotInTags)); if (_configService.Current.ShowOfflineUsersSeparately) { - var offlineUsersEntries = users.Where(u => - ((u.Key.IsDirectlyPaired && _configService.Current.ShowSyncshellOfflineUsersSeparately) || !_configService.Current.ShowSyncshellOfflineUsersSeparately) - && (!u.Key.IsOneSidedPair || u.Value.Any()) && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()).OrderBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) - .ToDictionary(u => u.Key, u => u.Value); + var allOfflineUsersEntries = allPairs + .Where(u => ((u.Key.IsDirectlyPaired && _configService.Current.ShowSyncshellOfflineUsersSeparately) + || !_configService.Current.ShowSyncshellOfflineUsersSeparately) + && (!u.Key.IsOneSidedPair || u.Value.Any()) && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) + .Select(k => k.Key) + .ToImmutableList(); - drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomOfflineTag, offlineUsersEntries)); + var offlineUsersEntries = filteredUsers + .Where(u => ((u.Key.IsDirectlyPaired && _configService.Current.ShowSyncshellOfflineUsersSeparately) + || !_configService.Current.ShowSyncshellOfflineUsersSeparately) + && (!u.Key.IsOneSidedPair || u.Value.Any()) && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) + .OrderBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) + .ToImmutableDictionary(u => u.Key, u => u.Value); + + drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomOfflineTag, offlineUsersEntries, allOfflineUsersEntries)); if (_configService.Current.ShowSyncshellOfflineUsersSeparately) { - var offlineSyncshellUsers = users.Where(u => !u.Key.IsDirectlyPaired && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()).OrderBy( - u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) - ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) - : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase); - drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomOfflineSyncshellTag, offlineSyncshellUsers.ToDictionary(k => k.Key, k => k.Value))); + var allOfflineSyncshellUsers = allPairs + .Where(u => !u.Key.IsDirectlyPaired && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) + .Select(k => k.Key) + .ToImmutableList(); + + var offlineSyncshellUsers = allPairs + .Where(u => !u.Key.IsDirectlyPaired && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) + .OrderBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) + .ToImmutableDictionary(k => k.Key, k => k.Value); + + drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomOfflineSyncshellTag, + offlineSyncshellUsers, + allOfflineSyncshellUsers)); } } - drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomUnpairedTag, users.Where(u => u.Key.IsOneSidedPair).ToDictionary(u => u.Key, u => u.Value))); + drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomUnpairedTag, + filteredUsers.Where(u => u.Key.IsOneSidedPair).ToImmutableDictionary(u => u.Key, u => u.Value), + allPairs.Where(u => u.Key.IsOneSidedPair).Select(k => k.Key).ToImmutableList())); return drawFolders; } - private Dictionary> GetFilteredGroupUsers() - { - if (string.IsNullOrEmpty(_tabMenu.Filter)) return _pairManager.PairsWithGroups; - - return _pairManager.PairsWithGroups.Where(p => - { - if (_tabMenu.Filter.IsNullOrEmpty()) return true; - return p.Key.UserData.AliasOrUID.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) || - (p.Key.GetNote()?.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) ?? false) || - (p.Key.PlayerName?.Contains(_tabMenu.Filter, StringComparison.OrdinalIgnoreCase) ?? false); - }).ToDictionary(k => k.Key, k => k.Value); - } - private string GetServerError() { return _apiController.ServerState switch diff --git a/MareSynchronos/UI/Components/DrawFolderBase.cs b/MareSynchronos/UI/Components/DrawFolderBase.cs index c2a487f..7d47425 100644 --- a/MareSynchronos/UI/Components/DrawFolderBase.cs +++ b/MareSynchronos/UI/Components/DrawFolderBase.cs @@ -2,24 +2,29 @@ using Dalamud.Interface.Components; using Dalamud.Interface.Utility.Raii; using ImGuiNET; +using MareSynchronos.PlayerData.Pairs; using MareSynchronos.UI.Handlers; +using System.Collections.Immutable; namespace MareSynchronos.UI.Components; public abstract class DrawFolderBase : IDrawFolder { - public IEnumerable DrawPairs { get; private set; } + public IImmutableList DrawPairs { get; init; } protected readonly string _id; + protected readonly IImmutableList _allPairs; protected readonly TagHandler _tagHandler; private float _menuWidth = -1; public int OnlinePairs => DrawPairs.Count(u => u.Pair.IsOnline); - public int TotalPairs { get; } - protected DrawFolderBase(string id, IEnumerable drawPairs, TagHandler tagHandler, int totalPairs) + public int TotalPairs => _allPairs.Count; + + protected DrawFolderBase(string id, IImmutableList drawPairs, + IImmutableList allPairs, TagHandler tagHandler) { _id = id; DrawPairs = drawPairs; + _allPairs = allPairs; _tagHandler = tagHandler; - TotalPairs = totalPairs; } protected abstract bool RenderIfEmpty { get; } diff --git a/MareSynchronos/UI/Components/DrawFolderGroup.cs b/MareSynchronos/UI/Components/DrawFolderGroup.cs index 1151b3b..b85d47a 100644 --- a/MareSynchronos/UI/Components/DrawFolderGroup.cs +++ b/MareSynchronos/UI/Components/DrawFolderGroup.cs @@ -6,9 +6,11 @@ using Dalamud.Interface.Utility.Raii; using ImGuiNET; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto.Group; +using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services.Mediator; using MareSynchronos.UI.Handlers; using MareSynchronos.WebAPI; +using System.Collections.Immutable; namespace MareSynchronos.UI.Components; @@ -20,9 +22,9 @@ public class DrawFolderGroup : DrawFolderBase private readonly MareMediator _mareMediator; public DrawFolderGroup(string id, GroupFullInfoDto groupFullInfoDto, ApiController apiController, - IEnumerable drawPairs, TagHandler tagHandler, IdDisplayHandler idDisplayHandler, - MareMediator mareMediator, int totalPairs) : - base(id, drawPairs, tagHandler, totalPairs) + IImmutableList drawPairs, IImmutableList allPairs, TagHandler tagHandler, IdDisplayHandler idDisplayHandler, + MareMediator mareMediator) : + base(id, drawPairs, allPairs, tagHandler) { _groupFullInfoDto = groupFullInfoDto; _apiController = apiController; diff --git a/MareSynchronos/UI/Components/DrawFolderTag.cs b/MareSynchronos/UI/Components/DrawFolderTag.cs index ba8f7d5..e1acba5 100644 --- a/MareSynchronos/UI/Components/DrawFolderTag.cs +++ b/MareSynchronos/UI/Components/DrawFolderTag.cs @@ -3,8 +3,10 @@ using Dalamud.Interface.Components; using Dalamud.Interface.Utility.Raii; using ImGuiNET; using MareSynchronos.API.Data.Extensions; +using MareSynchronos.PlayerData.Pairs; using MareSynchronos.UI.Handlers; using MareSynchronos.WebAPI; +using System.Collections.Immutable; namespace MareSynchronos.UI.Components; @@ -13,8 +15,9 @@ public class DrawFolderTag : DrawFolderBase private readonly ApiController _apiController; private readonly SelectPairForTagUi _selectPairForTagUi; - public DrawFolderTag(string id, IEnumerable drawPairs, TagHandler tagHandler, ApiController apiController, SelectPairForTagUi selectPairForTagUi, int totalPairs) - : base(id, drawPairs, tagHandler, totalPairs) + public DrawFolderTag(string id, IImmutableList drawPairs, IImmutableList allPairs, + TagHandler tagHandler, ApiController apiController, SelectPairForTagUi selectPairForTagUi) + : base(id, drawPairs, allPairs, tagHandler) { _apiController = apiController; _selectPairForTagUi = selectPairForTagUi; @@ -51,7 +54,7 @@ public class DrawFolderTag : DrawFolderBase TagHandler.CustomAllTag => false, TagHandler.CustomOfflineSyncshellTag => false, _ => true, - } && DrawPairs.Any(); + } && _allPairs.Any(); private bool RenderCount => _id switch { @@ -135,7 +138,7 @@ public class DrawFolderTag : DrawFolderBase { if (!RenderPause) return currentRightSideX; - var allArePaused = DrawPairs.All(pair => pair.UserPair!.OwnPermissions.IsPaused()); + var allArePaused = _allPairs.All(pair => pair.UserPair!.OwnPermissions.IsPaused()); var pauseButton = allArePaused ? FontAwesomeIcon.Play : FontAwesomeIcon.Pause; var pauseButtonX = UiSharedService.GetIconButtonSize(pauseButton).X; @@ -145,11 +148,11 @@ public class DrawFolderTag : DrawFolderBase { if (allArePaused) { - ResumeAllPairs(DrawPairs); + ResumeAllPairs(_allPairs); } else { - PauseRemainingPairs(DrawPairs); + PauseRemainingPairs(_allPairs); } } if (allArePaused) @@ -164,10 +167,10 @@ public class DrawFolderTag : DrawFolderBase return currentRightSideX; } - private void PauseRemainingPairs(IEnumerable availablePairs) + private void PauseRemainingPairs(IEnumerable availablePairs) { _ = _apiController.SetBulkPermissions(new(availablePairs - .ToDictionary(g => g.UID, g => + .ToDictionary(g => g.UserData.UID, g => { var perm = g.UserPair.OwnPermissions; perm.SetPaused(paused: true); @@ -176,10 +179,10 @@ public class DrawFolderTag : DrawFolderBase .ConfigureAwait(false); } - private void ResumeAllPairs(IEnumerable availablePairs) + private void ResumeAllPairs(IEnumerable availablePairs) { _ = _apiController.SetBulkPermissions(new(availablePairs - .ToDictionary(g => g.UID, g => + .ToDictionary(g => g.UserData.UID, g => { var perm = g.UserPair.OwnPermissions; perm.SetPaused(paused: false); diff --git a/MareSynchronos/UI/Components/DrawGroupedGroupFolder.cs b/MareSynchronos/UI/Components/DrawGroupedGroupFolder.cs index 6968924..d323b3e 100644 --- a/MareSynchronos/UI/Components/DrawGroupedGroupFolder.cs +++ b/MareSynchronos/UI/Components/DrawGroupedGroupFolder.cs @@ -2,6 +2,7 @@ using Dalamud.Interface.Utility.Raii; using ImGuiNET; using MareSynchronos.UI.Handlers; +using System.Collections.Immutable; namespace MareSynchronos.UI.Components; @@ -9,8 +10,8 @@ public class DrawGroupedGroupFolder : IDrawFolder { private readonly IEnumerable _groups; private readonly TagHandler _tagHandler; - public IEnumerable DrawPairs => throw new NotSupportedException(); - public int OnlinePairs => _groups.SelectMany(g => g.DrawPairs).Where(g => g.Pair.IsOnline).DistinctBy(g => g.UID).Count(); + public IImmutableList DrawPairs => throw new NotSupportedException(); + public int OnlinePairs => _groups.SelectMany(g => g.DrawPairs).Where(g => g.Pair.IsOnline).DistinctBy(g => g.Pair.UserData.UID).Count(); public int TotalPairs => _groups.Sum(g => g.TotalPairs); public DrawGroupedGroupFolder(IEnumerable groups, TagHandler tagHandler) diff --git a/MareSynchronos/UI/Components/DrawUserPair.cs b/MareSynchronos/UI/Components/DrawUserPair.cs index 8752596..6f05ad4 100644 --- a/MareSynchronos/UI/Components/DrawUserPair.cs +++ b/MareSynchronos/UI/Components/DrawUserPair.cs @@ -43,15 +43,11 @@ public class DrawUserPair } public Pair Pair => _pair; - public string UID => _pair.UserData.UID; public UserFullPairDto UserPair => _pair.UserPair!; public void DrawPairedClient() { using var id = ImRaii.PushId(GetType() + _id); - var originalY = ImGui.GetCursorPosY(); - var pauseIconSize = UiSharedService.GetIconButtonSize(FontAwesomeIcon.Bars); - var textSize = ImGui.CalcTextSize(_pair.UserData.AliasOrUID); DrawLeftSide(); ImGui.SameLine(); diff --git a/MareSynchronos/UI/Components/IDrawFolder.cs b/MareSynchronos/UI/Components/IDrawFolder.cs index 82a2df5..cfac371 100644 --- a/MareSynchronos/UI/Components/IDrawFolder.cs +++ b/MareSynchronos/UI/Components/IDrawFolder.cs @@ -1,11 +1,12 @@  +using System.Collections.Immutable; + namespace MareSynchronos.UI.Components; public interface IDrawFolder { int TotalPairs { get; } int OnlinePairs { get; } - IEnumerable DrawPairs { get; } - + IImmutableList DrawPairs { get; } void Draw(); } diff --git a/MareSynchronos/UI/DrawEntityFactory.cs b/MareSynchronos/UI/DrawEntityFactory.cs index 320c9b2..6989d37 100644 --- a/MareSynchronos/UI/DrawEntityFactory.cs +++ b/MareSynchronos/UI/DrawEntityFactory.cs @@ -6,6 +6,7 @@ using MareSynchronos.UI.Components; using MareSynchronos.UI.Handlers; using MareSynchronos.WebAPI; using Microsoft.Extensions.Logging; +using System.Collections.Immutable; namespace MareSynchronos.UI; @@ -35,17 +36,19 @@ public class DrawEntityFactory _serverConfigurationManager = serverConfigurationManager; } - public DrawFolderGroup CreateDrawGroupFolder(GroupFullInfoDto groupFullInfoDto, Dictionary> pairs, int totalPairs = -1) + public DrawFolderGroup CreateDrawGroupFolder(GroupFullInfoDto groupFullInfoDto, IImmutableDictionary> pairs, + IImmutableList allPairs) { return new DrawFolderGroup(groupFullInfoDto.Group.GID, groupFullInfoDto, _apiController, - pairs.Select(p => CreateDrawPair(groupFullInfoDto.Group.GID + p.Key.UserData.UID, p.Key, p.Value)).ToList(), - _tagHandler, _uidDisplayHandler, _mediator, totalPairs); + pairs.Select(p => CreateDrawPair(groupFullInfoDto.Group.GID + p.Key.UserData.UID, p.Key, p.Value)).ToImmutableList(), + allPairs, _tagHandler, _uidDisplayHandler, _mediator); } - public DrawFolderTag CreateDrawTagFolder(string tag, Dictionary> pairs, int totalPairs = -1) + public DrawFolderTag CreateDrawTagFolder(string tag, IImmutableDictionary> pairs, + IImmutableList allPairs) { - return new(tag, pairs.Select(u => CreateDrawPair(tag, u.Key, u.Value)).ToList(), - _tagHandler, _apiController, _selectPairForTagUi, totalPairs); + return new(tag, pairs.Select(u => CreateDrawPair(tag, u.Key, u.Value)).ToImmutableList(), + allPairs, _tagHandler, _apiController, _selectPairForTagUi); } public DrawUserPair CreateDrawPair(string id, Pair user, List groups)