public FileSyncedLoadOrderVM(FilePath loadOrderFilePath) { LoadOrderFilePath = loadOrderFilePath; var lo = Mutagen.Bethesda.Plugins.Order.LoadOrder.GetLiveLoadOrder( this.WhenAnyValue(x => x.GameRelease), Observable.Return(loadOrderFilePath), this.WhenAnyValue(x => x.DataFolderPath) .Select(x => new DirectoryPath(x)), out var state, this.WhenAnyValue(x => x.CreationClubFilePath) .Select(x => x.IsNullOrWhitespace() ? default(FilePath?) : new FilePath(x))); _State = state .ToGuiProperty(this, nameof(State), ErrorResponse.Fail("Uninitialized")); var loadOrder = lo .Transform(x => new FileSyncedLoadOrderListingVM(this, x)) .PublishRefCount(); LoadOrder = loadOrder .ToObservableCollection(this); // When listings change, resave to file Observable.Merge( loadOrder .AutoRefresh(x => x.Enabled) .Transform(x => x.Enabled, transformOnRefresh: true) .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .QueryWhenChanged(x => x) .Unit(), loadOrder .AutoRefresh(x => x.GhostSuffix) .Transform(x => x.GhostSuffix ?? string.Empty, transformOnRefresh: true) .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .QueryWhenChanged(x => x) .Unit()) .Throttle(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .Select(x => LoadOrder.Select(x => new ModListing(x.ModKey, x.Enabled, x.GhostSuffix)).ToArray()) .DistinctUntilChanged(new SequenceEqualityComparer()) .Subscribe(x => { Mutagen.Bethesda.Plugins.Order.LoadOrder.Write( LoadOrderFilePath, GameRelease, LoadOrder); }); }
public void Completed <TConverted>(Action <IObservableCollection <TConverted> > action) { var convertedCollection = (IObservableCollection <TConverted>)null; if (collection != null) { convertedCollection = CollectionFactory.Create(collection.Select(x => Mapper.Map <TConverted>(x))); } if (task == null) { action(convertedCollection); return; } task.ContinueWith(t => action(convertedCollection), WindowsThreadingFactory.FromCurrentSynchronizationContext()); }
public FileSyncedLoadOrderVM( IPluginLiveLoadOrderProvider liveLoadOrderProvider, ILoadOrderWriter writer, IPluginListingsPathProvider pluginPathContext, IDataDirectoryProvider dataDirectoryContext) { var loadOrder = liveLoadOrderProvider.Get(out var state) .Transform(x => new FileSyncedLoadOrderListingVM(dataDirectoryContext, x)) .RefCount(); _State = state .ToGuiProperty(this, nameof(State), ErrorResponse.Fail("Uninitialized")); LoadOrder = loadOrder .ToObservableCollection(this); // When listings change, resave to file Observable.Merge( loadOrder .AutoRefresh(x => x.Enabled) .Transform(x => x.Enabled, transformOnRefresh: true) .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .QueryWhenChanged(x => x) .Unit(), loadOrder .AutoRefresh(x => x.GhostSuffix) .Transform(x => x.GhostSuffix ?? string.Empty, transformOnRefresh: true) .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .QueryWhenChanged(x => x) .Unit()) .Throttle(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler) .Select(x => LoadOrder.Select(x => new ModListing(x.ModKey, x.Enabled, x.GhostSuffix)).ToArray()) .DistinctUntilChanged(new SequenceEqualityComparer()) .Subscribe(x => { writer.Write( pluginPathContext.Path, LoadOrder); }); }
public static AggregateCatalog GetComposablePartAggregateCatalog(this IObservableCollection <Assembly> assemblySource) { return(new AggregateCatalog( assemblySource.Select(a => new AssemblyCatalog(a)).OfType <ComposablePartCatalog>())); }