port from perforce
This commit is contained in:
83
intromat/Intromat/ViewModels/FolderViewModel.cs
Normal file
83
intromat/Intromat/ViewModels/FolderViewModel.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user