You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.4 KiB
60 lines
1.4 KiB
1 year ago
|
using DynamicData;
|
||
|
using DynamicData.Binding;
|
||
|
using StabilityMatrix.Core.Services;
|
||
|
|
||
|
namespace StabilityMatrix.Core.Models;
|
||
|
|
||
|
public class IndexCollection<TObject, TKey>
|
||
|
where TKey : notnull
|
||
|
{
|
||
|
private readonly IImageIndexService imageIndexService;
|
||
|
|
||
|
public string? RelativePath { get; set; }
|
||
|
|
||
|
public SourceCache<TObject, TKey> ItemsSource { get; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// Observable Collection of indexed items
|
||
|
/// </summary>
|
||
|
public IObservableCollection<TObject> Items { get; } =
|
||
|
new ObservableCollectionExtended<TObject>();
|
||
|
|
||
|
public IndexCollection(
|
||
|
IImageIndexService imageIndexService,
|
||
|
Func<TObject, TKey> keySelector,
|
||
|
Func<
|
||
|
IObservable<IChangeSet<TObject, TKey>>,
|
||
|
IObservable<IChangeSet<TObject, TKey>>
|
||
|
>? transform = null
|
||
|
)
|
||
|
{
|
||
|
this.imageIndexService = imageIndexService;
|
||
|
|
||
|
ItemsSource = new SourceCache<TObject, TKey>(keySelector);
|
||
|
|
||
|
var source = ItemsSource.Connect().DeferUntilLoaded();
|
||
|
|
||
|
if (transform is not null)
|
||
|
{
|
||
|
source = transform(source);
|
||
|
}
|
||
|
|
||
|
source.Bind(Items).Subscribe();
|
||
|
}
|
||
|
|
||
|
public void Add(TObject item)
|
||
|
{
|
||
|
ItemsSource.AddOrUpdate(item);
|
||
|
}
|
||
|
|
||
|
public void Remove(TObject item)
|
||
|
{
|
||
|
ItemsSource.Remove(item);
|
||
|
}
|
||
|
|
||
|
public void RemoveKey(TKey key)
|
||
|
{
|
||
|
ItemsSource.RemoveKey(key);
|
||
|
}
|
||
|
}
|