diff --git a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs index a5d5213..ba42115 100644 --- a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs +++ b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs @@ -15,21 +15,10 @@ public partial class ServerListViewModel { [GenerateProperty] private ConfigurationService ConfigurationService { get; } [GenerateProperty] private RestService RestService { get; } - - [ObservableProperty] private bool _favoriteVisible = false; - public List<(RobustUrl,ServerStatus)> FavoriteServers = new(); - public ObservableCollection SortedFavoriteServers { get; } = new(); - - private void SortFavorite() - { - SortedFavoriteServers.Clear(); - FavoriteServers.Sort(new ServerComparer()); - foreach (var server in FavoriteServers.Where(a => CheckServerThink(a.Item2))) - SortedFavoriteServers.Add(GetServerEntryModelView(server)); - } - - private ServerEntryModelView GetServerEntryModelView((RobustUrl, ServerStatus) server) + public readonly List<(RobustUrl,ServerStatus)> RawFavoriteServers = new(); + + public ServerEntryModelView GetServerEntryModelView((RobustUrl, ServerStatus) server) { var model = ViewHelperService.GetViewModel().WithData(server.Item1, server.Item2); model.OnFavoriteToggle += ()=> RemoveFavorite(model); @@ -39,16 +28,13 @@ public partial class ServerListViewModel private async void FetchFavorite() { - FavoriteServers.Clear(); + RawFavoriteServers.Clear(); var servers = ConfigurationService.GetConfigValue(CurrentConVar.Favorites); if (servers is null || servers.Length == 0) { - FavoriteVisible = false; return; } - - FavoriteVisible = true; foreach (var server in servers) { @@ -61,15 +47,13 @@ public partial class ServerListViewModel throw new Exception("Server info is null"); } - FavoriteServers.Add((uri, serverInfo.Value)); + RawFavoriteServers.Add((uri, serverInfo.Value)); } catch (Exception e) { - FavoriteServers.Add((uri, new ServerStatus("ErrorLand",$"ERROR: {e.Message}",[],"",-1,-1,-1,false,DateTime.Now, -1))); + RawFavoriteServers.Add((uri, new ServerStatus("ErrorLand",$"ERROR: {e.Message}",[],"",-1,-1,-1,false,DateTime.Now, -1))); } } - - SortFavorite(); } public void AddFavorite(ServerEntryModelView entryModelView) diff --git a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs index f59508d..cb7ae97 100644 --- a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs +++ b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using Nebula.Launcher.Services; using Nebula.Launcher.ViewModels.Popup; +using Nebula.Launcher.Views; using Nebula.Launcher.Views.Pages; using Nebula.Shared.Models; using Nebula.Shared.Services; @@ -20,47 +21,70 @@ public partial class ServerListViewModel : ViewModelBase, IViewModelPage { [ObservableProperty] private string _searchText = string.Empty; - [ObservableProperty] private bool _isFavoriteMode; + [ObservableProperty] private bool _isFavoriteMode; + public SortedList Servers { get; } = new(Comparer.Create((x,y)=>y.CompareTo(x))); + + private ServerViewContainer ServerViewContainer; public Action? OnSearchChange; [GenerateProperty] private HubService HubService { get; } = default!; [GenerateProperty] private PopupMessageService PopupMessageService { get; } [GenerateProperty, DesignConstruct] private ViewHelperService ViewHelperService { get; } = default!; - public ObservableCollection SortedServers { get; } = new(); + private List UnsortedServers { get; } = new(); //Design think protected override void InitialiseInDesignMode() { - FavoriteVisible = true; - SortedFavoriteServers.Add(GetServerEntryModelView(("ss14://localhost".ToRobustUrl(), - new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20)))); - SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost", - new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), []))); - SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost", - new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), []))); - SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost", - new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), []))); + ServerViewContainer = new ServerViewContainer(this); } //real think protected override void Initialise() { + ServerViewContainer = new ServerViewContainer(this); + foreach (var info in HubService.ServerList) UnsortedServers.Add(info); HubService.HubServerChangedEventArgs += HubServerChangedEventArgs; - HubService.HubServerLoaded += SortServers; + HubService.HubServerLoaded += UpdateServerEntries; OnSearchChange += OnChangeSearch; - if (!HubService.IsUpdating) SortServers(); - FetchFavorite(); + if (!HubService.IsUpdating) UpdateServerEntries(); + //FetchFavorite(); } - + + private void UpdateServerEntries() + { + Servers.Clear(); + OnPropertyChanged(nameof(Servers)); + foreach (var info in UnsortedServers.Where(a=>CheckServerThink(a.StatusData))) + { + var view = ServerViewContainer.Get(info.Address.ToRobustUrl(), info.StatusData); + float players = info.StatusData.Players; + + while (true) + { + try + { + Servers.Add(players,view); + OnPropertyChanged(nameof(Servers)); + break; + } + catch (Exception e) + { + Console.WriteLine(e); + players += 0.01f; + } + } + } + } + private void OnChangeSearch() { if(string.IsNullOrEmpty(SearchText)) return; - SortServers(); - SortFavorite(); + + UpdateServerEntries(); } private void HubServerChangedEventArgs(HubServerChangedEventArgs obj) @@ -74,29 +98,12 @@ public partial class ServerListViewModel : ViewModelBase, IViewModelPage if (obj.Action == HubServerChangeAction.Clear) UnsortedServers.Clear(); } - private void SortServers() - { - Task.Run(() => - { - SortedServers.Clear(); - UnsortedServers.Sort(new ServerComparer()); - foreach (var server in UnsortedServers.Where(a => CheckServerThink(a.StatusData))) SortedServers.Add(CreateServerView(server)); - }); - } - private bool CheckServerThink(ServerStatus hubInfo) { if (string.IsNullOrEmpty(SearchText)) return true; return hubInfo.Name.ToLower().Contains(SearchText.ToLower()); } - private ServerEntryModelView CreateServerView(ServerHubInfo serverHubInfo) - { - var svn = ViewHelperService.GetViewModel().WithData(serverHubInfo); - svn.OnFavoriteToggle += () => AddFavorite(svn); - return svn; - } - public void FilterRequired() { } @@ -121,6 +128,24 @@ public partial class ServerListViewModel : ViewModelBase, IViewModelPage } } +public class ServerViewContainer(ServerListViewModel serverListViewModel) +{ + private readonly Dictionary _entries = new(); + + public ServerEntryModelView Get(RobustUrl url, ServerStatus serverStatus) + { + if (_entries.TryGetValue(url, out var entry)) + { + return entry; + } + + entry = serverListViewModel.GetServerEntryModelView((url, serverStatus)); + _entries.Add(url, entry); + + return entry; + } +} + public class ServerComparer : IComparer, IComparer, IComparer<(RobustUrl,ServerStatus)> { public int Compare(ServerHubInfo? x, ServerHubInfo? y) diff --git a/Nebula.Launcher/Views/Pages/ServerListView.axaml b/Nebula.Launcher/Views/Pages/ServerListView.axaml index b23d122..67f63b7 100644 --- a/Nebula.Launcher/Views/Pages/ServerListView.axaml +++ b/Nebula.Launcher/Views/Pages/ServerListView.axaml @@ -25,11 +25,11 @@