livia-test/Livia/ViewModels/SelectSeriesWindowViewModel.cs
2025-03-28 14:31:53 +08:00

60 lines
2.3 KiB
C#

using System.Collections.ObjectModel;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Livia.Models.Data;
using Livia.Utility;
using Livia.Views.Utility;
namespace Livia.ViewModels;
public class SelectSeriesWindowViewModel : ObservableObject, IRecipient<LogoutMessage>
{
public event EventHandler? OnRequestClose;
public bool Loaded { get => _loaded; set => SetProperty(ref _loaded, value); }
public ObservableCollection<SeriesGroupExpanderViewModel> SeriesGroups { get; } = [];
private bool _loaded;
private readonly IServerHandler _serverHandler;
private readonly IWarningSystem _warningSystem;
private readonly string _key;
public SelectSeriesWindowViewModel(string key, IServerHandler serverHandler, IWarningSystem warningSystem)
{
_serverHandler = serverHandler;
_warningSystem = warningSystem;
_key = key;
WeakReferenceMessenger.Default.RegisterAll(this);
Task.Run(LoadSeriesList);
}
private async Task LoadSeriesList()
{
List<SeriesGroup> result = await _serverHandler.GetSeriesGroupList(_key).ConfigureAwait(false);
List<SeriesGroupExpanderViewModel> viewModels = result.Select(seriesGroup => new SeriesGroupExpanderViewModel(seriesGroup)).ToList();
Application.Current.Dispatcher.Invoke(() =>
{
foreach (SeriesGroupExpanderViewModel viewModel in viewModels)
{
SeriesGroups.Add(viewModel);
}
});
Loaded = true;
}
public async Task SelectSeries()
{
List<string> selectedSeries = (from seriesGroupExpanderViewModel in SeriesGroups
from seriesCollectionItem in seriesGroupExpanderViewModel.SeriesCollection.Items
where seriesCollectionItem.IsChecked
select seriesCollectionItem.SeriesData.Uid).ToList();
(bool success, string messageIndex) = await _serverHandler.SelectSeries(_key, selectedSeries).ConfigureAwait(false);
_warningSystem.ShowDialog(success ? WarningWindowKind.Info : WarningWindowKind.Warning, false, messageIndex);
}
public void Receive(LogoutMessage message)
{
OnRequestClose?.Invoke(this, EventArgs.Empty);
}
}