84 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|