using ReactiveUI; using System; using System.Reactive.Linq; namespace EinmaleinsTrainer.ViewModels; public class MainWindowViewModel : ViewModelBase { private ViewModelBase _current; public ViewModelBase Current { get => _current; set => SetProperty(ref _current, value); } public readonly MainViewModel MainModel = new(); public readonly QuizViewModel QuizModel = new(); public readonly ResultViewModel ResultModel = new(); private readonly ViewModelBase _dummy = new(); public MainWindowViewModel() { MainModel.Init(); _current = MainModel; ResultModel.RestartCommand .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(result => { // In order to keep the last value if required int secondsPerQuestion = MainModel.SecondsPerQuestion; MainModel.Init(); if (result.TimeRequired != null) { MainModel.SecondsPerQuestion = (result.Score >= 10) ? (int)Math.Round(0.15 * result.TimeRequired.Value.TotalSeconds, 0, MidpointRounding.AwayFromZero) : secondsPerQuestion; MainModel.UseTimer = true; } Current = MainModel; }); QuizModel.Finished .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(result => { ResultModel.Init(result); Current = ResultModel; }); QuizModel.RedrawRequired += (s, a) => { Current = _dummy; Current = QuizModel; }; MainModel.StartCommand .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(quiz => { if (quiz.Questions.Count == 0) return; QuizModel.Init(quiz); Current = QuizModel; }); MainModel.RedrawRequired += (s, a) => { Current = _dummy; Current = MainModel; }; } }