Exemplo n.º 1
0
        public void TestInstantiationFromObject()
        {
            var readOnlyRxVar = new RxVar <bool>("true").ToReadOnlyRxVar();

            Assert.True(readOnlyRxVar);
        }
Exemplo n.º 2
0
        public void TestInstantationFromObject()
        {
            var rxvar = new RxVar <bool>("true");

            Assert.True(rxvar);
        }
Exemplo n.º 3
0
        public MainWindowViewModel(ILifetimeScope lifetimeScope, IUIDispatcher dispatcher,
                                   IOperationManager operationManager, LocLocalizer localizer, IDialogCoordinator dialogCoordinator,
                                   AppConfig config, IDialogFactory dialogFactory, IViewModel <CenterViewModel> model,
                                   IMainWindowCoordinator mainWindowCoordinator, ProjectFileWorkspace workspace)
            : base(lifetimeScope, dispatcher)
        {
            this.Receive <IncommingEvent>(e => e.Action());

            var last             = new RxVar <ProjectFile?>(null);
            var loadingOperation = new RxVar <OperationController?>(null);

            var self = Self;

            CenterView = this.RegisterViewModel(nameof(CenterView), model);
            workspace.Source.ProjectReset.RespondOn(null, pr => last.Value = pr.ProjectFile);

            #region Restarting

            Start.Subscribe(_ =>
            {
                if (last != null)
                {
                    Self.Tell(last);
                }
            });
            this.Receive <ProjectFile>(workspace.Reset);

            #endregion

            #region Operation Manager

            RunningOperations = RegisterProperty <IEnumerable <RunningOperation> >(nameof(RunningOperations))
                                .WithDefaultValue(operationManager.RunningOperations);
            RenctFiles = RegisterProperty <RenctFilesCollection>(nameof(RenctFiles))
                         .WithDefaultValue(new RenctFilesCollection(config, s => self.Tell(new InternlRenctFile(s))));

            NewCommad.WithExecute(operationManager.Clear, operationManager.ShouldClear()).ThenRegister("ClearOp");
            NewCommad.WithExecute(operationManager.CompledClear, operationManager.ShouldCompledClear())
            .ThenRegister("ClearAllOp");

            #endregion

            #region Save As

            IObservable <UpdateSource> SaveAsProject()
            {
                var targetFile = dialogFactory.ShowSaveFileDialog(null, true, false, true, "transp", true,
                                                                  localizer.OpenFileDialogViewDialogFilter, true, true, localizer.MainWindowMainMenuFileSaveAs,
                                                                  Directory.GetCurrentDirectory());

                return(targetFile.NotEmpty()
                       .SelectMany(CheckSourceOk)
                       .Where(d => d.Item1)
                       .Select(r => new UpdateSource(r.Item2)));
            }

            async Task <(bool, string)> CheckSourceOk(string source)
            {
                if (!string.IsNullOrWhiteSpace(source))
                {
                    return(true, source);
                }
                await UICall(()
                             => dialogCoordinator.ShowMessage(localizer.CommonError,
                                                              localizer.MainWindowModelLoadProjectSourceEmpty !));

                return(false, source);
            }

            NewCommad.WithCanExecute(last.Select(pf => pf != null && !pf.IsEmpty))
            .WithFlow(ob => ob.SelectMany(_ => SaveAsProject())
                      .ToModel(CenterView))
            .ThenRegister("SaveAs");

            #endregion

            #region Open File

            IDisposable NewProjectFile(IObservable <SourceSelected> source) => source
            .SelectMany(SourceSelectedFunc)
            .NotNull()
            .ObserveOnSelf()
            .Select(ProjectLoaded)
            .ToModel(CenterView !);


            this.Receive <InternlRenctFile>(o => OpentFileSource(o.File));

            IObservable <LoadedProjectFile?> SourceSelectedFunc(SourceSelected s)
            {
                if (s.Mode != OpenFileMode.OpenExistingFile)
                {
                    return(NewFileSource(s.Source));
                }
                OpentFileSource(s.Source);
                return(Observable.Return <LoadedProjectFile?>(null));
            }

            void OpentFileSource(string?rawSource)
            {
                Observable.Return(rawSource)
                .NotEmpty()
                .SelectMany(CheckSourceOk)
                .Select(p => p.Item2)
                .Do(_ => mainWindowCoordinator.IsBusy = true)
                .SelectMany(source => operationManager
                            .StartOperation(string.Format(localizer.MainWindowModelLoadProjectOperation,
                                                          Path.GetFileName(source)))
                            .Do(op => loadingOperation !.Value = op)
                            .Select(operationController => (operationController, source)))
                .Do(_ =>
                {
                    if (!workspace.ProjectFile.IsEmpty)
                    {
                        workspace.ProjectFile.Operator.Tell(ForceSave.Force(workspace.ProjectFile));
                    }
                })
                .ObserveOnSelf()
                .Subscribe(pair
                           => ProjectFile.BeginLoad(Context, pair.operationController.Id, pair.source,
                                                    "Project_Operator"));
            }

            SupplyNewProjectFile?ProjectLoaded(LoadedProjectFile obj)
            {
                try
                {
                    if (loadingOperation !.Value != null)
                    {
                        if (obj.Ok)
                        {
                            loadingOperation.Value.Compled();
                        }
                        else
                        {
                            loadingOperation.Value.Failed(obj.ErrorReason?.Message ?? localizer.CommonError);
                            return(null);
                        }
                    }

                    loadingOperation.Value = null;
                    if (obj.Ok)
                    {
                        RenctFiles !.Value.AddNewFile(obj.ProjectFile.Source);
                    }

                    last !.Value = obj.ProjectFile;

                    return(new SupplyNewProjectFile(obj.ProjectFile));
                }
                finally
                {
                    mainWindowCoordinator.IsBusy = false;
                }
            }

            NewCommad.WithCanExecute(loadingOperation.Select(oc => oc == null))
            .WithFlow(obs => NewProjectFile(obs.Dialog(this, TypedParameter.From(OpenFileMode.OpenExistingFile))
                                            .Of <IOpenFileDialog, string?>()
                                            .Select(s => SourceSelected.From(s, OpenFileMode.OpenExistingFile))))
            .ThenRegister("OpenFile");

            NewProjectFile(Receive <SourceSelected>()).DisposeWith(this);
            Receive <LoadedProjectFile>(ob => ob.Select(ProjectLoaded).ToModel(CenterView !));

            #endregion

            #region New File

            IObservable <LoadedProjectFile?> NewFileSource(string?source)
            {
                source ??= string.Empty;
                var data = new LoadedProjectFile(string.Empty,
                                                 ProjectFile.NewProjectFile(Context, source, "Project_Operator"), null, true);

                if (File.Exists(source))
                {
                    //TODO NewFile Filog Message
                    var result = UICall(async()
                                        => await dialogCoordinator.ShowMessage(localizer.CommonError !, "", null));

                    return(result.Where(b => b == true).Do(_ => mainWindowCoordinator.IsBusy = true).Select(_ => data));
                }

                mainWindowCoordinator.IsBusy = true;
                return(Observable.Return(data));
            }

            NewCommad.WithCanExecute(loadingOperation.Select(oc => oc == null))
            .WithFlow(obs => obs.Dialog(this, TypedParameter.From(OpenFileMode.OpenNewFile))
                      .Of <IOpenFileDialog, string?>()
                      .Select(s => SourceSelected.From(s, OpenFileMode.OpenNewFile))
                      .ToSelf())
            .ThenRegister("NewFile");

            #endregion

            #region Analyzing

            AnalyzerEntries = this.RegisterUiCollection <AnalyzerEntry>(nameof(AnalyzerEntries))
                              .BindToList(out var analyterList);

            var builder = new AnalyzerEntryBuilder(localizer);

            void IssuesChanged(IssuesEvent obj)
            {
                analyterList.Edit(l =>
                {
                    var(ruleName, issues) = obj;
                    l.Remove(AnalyzerEntries.Where(e => e.RuleName == ruleName));
                    l.AddRange(issues.Select(builder.Get));
                });
            }

            this.RespondOnEventSource(workspace.Analyzer.Issues, IssuesChanged);

            #endregion

            #region Build

            var buildModel = lifetimeScope.Resolve <IViewModel <BuildViewModel> >();
            buildModel.InitModel(Context, "Build-View");

            BuildModel = RegisterProperty <IViewModel <BuildViewModel> >(nameof(BuildModel)).WithDefaultValue(buildModel);

            #endregion
        }