using ReactiveUI; using System.Reactive; using EinmaleinsTrainer.Services; using EinmaleinsTrainer.Models; using System.Collections.ObjectModel; using System.Linq; using System.Reactive.Linq; using System; namespace EinmaleinsTrainer.ViewModels; public class MainViewModel : ViewModelBase { public ObservableCollection SelectedRows { get; } = new(); public event EventHandler? RedrawRequired; private bool _includeSquares; public bool IncludeSquares { get => _includeSquares; set => this.RaiseAndSetIfChanged(ref _includeSquares, value); } private bool _useTimer; public bool UseTimer { get => _useTimer; set { this.RaiseAndSetIfChanged(ref _useTimer, value); RedrawRequired?.Invoke(this, new()); } } private int _secondsPerQuestion = 0; public int SecondsPerQuestion { get => _secondsPerQuestion; set { if (value < 2) value = 2; if (value > 120) value = 120; this.RaiseAndSetIfChanged(ref _secondsPerQuestion, value); } } public ReactiveCommand StartCommand { get; } public MainViewModel() { StartCommand = ReactiveCommand.Create( execute: () => { var generator = new QuestionGenerator(); var questions = generator.Generate(SelectedRows.ToList(), IncludeSquares); return new QuizModel(){ Questions = questions, UseTimer = UseTimer, Seconds = SecondsPerQuestion}; }, canExecute: Observable.Return(true).ObserveOn(RxApp.MainThreadScheduler), outputScheduler: RxApp.MainThreadScheduler); } public void ToggleRow(int row, bool isChecked) { if (isChecked) SelectedRows.Add(row); else SelectedRows.Remove(row); } public bool IsRow1Checked { get => SelectedRows.Contains(1); set => ToggleRow(1, value); } public bool IsRow2Checked { get => SelectedRows.Contains(2); set => ToggleRow(2, value); } public bool IsRow3Checked { get => SelectedRows.Contains(3); set => ToggleRow(3, value); } public bool IsRow4Checked { get => SelectedRows.Contains(4); set => ToggleRow(4, value); } public bool IsRow5Checked { get => SelectedRows.Contains(5); set => ToggleRow(5, value); } public bool IsRow6Checked { get => SelectedRows.Contains(6); set => ToggleRow(6, value); } public bool IsRow7Checked { get => SelectedRows.Contains(7); set => ToggleRow(7, value); } public bool IsRow8Checked { get => SelectedRows.Contains(8); set => ToggleRow(8, value); } public bool IsRow9Checked { get => SelectedRows.Contains(9); set => ToggleRow(9, value); } public bool IsRow10Checked { get => SelectedRows.Contains(10); set => ToggleRow(10, value); } public void Init() { SelectedRows.Clear(); IncludeSquares = false; UseTimer = false; SecondsPerQuestion = 30; } }