diff --git a/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs b/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs index c16b380..9b4055b 100644 --- a/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs +++ b/LightlessSync/LightlessConfiguration/Configurations/LightlessConfig.cs @@ -49,7 +49,8 @@ public class LightlessConfig : ILightlessConfiguration public int DownloadSpeedLimitInBytes { get; set; } = 0; public DownloadSpeeds DownloadSpeedType { get; set; } = DownloadSpeeds.MBps; public bool PreferNotesOverNamesForVisible { get; set; } = false; - public VisiblePairSortMode VisiblePairSortMode { get; set; } = VisiblePairSortMode.Default; + public VisiblePairSortMode VisiblePairSortMode { get; set; } = VisiblePairSortMode.Alphabetical; + public OnlinePairSortMode OnlinePairSortMode { get; set; } = OnlinePairSortMode.Alphabetical; public float ProfileDelay { get; set; } = 1.5f; public bool ProfilePopoutRight { get; set; } = false; public bool ProfilesAllowNsfw { get; set; } = false; diff --git a/LightlessSync/UI/CompactUI.cs b/LightlessSync/UI/CompactUI.cs index cd758f5..b1195b4 100644 --- a/LightlessSync/UI/CompactUI.cs +++ b/LightlessSync/UI/CompactUI.cs @@ -843,12 +843,16 @@ public class CompactUi : WindowMediatorSubscriberBase //Filter of not grouped/foldered and offline pairs var allOnlineNotTaggedPairs = SortEntries(allEntries.Where(FilterNotTaggedUsers)); - var onlineNotTaggedPairs = SortEntries(filteredEntries.Where(e => FilterNotTaggedUsers(e) && FilterOnlineOrPausedSelf(e))); - - if (allOnlineNotTaggedPairs.Count > 0) - { + if (allOnlineNotTaggedPairs.Count > 0 && _configService.Current.ShowOfflineUsersSeparately) { + var filteredOnlineEntries = SortOnlineEntries(filteredEntries.Where(e => FilterNotTaggedUsers(e) && FilterOnlineOrPausedSelf(e))); drawFolders.Add(_drawEntityFactory.CreateTagFolder( - _configService.Current.ShowOfflineUsersSeparately ? TagHandler.CustomOnlineTag : TagHandler.CustomAllTag, + TagHandler.CustomOnlineTag, + filteredOnlineEntries, + allOnlineNotTaggedPairs)); + } else if (allOnlineNotTaggedPairs.Count > 0 && !_configService.Current.ShowOfflineUsersSeparately) { + var onlineNotTaggedPairs = SortEntries(filteredEntries.Where(FilterNotTaggedUsers)); + drawFolders.Add(_drawEntityFactory.CreateTagFolder( + TagHandler.CustomAllTag, onlineNotTaggedPairs, allOnlineNotTaggedPairs)); } @@ -885,7 +889,7 @@ public class CompactUi : WindowMediatorSubscriberBase } } - private bool PassesFilter(PairUiEntry entry, string filter) + private static bool PassesFilter(PairUiEntry entry, string filter) { if (string.IsNullOrEmpty(filter)) return true; @@ -946,6 +950,17 @@ public class CompactUi : WindowMediatorSubscriberBase }; } + private ImmutableList SortOnlineEntries(IEnumerable entries) + { + var entryList = entries.ToList(); + return _configService.Current.OnlinePairSortMode switch + { + OnlinePairSortMode.Alphabetical => [.. entryList.OrderBy(e => AlphabeticalSortKey(e), StringComparer.OrdinalIgnoreCase)], + OnlinePairSortMode.PreferredDirectPairs => SortVisibleByPreferred(entryList), + _ => SortEntries(entryList), + }; + } + private ImmutableList SortVisibleByMetric(IEnumerable entries, Func selector) { return [.. entries diff --git a/LightlessSync/UI/Components/DrawFolderTag.cs b/LightlessSync/UI/Components/DrawFolderTag.cs index dcba0d4..b91617a 100644 --- a/LightlessSync/UI/Components/DrawFolderTag.cs +++ b/LightlessSync/UI/Components/DrawFolderTag.cs @@ -169,11 +169,16 @@ public class DrawFolderTag : DrawFolderBase protected override float DrawRightSide(float currentRightSideX) { - if (_id == TagHandler.CustomVisibleTag) + if (string.Equals(_id, TagHandler.CustomVisibleTag, StringComparison.Ordinal)) { return DrawVisibleFilter(currentRightSideX); } + if (string.Equals(_id, TagHandler.CustomOnlineTag, StringComparison.Ordinal)) + { + return DrawOnlineFilter(currentRightSideX); + } + if (!RenderPause) { return currentRightSideX; @@ -254,7 +259,7 @@ public class DrawFolderTag : DrawFolderBase foreach (VisiblePairSortMode mode in Enum.GetValues()) { var selected = _configService.Current.VisiblePairSortMode == mode; - if (ImGui.MenuItem(GetSortLabel(mode), string.Empty, selected)) + if (ImGui.MenuItem(GetSortVisibleLabel(mode), string.Empty, selected)) { if (!selected) { @@ -273,7 +278,49 @@ public class DrawFolderTag : DrawFolderBase return buttonStart - spacingX; } - private static string GetSortLabel(VisiblePairSortMode mode) => mode switch + private float DrawOnlineFilter(float currentRightSideX) + { + var buttonSize = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Filter); + var spacingX = ImGui.GetStyle().ItemSpacing.X; + var buttonStart = currentRightSideX - buttonSize.X; + + ImGui.SameLine(buttonStart); + if (_uiSharedService.IconButton(FontAwesomeIcon.Filter)) + { + SuppressNextRowToggle(); + ImGui.OpenPopup($"online-filter-{_id}"); + } + + UiSharedService.AttachToolTip("Adjust how online pairs are ordered."); + + if (ImGui.BeginPopup($"online-filter-{_id}")) + { + ImGui.TextUnformatted("Online Pair Ordering"); + ImGui.Separator(); + + foreach (OnlinePairSortMode mode in Enum.GetValues()) + { + var selected = _configService.Current.OnlinePairSortMode == mode; + if (ImGui.MenuItem(GetSortOnlineLabel(mode), string.Empty, selected)) + { + if (!selected) + { + _configService.Current.OnlinePairSortMode = mode; + _configService.Save(); + _mediator.Publish(new RefreshUiMessage()); + } + + ImGui.CloseCurrentPopup(); + } + } + + ImGui.EndPopup(); + } + + return buttonStart - spacingX; + } + + private static string GetSortVisibleLabel(VisiblePairSortMode mode) => mode switch { VisiblePairSortMode.Alphabetical => "Alphabetical", VisiblePairSortMode.VramUsage => "VRAM usage (descending)", @@ -282,4 +329,11 @@ public class DrawFolderTag : DrawFolderBase VisiblePairSortMode.PreferredDirectPairs => "Preferred permissions & Direct pairs", _ => "Default", }; + + private static string GetSortOnlineLabel(OnlinePairSortMode mode) => mode switch + { + OnlinePairSortMode.Alphabetical => "Alphabetical", + OnlinePairSortMode.PreferredDirectPairs => "Preferred permissions & Direct pairs", + _ => "Default", + }; } \ No newline at end of file diff --git a/LightlessSync/UI/Models/OnlinePairSortMode.cs b/LightlessSync/UI/Models/OnlinePairSortMode.cs new file mode 100644 index 0000000..ff85b9c --- /dev/null +++ b/LightlessSync/UI/Models/OnlinePairSortMode.cs @@ -0,0 +1,7 @@ +namespace LightlessSync.UI.Models; + +public enum OnlinePairSortMode +{ + Alphabetical = 0, + PreferredDirectPairs = 1, +} diff --git a/LightlessSync/UI/Models/VisiblePairSortMode.cs b/LightlessSync/UI/Models/VisiblePairSortMode.cs index fcb1d65..ec133b9 100644 --- a/LightlessSync/UI/Models/VisiblePairSortMode.cs +++ b/LightlessSync/UI/Models/VisiblePairSortMode.cs @@ -2,10 +2,9 @@ namespace LightlessSync.UI.Models; public enum VisiblePairSortMode { - Default = 0, - Alphabetical = 1, - VramUsage = 2, - EffectiveVramUsage = 3, - TriangleCount = 4, - PreferredDirectPairs = 5, + Alphabetical = 0, + VramUsage = 1, + EffectiveVramUsage = 2, + TriangleCount = 3, + PreferredDirectPairs = 4, }