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 _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 TreeChildrenComparer { get; } = Comparer.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 Folders { get; } = new SourceList(); public ISourceList Files { get; } = new SourceList(); public ObservableCollection TreeChildren => _treeChildren; } }