2025-06-14 22:33:03 +03:00
|
|
|
using Avalonia.Controls;
|
2025-07-02 21:32:51 +03:00
|
|
|
using Nebula.Launcher.Models;
|
2025-06-14 22:33:03 +03:00
|
|
|
using Nebula.Launcher.ServerListProviders;
|
|
|
|
|
using Nebula.Launcher.ViewModels;
|
|
|
|
|
using Nebula.Launcher.ViewModels.Pages;
|
|
|
|
|
|
|
|
|
|
namespace Nebula.Launcher.Controls;
|
|
|
|
|
|
|
|
|
|
public partial class ServerListView : UserControl
|
|
|
|
|
{
|
|
|
|
|
private IServerListProvider _provider = default!;
|
|
|
|
|
private ServerFilter? _currentFilter;
|
|
|
|
|
|
|
|
|
|
public bool IsLoading { get; private set; }
|
|
|
|
|
|
|
|
|
|
public ServerListView()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static ServerListView TakeFrom(IServerListProvider provider)
|
|
|
|
|
{
|
|
|
|
|
var serverListView = new ServerListView();
|
|
|
|
|
if (provider is IServerListDirtyInvoker invoker)
|
|
|
|
|
{
|
|
|
|
|
invoker.Dirty += serverListView.OnDirty;
|
|
|
|
|
}
|
|
|
|
|
serverListView._provider = provider;
|
|
|
|
|
serverListView.RefreshFromProvider();
|
|
|
|
|
return serverListView;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RefreshFromProvider()
|
|
|
|
|
{
|
|
|
|
|
if (IsLoading)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Clear();
|
|
|
|
|
StartLoading();
|
|
|
|
|
|
|
|
|
|
_provider.LoadServerList();
|
|
|
|
|
|
|
|
|
|
if (_provider.IsLoaded) PasteServersFromList();
|
|
|
|
|
else _provider.OnLoaded += RefreshRequired;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-17 21:07:32 +03:00
|
|
|
public void RequireStatusUpdate()
|
|
|
|
|
{
|
|
|
|
|
foreach (var rawView in ServerList.Items)
|
|
|
|
|
{
|
|
|
|
|
if (rawView is ServerEntryModelView serverEntryModelView)
|
|
|
|
|
{
|
2025-06-22 10:40:42 +03:00
|
|
|
//serverEntryModelView.UpdateStatusIfNecessary();
|
2025-06-17 21:07:32 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-14 22:33:03 +03:00
|
|
|
public void ApplyFilter(ServerFilter? filter)
|
|
|
|
|
{
|
|
|
|
|
_currentFilter = filter;
|
|
|
|
|
|
|
|
|
|
if(IsLoading)
|
|
|
|
|
return;
|
|
|
|
|
|
2025-06-22 10:40:42 +03:00
|
|
|
foreach (var serverView in ServerList.Items)
|
2025-06-14 22:33:03 +03:00
|
|
|
{
|
2025-06-22 10:40:42 +03:00
|
|
|
if(serverView is IFilterConsumer filterConsumer)
|
|
|
|
|
filterConsumer.ProcessFilter(filter);
|
2025-06-14 22:33:03 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnDirty()
|
|
|
|
|
{
|
|
|
|
|
RefreshFromProvider();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Clear()
|
|
|
|
|
{
|
|
|
|
|
ErrorList.Items.Clear();
|
|
|
|
|
ServerList.Items.Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PasteServersFromList()
|
|
|
|
|
{
|
|
|
|
|
foreach (var serverEntry in _provider.GetServers())
|
|
|
|
|
{
|
|
|
|
|
ServerList.Items.Add(serverEntry);
|
2025-06-22 10:40:42 +03:00
|
|
|
if(serverEntry is IFilterConsumer serverFilter)
|
|
|
|
|
serverFilter.ProcessFilter(_currentFilter);
|
2025-06-14 22:33:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var error in _provider.GetErrors())
|
|
|
|
|
{
|
|
|
|
|
ErrorList.Items.Add(error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EndLoading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RefreshRequired()
|
|
|
|
|
{
|
|
|
|
|
PasteServersFromList();
|
|
|
|
|
_provider.OnLoaded -= RefreshRequired;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void StartLoading()
|
|
|
|
|
{
|
|
|
|
|
Clear();
|
|
|
|
|
IsLoading = true;
|
|
|
|
|
LoadingLabel.IsVisible = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void EndLoading()
|
|
|
|
|
{
|
|
|
|
|
IsLoading = false;
|
|
|
|
|
LoadingLabel.IsVisible = false;
|
|
|
|
|
}
|
|
|
|
|
}
|