public LiveLoadOrderProvider( IPluginLiveLoadOrderProvider pluginLive, ICreationClubLiveLoadOrderProvider cccLive, ILoadOrderListingsProvider loadListingsProvider, ILiveLoadOrderTimings timings) { PluginLive = pluginLive; CccLive = cccLive; ListingsProvider = loadListingsProvider; Timings = timings; }
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); }); }