Files
FileTime/src/GuiApp/FileTime.Avalonia/ViewModels/ContainerViewModel.cs
2022-01-26 09:54:03 +01:00

166 lines
4.7 KiB
C#

using AsyncEvent;
using FileTime.Core.Models;
using FileTime.Avalonia.Models;
using FileTime.Avalonia.Services;
using MvvmGen;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FileTime.Avalonia.ViewModels
{
[ViewModel]
[Inject(typeof(ItemNameConverterService))]
public partial class ContainerViewModel : IItemViewModel
{
private bool isRefreshing;
private bool isInitialized;
[Property]
private IContainer _container;
[Property]
private bool _isSelected;
public IItem Item => _container;
//[Property]
private readonly ObservableCollection<ContainerViewModel> _containers = new ObservableCollection<ContainerViewModel>();
//[Property]
private readonly ObservableCollection<ElementViewModel> _elements = new ObservableCollection<ElementViewModel>();
//[Property]
private readonly ObservableCollection<IItemViewModel> _items = new ObservableCollection<IItemViewModel>();
[Property]
private bool _isAlternative;
[PropertyInvalidate(nameof(IsSelected))]
[PropertyInvalidate(nameof(IsAlternative))]
public ItemViewMode ViewMode =>
IsSelected
? ItemViewMode.Selected
: IsAlternative
? ItemViewMode.Alternative
: ItemViewMode.Default;
public List<ItemNamePart> DisplayName => ItemNameConverterService.GetDisplayName(this);
[Obsolete]
public ObservableCollection<ContainerViewModel> Containers
{
get
{
if (!isInitialized) Task.Run(Refresh);
return _containers;
}
}
[Obsolete]
public ObservableCollection<ElementViewModel> Elements
{
get
{
if (!isInitialized) Task.Run(Refresh);
return _elements;
}
}
[Obsolete]
public ObservableCollection<IItemViewModel> Items
{
get
{
if (!isInitialized) Task.Run(Refresh);
return _items;
}
}
public ContainerViewModel(IContainer container, ItemNameConverterService itemNameConverterService) : this(itemNameConverterService)
{
Container = container;
Container.Refreshed.Add(Container_Refreshed);
}
public void InvalidateDisplayName() => OnPropertyChanged(nameof(DisplayName));
public async Task Init(bool initializeChildren = true)
{
await Refresh(initializeChildren);
}
private async Task Container_Refreshed(object sender, AsyncEventArgs e)
{
await Refresh(false);
}
private async Task Refresh()
{
await Refresh(true);
}
private async Task Refresh(bool initializeChildren)
{
if (isRefreshing) return;
isInitialized = true;
try
{
isRefreshing = true;
var containers = (await _container.GetContainers()).Select(c => new ContainerViewModel(c, ItemNameConverterService)).ToList();
var elements = (await _container.GetElements()).Select(e => new ElementViewModel(e, ItemNameConverterService)).ToList();
_containers.Clear();
_elements.Clear();
_items.Clear();
foreach (var container in containers)
{
if (initializeChildren) await container.Init(false);
_containers.Add(container);
_items.Add(container);
}
foreach (var element in elements)
{
_elements.Add(element);
_items.Add(element);
}
for (var i = 0; i < _items.Count; i++)
{
_items[i].IsAlternative = i % 2 == 1;
}
}
catch { }
isRefreshing = false;
}
public async Task<ObservableCollection<ContainerViewModel>> GetContainers()
{
if (!isInitialized) await Task.Run(Refresh);
return _containers;
}
public async Task<ObservableCollection<ElementViewModel>> GetElements()
{
if (!isInitialized) await Task.Run(Refresh);
return _elements;
}
public async Task<ObservableCollection<IItemViewModel>> GetItems()
{
if (!isInitialized) await Task.Run(Refresh);
return _items;
}
}
}