make local groups more usable for pause/resume

This commit is contained in:
rootdarkarchon
2023-10-27 17:25:15 +02:00
parent cdcfaa9369
commit 1a64f08841
8 changed files with 144 additions and 104 deletions

View File

@@ -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,47 +393,67 @@ 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)
.ThenBy(u => .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 (info.IsModerator()) return 1;
if (group.GroupPairUserInfos.TryGetValue(u.Key.UserData.UID, out var info)) if (info.IsPinned()) return 2;
{ }
if (info.IsModerator()) return 1; return u.Key.IsVisible ? 3 : 4;
if (info.IsPinned()) return 2; })
} .ThenBy(alphabeticalSortFunc, StringComparer.OrdinalIgnoreCase)
return u.Key.IsVisible ? 3 : 4; .ToImmutableDictionary(k => k.Key, k => k.Value);
})
.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);
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
&& (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && _tagHandler.HasTag(u.Key.UserData.UID, tag))
|| u.Key.UserPair.OwnPermissions.IsPaused())) .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) .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
&& (u.Key.IsOnline || (!u.Key.IsOnline && !_configService.Current.ShowOfflineUsersSeparately) .Where(u => u.Key.IsDirectlyPaired && !u.Key.IsOneSidedPair && !_tagHandler.HasAnyTag(u.Key.UserData.UID))
|| u.Key.UserPair.OwnPermissions.IsPaused())) .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) .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

View File

@@ -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; }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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();

View File

@@ -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();
} }

View File

@@ -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)