Example #1
0
        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);
            });
        }
Example #2
0
        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);
            });
        }
Example #4
0
 public static AggregateCatalog GetComposablePartAggregateCatalog(this IObservableCollection <Assembly> assemblySource)
 {
     return(new AggregateCatalog(
                assemblySource.Select(a => new AssemblyCatalog(a)).OfType <ComposablePartCatalog>()));
 }