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