Files
NebulaLauncher/Nebula.Launcher/ViewModels/ServerCompoundEntryModelView.cs

105 lines
3.2 KiB
C#
Raw Normal View History

2025-06-22 10:40:42 +03:00
using System;
using System.Threading;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Media;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
2025-07-02 21:32:51 +03:00
using Nebula.Launcher.Models;
2025-06-22 10:40:42 +03:00
using Nebula.Launcher.ServerListProviders;
using Nebula.Launcher.ViewModels.Pages;
using Nebula.Launcher.Views;
using Nebula.Shared.Models;
using Nebula.Shared.Services;
2025-07-02 21:32:51 +03:00
using Nebula.Shared.ViewHelper;
2025-06-22 10:40:42 +03:00
using BindingFlags = System.Reflection.BindingFlags;
namespace Nebula.Launcher.ViewModels;
[ViewModelRegister(typeof(ServerCompoundEntryView), false)]
[ConstructGenerator]
public sealed partial class ServerCompoundEntryViewModel :
2025-06-22 22:11:27 +03:00
ViewModelBase, IFavoriteEntryModelView, IFilterConsumer, IListEntryModelView, IEntryNameHolder
2025-06-22 10:40:42 +03:00
{
2025-06-22 22:11:27 +03:00
[ObservableProperty] private ServerEntryModelView? _currentEntry;
2025-06-22 10:40:42 +03:00
[ObservableProperty] private Control? _entryControl;
2025-06-22 22:11:27 +03:00
[ObservableProperty] private string _message = "Loading server entry...";
2025-06-22 10:40:42 +03:00
[ObservableProperty] private bool _isFavorite;
[ObservableProperty] private bool _loading = true;
2025-06-22 22:11:27 +03:00
private string? _name;
2025-06-27 21:31:38 +03:00
private RobustUrl? _url;
private ServerFilter? _currentFilter;
2025-06-22 22:11:27 +03:00
public string? Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
if (CurrentEntry != null)
CurrentEntry.Name = value;
}
}
2025-06-22 10:40:42 +03:00
[GenerateProperty] private RestService RestService { get; }
[GenerateProperty] private IServiceProvider ServiceProvider{ get; }
[GenerateProperty] private FavoriteServerListProvider FavoriteServerListProvider { get; }
protected override void InitialiseInDesignMode()
{
2025-06-22 22:11:27 +03:00
Name = "TEST.TEST";
2025-06-22 10:40:42 +03:00
}
protected override void Initialise()
{
}
2025-06-22 22:11:27 +03:00
public ServerCompoundEntryViewModel LoadServerEntry(RobustUrl url,string? name, CancellationToken cancellationToken)
2025-06-22 10:40:42 +03:00
{
Task.Run(async () =>
{
2025-06-27 21:31:38 +03:00
_url = url;
2025-06-22 10:40:42 +03:00
try
{
2025-06-22 22:11:27 +03:00
Message = "Loading server entry...";
2025-06-27 21:31:38 +03:00
var status = await RestService.GetAsync<ServerStatus>(_url.StatusUri, cancellationToken);
2025-06-22 10:40:42 +03:00
2025-06-27 21:31:38 +03:00
CurrentEntry = ServiceProvider.GetService<ServerEntryModelView>()!.WithData(_url,name, status);
2025-06-22 22:11:27 +03:00
CurrentEntry.IsFavorite = IsFavorite;
CurrentEntry.Loading = false;
2025-06-27 21:31:38 +03:00
CurrentEntry.ProcessFilter(_currentFilter);
2025-06-22 22:11:27 +03:00
Loading = false;
2025-06-22 10:40:42 +03:00
}
catch (Exception e)
{
2025-06-22 22:11:27 +03:00
Message = e.Message;
2025-06-22 10:40:42 +03:00
}
}, cancellationToken);
return this;
}
public void ToggleFavorites()
{
2025-06-27 21:31:38 +03:00
if (CurrentEntry is null && _url is not null)
{
IsFavorite = !IsFavorite;
if(IsFavorite) FavoriteServerListProvider.AddFavorite(_url);
else FavoriteServerListProvider.RemoveFavorite(_url);
}
2025-06-22 22:11:27 +03:00
CurrentEntry?.ToggleFavorites();
2025-06-22 10:40:42 +03:00
}
public void ProcessFilter(ServerFilter? serverFilter)
{
2025-06-27 21:31:38 +03:00
_currentFilter = serverFilter;
2025-06-22 10:40:42 +03:00
if(CurrentEntry is IFilterConsumer filterConsumer)
filterConsumer.ProcessFilter(serverFilter);
}
}