Optimize rendering of large number of pairs

This commit is contained in:
Loporrit
2023-12-04 14:17:09 +00:00
parent 283d54aff6
commit 748d6184fc
6 changed files with 85 additions and 47 deletions

View File

@@ -395,63 +395,56 @@ internal sealed class GroupPanel
ImGui.Indent(20);
if (_expandedGroupState[groupDto.GID])
{
var visibleUsers = pairsInGroup.Where(u => u.IsVisible)
var sortedPairs = pairsInGroup
.OrderByDescending(u => string.Equals(u.UserData.UID, groupDto.OwnerUID, StringComparison.Ordinal))
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsModerator())
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsPinned())
.ThenBy(u => u.GetNote() ?? u.UserData.AliasOrUID, StringComparer.OrdinalIgnoreCase)
.Select(c => new DrawGroupPair(groupDto.GID + c.UserData.UID, c, ApiController, _mainUi.Mediator, groupDto, c.GroupPair.Single(g => GroupDataComparer.Instance.Equals(g.Key.Group, groupDto.Group)).Value,
_uidDisplayHandler))
.ToList();
var onlineUsers = pairsInGroup.Where(u => u.IsOnline && !u.IsVisible)
.OrderByDescending(u => string.Equals(u.UserData.UID, groupDto.OwnerUID, StringComparison.Ordinal))
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsModerator())
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsPinned())
.ThenBy(u => u.GetNote() ?? u.UserData.AliasOrUID, StringComparer.OrdinalIgnoreCase)
.Select(c => new DrawGroupPair(groupDto.GID + c.UserData.UID, c, ApiController, _mainUi.Mediator, groupDto, c.GroupPair.Single(g => GroupDataComparer.Instance.Equals(g.Key.Group, groupDto.Group)).Value,
_uidDisplayHandler))
.ToList();
var offlineUsers = pairsInGroup.Where(u => !u.IsOnline && !u.IsVisible)
.OrderByDescending(u => string.Equals(u.UserData.UID, groupDto.OwnerUID, StringComparison.Ordinal))
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsModerator())
.ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsPinned())
.ThenBy(u => u.GetNote() ?? u.UserData.AliasOrUID, StringComparer.OrdinalIgnoreCase)
.Select(c => new DrawGroupPair(groupDto.GID + c.UserData.UID, c, ApiController, _mainUi.Mediator, groupDto, c.GroupPair.Single(g => GroupDataComparer.Instance.Equals(g.Key.Group, groupDto.Group)).Value,
_uidDisplayHandler))
.ToList();
.ThenBy(u => u.GetNote() ?? u.UserData.AliasOrUID, StringComparer.OrdinalIgnoreCase);
if (visibleUsers.Any())
var visibleUsers = new List<DrawGroupPair>();
var onlineUsers = new List<DrawGroupPair>();
var offlineUsers = new List<DrawGroupPair>();
foreach (var pair in sortedPairs)
{
ImGui.Text("Visible");
ImGui.Separator();
foreach (var entry in visibleUsers)
{
using (ImRaii.PushId(groupDto.GID + entry.UID)) entry.DrawPairedClient();
}
var drawPair = new DrawGroupPair(
groupDto.GID + pair.UserData.UID, pair,
ApiController, _mainUi.Mediator, groupDto,
pair.GroupPair.Single(
g => GroupDataComparer.Instance.Equals(g.Key.Group, groupDto.Group)
).Value,
_uidDisplayHandler);
if (pair.IsVisible)
visibleUsers.Add(drawPair);
else if (pair.IsOnline)
onlineUsers.Add(drawPair);
else
offlineUsers.Add(drawPair);
}
if (onlineUsers.Any())
if (visibleUsers.Count > 0)
{
ImGui.Text("Online");
ImGui.TextUnformatted("Visible");
ImGui.Separator();
foreach (var entry in onlineUsers)
{
using (ImRaii.PushId(groupDto.GID + entry.UID)) entry.DrawPairedClient();
}
_uidDisplayHandler.RenderPairList(visibleUsers);
}
if (offlineUsers.Any())
if (onlineUsers.Count > 0)
{
ImGui.Text("Offline/Unknown");
ImGui.TextUnformatted("Online");
ImGui.Separator();
foreach (var entry in offlineUsers)
{
using (ImRaii.PushId(groupDto.GID + entry.UID)) entry.DrawPairedClient();
}
_uidDisplayHandler.RenderPairList(onlineUsers);
}
if (offlineUsers.Count > 0)
{
ImGui.TextUnformatted("Offline/Unknown");
ImGui.Separator();
_uidDisplayHandler.RenderPairList(offlineUsers);
}
ImGui.Separator();
ImGui.Unindent(ImGui.GetStyle().ItemSpacing.X / 2);
}
ImGui.Unindent(20);
}