Files
bluflame/intromat/Intromat/ViewModels/FolderViewModel.cs
2026-04-18 22:31:51 +02:00

84 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Reactive.Linq;
using DynamicData;
using DynamicData.Binding;
using Intromat.Interfaces;
using ReactiveUI;
namespace Intromat.ViewModels
{
public class FolderViewModel : ReactiveObject, ITreeItem
{
protected string _name;
protected bool _isExpanded;
protected bool _isSelected;
protected ITreeItem _parent;
protected readonly ObservableCollectionExtended<ITreeItem> _treeChildren = new();
protected readonly ModuleViewModel _module;
public FolderViewModel(ModuleViewModel? module, ITreeItem parent, string name)
{
_module = module ?? (ModuleViewModel)this;
_parent = parent;
_name = name;
var folders = Folders.Connect();
var files = Files.Connect();
files
.Cast(d => (ITreeItem)d)
.Merge(folders.Cast(f => (ITreeItem)f))
.Sort(TreeChildrenComparer)
.Bind(_treeChildren)
.DisposeMany()
.Subscribe();
}
public IComparer<ITreeItem> TreeChildrenComparer { get; } = Comparer<ITreeItem>.Create((i1, i2) =>
{
if (i1 is FolderViewModel && i2 is not FolderViewModel)
return -1;
if (i1 is not FolderViewModel && i2 is FolderViewModel)
return 1;
return String.Compare(i1.Name, i2.Name, StringComparison.Ordinal);
});
public string Name
{
get => _name;
set
{
this.RaiseAndSetIfChanged(ref _name, value);
// TODO: adjust path!
}
}
public virtual string FullPath => Path.Combine(((FolderViewModel)_parent).FullPath, _name);
public bool IsExpanded
{
get => _isExpanded;
set => this.RaiseAndSetIfChanged(ref _isExpanded, value);
}
public bool IsSelected
{
get => _isSelected;
set => this.RaiseAndSetIfChanged(ref _isSelected, value);
}
public ITreeItem Parent
{
get => _parent;
set => this.RaiseAndSetIfChanged(ref _parent, value);
}
public ModuleViewModel Module => _module;
public ISourceList<FolderViewModel> Folders { get; } = new SourceList<FolderViewModel>();
public ISourceList<FileViewModel> Files { get; } = new SourceList<FileViewModel>();
public ObservableCollection<ITreeItem> TreeChildren => _treeChildren;
}
}