make local groups more usable for pause/resume
This commit is contained in:
		| @@ -20,6 +20,7 @@ using MareSynchronos.WebAPI.Files.Models; | |||||||
| using MareSynchronos.WebAPI.SignalR.Utils; | using MareSynchronos.WebAPI.SignalR.Utils; | ||||||
| using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||||
|  | using System.Collections.Immutable; | ||||||
| using System.Globalization; | using System.Globalization; | ||||||
| using System.Numerics; | using System.Numerics; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
| @@ -392,26 +393,50 @@ public class CompactUi : WindowMediatorSubscriberBase | |||||||
|     { |     { | ||||||
|         List<IDrawFolder> drawFolders = []; |         List<IDrawFolder> drawFolders = []; | ||||||
|  |  | ||||||
|         var users = GetFilteredGroupUsers() |         var allPairs = _pairManager.PairsWithGroups | ||||||
|             .ToDictionary(g => g.Key, g => g.Value); |             .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<Pair, List<GroupFullInfoDto>> 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) |         if (_configService.Current.ShowVisibleUsersSeparately) | ||||||
|         { |         { | ||||||
|             var visibleUsers = users.Where(u => u.Key.IsVisible && |             var allUsers = allPairs | ||||||
|                 (_configService.Current.ShowSyncshellUsersInVisible || !(!_configService.Current.ShowSyncshellUsersInVisible && !u.Key.IsDirectlyPaired))) |                 .Where(u => u.Key.IsVisible  | ||||||
|             .OrderBy( |                     && (_configService.Current.ShowSyncshellUsersInVisible || !(!_configService.Current.ShowSyncshellUsersInVisible && !u.Key.IsDirectlyPaired))) | ||||||
|                     u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) |                 .Select(k => k.Key) | ||||||
|                         ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) |                 .ToImmutableList(); | ||||||
|                         : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) |  | ||||||
|             .ToDictionary(k => k.Key, k => k.Value); |  | ||||||
|  |  | ||||||
|             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<IDrawFolder> groupFolders = new(); |         List<IDrawFolder> groupFolders = new(); | ||||||
|         foreach (var group in _pairManager.GroupPairs.Select(g => g.Key).OrderBy(g => g.GroupAliasOrGID, StringComparer.OrdinalIgnoreCase)) |         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.IsOnline || (!v.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) | ||||||
|                     || v.Key.UserPair.OwnPermissions.IsPaused())) |                     || v.Key.UserPair.OwnPermissions.IsPaused())) | ||||||
|                 .OrderByDescending(u => u.Key.IsOnline) |                 .OrderByDescending(u => u.Key.IsOnline) | ||||||
| @@ -425,14 +450,10 @@ public class CompactUi : WindowMediatorSubscriberBase | |||||||
|                     } |                     } | ||||||
|                     return u.Key.IsVisible ? 3 : 4; |                     return u.Key.IsVisible ? 3 : 4; | ||||||
|                 }) |                 }) | ||||||
|                     .ThenBy( |                 .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) | ||||||
|                     u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) |                 .ToImmutableDictionary(k => k.Key, k => k.Value); | ||||||
|                         ? (_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); |  | ||||||
|  |  | ||||||
|             groupFolders.Add(_drawEntityFactory.CreateDrawGroupFolder(group, groupUsers2, |             groupFolders.Add(_drawEntityFactory.CreateDrawGroupFolder(group, groupUsers, allUsers)); | ||||||
|                 users.Count(v => v.Value.Exists(g => string.Equals(g.GID, group.GID, StringComparison.Ordinal))))); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (_configService.Current.GroupUpSyncshells) |         if (_configService.Current.GroupUpSyncshells) | ||||||
| @@ -444,77 +465,85 @@ public class CompactUi : WindowMediatorSubscriberBase | |||||||
|         HashSet<Pair> alreadyInTags = []; |         HashSet<Pair> alreadyInTags = []; | ||||||
|         foreach (var tag in tags) |         foreach (var tag in tags) | ||||||
|         { |         { | ||||||
|             var tagUsers = users.Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && _tagHandler.HasTag(u.Key.UserData.UID, tag) |             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.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) | ||||||
|                     || u.Key.UserPair.OwnPermissions.IsPaused())) |                     || u.Key.UserPair.OwnPermissions.IsPaused())) | ||||||
|                 .OrderByDescending(u => u.Key.IsVisible) |                 .OrderByDescending(u => u.Key.IsVisible) | ||||||
|                 .ThenByDescending(u => u.Key.IsOnline) |                 .ThenByDescending(u => u.Key.IsOnline) | ||||||
|                 .ThenBy( |                 .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase); | ||||||
|                     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); |  | ||||||
|  |  | ||||||
|             drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(tag, tagUsers.Select(u => |             drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(tag, tagUsers.Select(u => | ||||||
|             { |             { | ||||||
|                 alreadyInTags.Add(u.Key); |                 alreadyInTags.Add(u.Key); | ||||||
|                 return (u.Key, u.Value); |                 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) |         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.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) | ||||||
|                     || u.Key.UserPair.OwnPermissions.IsPaused())) |                     || u.Key.UserPair.OwnPermissions.IsPaused())) | ||||||
|             .OrderByDescending(u => u.Key.IsVisible) |             .OrderByDescending(u => u.Key.IsVisible) | ||||||
|             .ThenByDescending(u => u.Key.IsOnline) |             .ThenByDescending(u => u.Key.IsOnline) | ||||||
|             .ThenBy( |             .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase) | ||||||
|                 u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) |             .ToImmutableDictionary(u => u.Key, u => u.Value); | ||||||
|                     ? (_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); |  | ||||||
|  |  | ||||||
|         drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder((_configService.Current.ShowOfflineUsersSeparately ? TagHandler.CustomOnlineTag : TagHandler.CustomAllTag), |         drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder((_configService.Current.ShowOfflineUsersSeparately ? TagHandler.CustomOnlineTag : TagHandler.CustomAllTag), | ||||||
|             onlineDirectPairedUsersNotInTags)); |             onlineDirectPairedUsersNotInTags, onlineAllPairedUsersNotInTags)); | ||||||
|  |  | ||||||
|         if (_configService.Current.ShowOfflineUsersSeparately) |         if (_configService.Current.ShowOfflineUsersSeparately) | ||||||
|         { |         { | ||||||
|             var offlineUsersEntries = users.Where(u => |             var allOfflineUsersEntries = allPairs | ||||||
|             ((u.Key.IsDirectlyPaired && _configService.Current.ShowSyncshellOfflineUsersSeparately) || !_configService.Current.ShowSyncshellOfflineUsersSeparately) |                 .Where(u => ((u.Key.IsDirectlyPaired && _configService.Current.ShowSyncshellOfflineUsersSeparately) | ||||||
|              && (!u.Key.IsOneSidedPair || u.Value.Any()) && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()).OrderBy( |                     || !_configService.Current.ShowSyncshellOfflineUsersSeparately) | ||||||
|                 u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) |                     && (!u.Key.IsOneSidedPair || u.Value.Any()) && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) | ||||||
|                     ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) |                 .Select(k => k.Key) | ||||||
|                     : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase) |                 .ToImmutableList(); | ||||||
|             .ToDictionary(u => u.Key, u => u.Value); |  | ||||||
|  |  | ||||||
|             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) |             if (_configService.Current.ShowSyncshellOfflineUsersSeparately) | ||||||
|             { |             { | ||||||
|                 var offlineSyncshellUsers = users.Where(u => !u.Key.IsDirectlyPaired && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()).OrderBy( |                 var allOfflineSyncshellUsers = allPairs | ||||||
|                 u => _configService.Current.ShowCharacterNameInsteadOfNotesForVisible && !string.IsNullOrEmpty(u.Key.PlayerName) |                     .Where(u => !u.Key.IsDirectlyPaired && !u.Key.IsOnline && !u.Key.UserPair.OwnPermissions.IsPaused()) | ||||||
|                     ? (_configService.Current.PreferNotesOverNamesForVisible ? u.Key.GetNote() : u.Key.PlayerName) |                     .Select(k => k.Key) | ||||||
|                     : (u.Key.GetNote() ?? u.Key.UserData.AliasOrUID), StringComparer.OrdinalIgnoreCase); |                     .ToImmutableList(); | ||||||
|                 drawFolders.Add(_drawEntityFactory.CreateDrawTagFolder(TagHandler.CustomOfflineSyncshellTag, offlineSyncshellUsers.ToDictionary(k => k.Key, k => k.Value))); |  | ||||||
|  |                 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; |         return drawFolders; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Dictionary<Pair, List<GroupFullInfoDto>> 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() |     private string GetServerError() | ||||||
|     { |     { | ||||||
|         return _apiController.ServerState switch |         return _apiController.ServerState switch | ||||||
|   | |||||||
| @@ -2,24 +2,29 @@ | |||||||
| using Dalamud.Interface.Components; | using Dalamud.Interface.Components; | ||||||
| using Dalamud.Interface.Utility.Raii; | using Dalamud.Interface.Utility.Raii; | ||||||
| using ImGuiNET; | using ImGuiNET; | ||||||
|  | using MareSynchronos.PlayerData.Pairs; | ||||||
| using MareSynchronos.UI.Handlers; | using MareSynchronos.UI.Handlers; | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI.Components; | namespace MareSynchronos.UI.Components; | ||||||
|  |  | ||||||
| public abstract class DrawFolderBase : IDrawFolder | public abstract class DrawFolderBase : IDrawFolder | ||||||
| { | { | ||||||
|     public IEnumerable<DrawUserPair> DrawPairs { get; private set; } |     public IImmutableList<DrawUserPair> DrawPairs { get; init; } | ||||||
|     protected readonly string _id; |     protected readonly string _id; | ||||||
|  |     protected readonly IImmutableList<Pair> _allPairs; | ||||||
|     protected readonly TagHandler _tagHandler; |     protected readonly TagHandler _tagHandler; | ||||||
|     private float _menuWidth = -1; |     private float _menuWidth = -1; | ||||||
|     public int OnlinePairs => DrawPairs.Count(u => u.Pair.IsOnline); |     public int OnlinePairs => DrawPairs.Count(u => u.Pair.IsOnline); | ||||||
|     public int TotalPairs { get; } |     public int TotalPairs => _allPairs.Count; | ||||||
|     protected DrawFolderBase(string id, IEnumerable<DrawUserPair> drawPairs, TagHandler tagHandler, int totalPairs) |  | ||||||
|  |     protected DrawFolderBase(string id, IImmutableList<DrawUserPair> drawPairs, | ||||||
|  |         IImmutableList<Pair> allPairs, TagHandler tagHandler) | ||||||
|     { |     { | ||||||
|         _id = id; |         _id = id; | ||||||
|         DrawPairs = drawPairs; |         DrawPairs = drawPairs; | ||||||
|  |         _allPairs = allPairs; | ||||||
|         _tagHandler = tagHandler; |         _tagHandler = tagHandler; | ||||||
|         TotalPairs = totalPairs; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected abstract bool RenderIfEmpty { get; } |     protected abstract bool RenderIfEmpty { get; } | ||||||
|   | |||||||
| @@ -6,9 +6,11 @@ using Dalamud.Interface.Utility.Raii; | |||||||
| using ImGuiNET; | using ImGuiNET; | ||||||
| using MareSynchronos.API.Data.Extensions; | using MareSynchronos.API.Data.Extensions; | ||||||
| using MareSynchronos.API.Dto.Group; | using MareSynchronos.API.Dto.Group; | ||||||
|  | using MareSynchronos.PlayerData.Pairs; | ||||||
| using MareSynchronos.Services.Mediator; | using MareSynchronos.Services.Mediator; | ||||||
| using MareSynchronos.UI.Handlers; | using MareSynchronos.UI.Handlers; | ||||||
| using MareSynchronos.WebAPI; | using MareSynchronos.WebAPI; | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI.Components; | namespace MareSynchronos.UI.Components; | ||||||
|  |  | ||||||
| @@ -20,9 +22,9 @@ public class DrawFolderGroup : DrawFolderBase | |||||||
|     private readonly MareMediator _mareMediator; |     private readonly MareMediator _mareMediator; | ||||||
|  |  | ||||||
|     public DrawFolderGroup(string id, GroupFullInfoDto groupFullInfoDto, ApiController apiController, |     public DrawFolderGroup(string id, GroupFullInfoDto groupFullInfoDto, ApiController apiController, | ||||||
|         IEnumerable<DrawUserPair> drawPairs, TagHandler tagHandler, IdDisplayHandler idDisplayHandler, |         IImmutableList<DrawUserPair> drawPairs, IImmutableList<Pair> allPairs, TagHandler tagHandler, IdDisplayHandler idDisplayHandler, | ||||||
|         MareMediator mareMediator, int totalPairs) : |         MareMediator mareMediator) : | ||||||
|         base(id, drawPairs, tagHandler, totalPairs) |         base(id, drawPairs, allPairs, tagHandler) | ||||||
|     { |     { | ||||||
|         _groupFullInfoDto = groupFullInfoDto; |         _groupFullInfoDto = groupFullInfoDto; | ||||||
|         _apiController = apiController; |         _apiController = apiController; | ||||||
|   | |||||||
| @@ -3,8 +3,10 @@ using Dalamud.Interface.Components; | |||||||
| using Dalamud.Interface.Utility.Raii; | using Dalamud.Interface.Utility.Raii; | ||||||
| using ImGuiNET; | using ImGuiNET; | ||||||
| using MareSynchronos.API.Data.Extensions; | using MareSynchronos.API.Data.Extensions; | ||||||
|  | using MareSynchronos.PlayerData.Pairs; | ||||||
| using MareSynchronos.UI.Handlers; | using MareSynchronos.UI.Handlers; | ||||||
| using MareSynchronos.WebAPI; | using MareSynchronos.WebAPI; | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI.Components; | namespace MareSynchronos.UI.Components; | ||||||
|  |  | ||||||
| @@ -13,8 +15,9 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|     private readonly ApiController _apiController; |     private readonly ApiController _apiController; | ||||||
|     private readonly SelectPairForTagUi _selectPairForTagUi; |     private readonly SelectPairForTagUi _selectPairForTagUi; | ||||||
|  |  | ||||||
|     public DrawFolderTag(string id, IEnumerable<DrawUserPair> drawPairs, TagHandler tagHandler, ApiController apiController, SelectPairForTagUi selectPairForTagUi, int totalPairs) |     public DrawFolderTag(string id, IImmutableList<DrawUserPair> drawPairs, IImmutableList<Pair> allPairs, | ||||||
|         : base(id, drawPairs, tagHandler, totalPairs) |         TagHandler tagHandler, ApiController apiController, SelectPairForTagUi selectPairForTagUi) | ||||||
|  |         : base(id, drawPairs, allPairs, tagHandler) | ||||||
|     { |     { | ||||||
|         _apiController = apiController; |         _apiController = apiController; | ||||||
|         _selectPairForTagUi = selectPairForTagUi; |         _selectPairForTagUi = selectPairForTagUi; | ||||||
| @@ -51,7 +54,7 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|         TagHandler.CustomAllTag => false, |         TagHandler.CustomAllTag => false, | ||||||
|         TagHandler.CustomOfflineSyncshellTag => false, |         TagHandler.CustomOfflineSyncshellTag => false, | ||||||
|         _ => true, |         _ => true, | ||||||
|     } && DrawPairs.Any(); |     } && _allPairs.Any(); | ||||||
|  |  | ||||||
|     private bool RenderCount => _id switch |     private bool RenderCount => _id switch | ||||||
|     { |     { | ||||||
| @@ -135,7 +138,7 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|     { |     { | ||||||
|         if (!RenderPause) return currentRightSideX; |         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 pauseButton = allArePaused ? FontAwesomeIcon.Play : FontAwesomeIcon.Pause; | ||||||
|         var pauseButtonX = UiSharedService.GetIconButtonSize(pauseButton).X; |         var pauseButtonX = UiSharedService.GetIconButtonSize(pauseButton).X; | ||||||
|  |  | ||||||
| @@ -145,11 +148,11 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|         { |         { | ||||||
|             if (allArePaused) |             if (allArePaused) | ||||||
|             { |             { | ||||||
|                 ResumeAllPairs(DrawPairs); |                 ResumeAllPairs(_allPairs); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 PauseRemainingPairs(DrawPairs); |                 PauseRemainingPairs(_allPairs); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (allArePaused) |         if (allArePaused) | ||||||
| @@ -164,10 +167,10 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|         return currentRightSideX; |         return currentRightSideX; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void PauseRemainingPairs(IEnumerable<DrawUserPair> availablePairs) |     private void PauseRemainingPairs(IEnumerable<Pair> availablePairs) | ||||||
|     { |     { | ||||||
|         _ = _apiController.SetBulkPermissions(new(availablePairs |         _ = _apiController.SetBulkPermissions(new(availablePairs | ||||||
|             .ToDictionary(g => g.UID, g => |             .ToDictionary(g => g.UserData.UID, g => | ||||||
|         { |         { | ||||||
|             var perm = g.UserPair.OwnPermissions; |             var perm = g.UserPair.OwnPermissions; | ||||||
|             perm.SetPaused(paused: true); |             perm.SetPaused(paused: true); | ||||||
| @@ -176,10 +179,10 @@ public class DrawFolderTag : DrawFolderBase | |||||||
|             .ConfigureAwait(false); |             .ConfigureAwait(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void ResumeAllPairs(IEnumerable<DrawUserPair> availablePairs) |     private void ResumeAllPairs(IEnumerable<Pair> availablePairs) | ||||||
|     { |     { | ||||||
|         _ = _apiController.SetBulkPermissions(new(availablePairs |         _ = _apiController.SetBulkPermissions(new(availablePairs | ||||||
|             .ToDictionary(g => g.UID, g => |             .ToDictionary(g => g.UserData.UID, g => | ||||||
|             { |             { | ||||||
|                 var perm = g.UserPair.OwnPermissions; |                 var perm = g.UserPair.OwnPermissions; | ||||||
|                 perm.SetPaused(paused: false); |                 perm.SetPaused(paused: false); | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
| using Dalamud.Interface.Utility.Raii; | using Dalamud.Interface.Utility.Raii; | ||||||
| using ImGuiNET; | using ImGuiNET; | ||||||
| using MareSynchronos.UI.Handlers; | using MareSynchronos.UI.Handlers; | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI.Components; | namespace MareSynchronos.UI.Components; | ||||||
|  |  | ||||||
| @@ -9,8 +10,8 @@ public class DrawGroupedGroupFolder : IDrawFolder | |||||||
| { | { | ||||||
|     private readonly IEnumerable<IDrawFolder> _groups; |     private readonly IEnumerable<IDrawFolder> _groups; | ||||||
|     private readonly TagHandler _tagHandler; |     private readonly TagHandler _tagHandler; | ||||||
|     public IEnumerable<DrawUserPair> DrawPairs => throw new NotSupportedException(); |     public IImmutableList<DrawUserPair> DrawPairs => throw new NotSupportedException(); | ||||||
|     public int OnlinePairs => _groups.SelectMany(g => g.DrawPairs).Where(g => g.Pair.IsOnline).DistinctBy(g => g.UID).Count(); |     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 int TotalPairs => _groups.Sum(g => g.TotalPairs); | ||||||
|  |  | ||||||
|     public DrawGroupedGroupFolder(IEnumerable<IDrawFolder> groups, TagHandler tagHandler) |     public DrawGroupedGroupFolder(IEnumerable<IDrawFolder> groups, TagHandler tagHandler) | ||||||
|   | |||||||
| @@ -43,15 +43,11 @@ public class DrawUserPair | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Pair Pair => _pair; |     public Pair Pair => _pair; | ||||||
|     public string UID => _pair.UserData.UID; |  | ||||||
|     public UserFullPairDto UserPair => _pair.UserPair!; |     public UserFullPairDto UserPair => _pair.UserPair!; | ||||||
|  |  | ||||||
|     public void DrawPairedClient() |     public void DrawPairedClient() | ||||||
|     { |     { | ||||||
|         using var id = ImRaii.PushId(GetType() + _id); |         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(); |         DrawLeftSide(); | ||||||
|         ImGui.SameLine(); |         ImGui.SameLine(); | ||||||
|   | |||||||
| @@ -1,11 +1,12 @@ | |||||||
|  |  | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI.Components; | namespace MareSynchronos.UI.Components; | ||||||
|  |  | ||||||
| public interface IDrawFolder | public interface IDrawFolder | ||||||
| { | { | ||||||
|     int TotalPairs { get; } |     int TotalPairs { get; } | ||||||
|     int OnlinePairs { get; } |     int OnlinePairs { get; } | ||||||
|     IEnumerable<DrawUserPair> DrawPairs { get; } |     IImmutableList<DrawUserPair> DrawPairs { get; } | ||||||
|  |  | ||||||
|     void Draw(); |     void Draw(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ using MareSynchronos.UI.Components; | |||||||
| using MareSynchronos.UI.Handlers; | using MareSynchronos.UI.Handlers; | ||||||
| using MareSynchronos.WebAPI; | using MareSynchronos.WebAPI; | ||||||
| using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||||
|  | using System.Collections.Immutable; | ||||||
|  |  | ||||||
| namespace MareSynchronos.UI; | namespace MareSynchronos.UI; | ||||||
|  |  | ||||||
| @@ -35,17 +36,19 @@ public class DrawEntityFactory | |||||||
|         _serverConfigurationManager = serverConfigurationManager; |         _serverConfigurationManager = serverConfigurationManager; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public DrawFolderGroup CreateDrawGroupFolder(GroupFullInfoDto groupFullInfoDto, Dictionary<Pair, List<GroupFullInfoDto>> pairs, int totalPairs = -1) |     public DrawFolderGroup CreateDrawGroupFolder(GroupFullInfoDto groupFullInfoDto, IImmutableDictionary<Pair, List<GroupFullInfoDto>> pairs, | ||||||
|  |         IImmutableList<Pair> allPairs) | ||||||
|     { |     { | ||||||
|         return new DrawFolderGroup(groupFullInfoDto.Group.GID, groupFullInfoDto, _apiController, |         return new DrawFolderGroup(groupFullInfoDto.Group.GID, groupFullInfoDto, _apiController, | ||||||
|             pairs.Select(p => CreateDrawPair(groupFullInfoDto.Group.GID + p.Key.UserData.UID, p.Key, p.Value)).ToList(), |             pairs.Select(p => CreateDrawPair(groupFullInfoDto.Group.GID + p.Key.UserData.UID, p.Key, p.Value)).ToImmutableList(), | ||||||
|             _tagHandler, _uidDisplayHandler, _mediator, totalPairs); |             allPairs, _tagHandler, _uidDisplayHandler, _mediator); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public DrawFolderTag CreateDrawTagFolder(string tag, Dictionary<Pair, List<GroupFullInfoDto>> pairs, int totalPairs = -1) |     public DrawFolderTag CreateDrawTagFolder(string tag, IImmutableDictionary<Pair, List<GroupFullInfoDto>> pairs, | ||||||
|  |         IImmutableList<Pair> allPairs) | ||||||
|     { |     { | ||||||
|         return new(tag, pairs.Select(u => CreateDrawPair(tag, u.Key, u.Value)).ToList(), |         return new(tag, pairs.Select(u => CreateDrawPair(tag, u.Key, u.Value)).ToImmutableList(), | ||||||
|             _tagHandler, _apiController, _selectPairForTagUi, totalPairs); |             allPairs, _tagHandler, _apiController, _selectPairForTagUi); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public DrawUserPair CreateDrawPair(string id, Pair user, List<GroupFullInfoDto> groups) |     public DrawUserPair CreateDrawPair(string id, Pair user, List<GroupFullInfoDto> groups) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 rootdarkarchon
					rootdarkarchon