Optimize rendering of large number of pairs
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user