140 lines
3.2 KiB
C#
140 lines
3.2 KiB
C#
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<int> 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<Unit, QuizModel> 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;
|
|
}
|
|
}
|
|
|